أكثر

نسخة pyQGIS من نرد أداة arcgis

نسخة pyQGIS من نرد أداة arcgis


أنا أستخدم QGIS ولدي بعض الميزات الكبيرة التي يجب تقطيعها إلى ميزات ذات رؤوس أقل.

إذا كنت أستخدم ArcGIS يمكنني استخدام أداة النرد

إذا كنت مهتمًا فقط بالخطوط ، فيمكنني دمج حل mapplus هنا

هل هناك أداة مكافئة يمكنني كتابتها في pyQGIS؟


نعم فعلا. ها هي وظيفة بيثون التي كتبتها ، والتي تقوم بالمهمة. تأخذ الوظيفة كمدخلاتها: طبقة للنرد ، واسم طبقة المخرجات ، والحد الأقصى لعدد الرؤوس لكل معلم. ثم تحتفظ ميزات المخرجات أيضًا بسماتها الأصلية ولا تحتوي أي ميزات في طبقة المخرجات على عدد من الرؤوس أكبر من الحد الذي تم تمريره إلى الوظيفة.

لم يتم تحسين هذا للسرعة ويحتوي على بعض أوجه القصور ولكنه يعمل مع طبقات المضلع والطبقات متعددة الخطوط. ستحتاج إلى تحويل طبقات "متعددة" قبل تشغيلها.

تم اختباره على أنه يعمل على كل من طبقات المضلع والخط.

def dice (input_layer، destination_title، max_vertices): استيراد numpy من PyQt4.QtCore import * my_WkbType = {'WKBUnknown': 0، 'WKBPoint': 1، 'WKBLineString': 2، 'WKBPolygon': 3، 'WKBMultiPoint': 3 ، 'WKBMultiLineString': 5، 'WKBMultiPolygon': 6، 'WKBNoGeometry': 7، 'WKBPoint25D': 8، 'WKBLineString25D': 9، 'WKBPolygon25D': 10، 'WKBMultiPoint25D': WKBMultiPolygon25D ': 13} my_rev_WkbType = {v: k for k، v في my_WkbType.items ()} QGisWKBType = input_layer.dataProvider (). : dice_safe_type = صحيح إذا لم يكن dice_safe_type: رفع ValueError ("لقد قدمت" + my_rev_WkbType [QGisWKBType] [3:] + "طبقة وتعمل هذه الوظيفة فقط على طبقات Polygon أو LineString") EPSG_code = int (input_layer.dataProvider (). crs (). authid (). split (":") [1]) destination_layer = QgsVectorLayer (my_rev_WkbType [QGisWKBType] [3:] + '؟ crs = epsg:' + str (EPSG_code) + '& index = yes'، destination_t itle، 'memory') # QgsMapLayerRegistry.instance (). addMapLayer (destination_layer) إذا لم يكن destination_layer.isValid (): lift ("فشل إنشاء طبقة ذاكرة") # إضافة حقول سمة input_layer input_layer_attrib_names = input_layer.dataProvider (). الحقول () ) oldattributeList = input_layer.dataProvider (). الحقول (). toList () newattributeList = [] للسمة في oldattributeList: if destination_layer.fieldNameIndex (attrib.name ()) == - 1: newattributeList.append (QgsField (attrib.name) () ، attrib.type ())) destination_layer.dataProvider (). addAttributes (newattributeList) destination_layer.updateFields () destination_layer_attribute_list = destination_layer.dataProvider (). destination_layer.startEditing () cfeatures = [] xfeatures = input_layer.getFeatures () لـ xfeature in xfeatures: gorzirras = [] diced = [] dice_this_feature = False xgeometry = xfeature.geometry () slices = 1 if QGisWKBType_list == 2: xgeometry.asPolyline () إذا كان len (line_as_list)> max_verti ces: gorzirras.append (xgeometry) else: diced.append (xgeometry) while len (gorzirras)> 0: gorzirra = gorzirras.pop () line_as_list = gorzirra.asPolyline () dice_left_geometry = QgsGeometry.f diced.append (dice_left_geometry) dice_right_geometry = QgsGeometry.fromPolyline (line_as_list [(max_vertices-1):]) if len (line_as_list) -max_vertices + 1> max_vertices: gorzirras.appryiced (dice) == 3: الحلقات = xgeometry.asPolygon () no_vertices = 0 للحلقة في الحلقات: no_vertices = no_vertices + len (ring) if no_vertices> max_vertices: gorzirras.append (xgeometry) else: diced.append (xgeometry) while len (gorzirras) )> 0: الشرائح + = 1 gorzirra = gorzirras.pop () # تحديد بُعد أطول لتقسيم bbox_rectangle = gorzirra.boundingBox () xmax = bbox_rectangle.xMaximum () ymax = bbox_rectangle.yMaximum () xmin = bbox_imumangle (yMaximum () xmin = bbox_imumangle ).xMin bbox_rectangle.y الحد الأدنى () dice_X = صحيح إذا (ymax-ymin)> (xmax-xmin): dice_X = False #Locate median vertex v alue of long length ring_list = gorzirra.asPolygon () val_list = [] للحلقة في ring_list: للقمة في الحلقة: if dice_X: val_list.append (vertex.x ()) else: val_list.append (vertex.y ()) median_val = numpy.median (numpy.array (val_list)) if dice_X: dice_left_geometry = QgsGeometry.fromPolygon ([[ QgsPoint (xmin، ymin)،  QgsPoint (xmin، ymax)،  QgsPoint (median_val، Qgs) (median_val، ymin)]]) dice_right_geometry = QgsGeometry.fromPolygon ([[ QgsPoint (median_val، ymin)،  QgsPoint (median_val، ymax)،  QgsPoint (xmax، ymax)،  QgsPoint (xmax)]، ymin) else: dice_left_geometry = QgsGeometry.fromPolygon ([[ QgsPoint (xmin، ymin)،  QgsPoint (xmin، median_val)،  QgsPoint (xmax، median_val)،  QgsPoint (xmax، ymin)]]) dice_gsrom_geometry = [[ QgsPoint (xmin، median_val)،  QgsPoint (xmin، ymax)،  QgsPoint (xmax، ymax)،  QgsPoint (xmax، median_val)]]) #Carry out intersections left_diced = (gorzirra.intersection (dice_left_geometry)) .asGeometryCollection () right_diced = (gorzirra.interse ction (dice_right_geometry)). asGeometryCollection () diced_list = left_diced + right_diced for diced_geometry in diced_list: rings = diced_geometry.asPolygon () no_vertices = 0 for ring in ring: no_vertices = no_vertices> no_vertices = no_vertices> no_vertices = no_vertices> no_vertices (diced_geometry) else: #if not diced_geometry.isGeosEmpty (): diced.append (diced_geometry) #Create destination features for ngeometry in diced: #print ngeometry.area () cfeature = QgsFeature () cfeature.setGeometry (ngeometry feature) #Peature.setGeometry (ngeometry feature) #Peature.setGeometry (ngeometry) # مع السمات cfeature_Attributes = [] for destination_QGSfield في destination_layer_attribute_list: attribute_field = destination_QGSfield.name () attr_still_to_append = صحيحًا # احصل على قيمة سمة قديمة وألحق idx = input_layer.fieldNameIndex (attribute_field) if idx> = 0: cttributes ) [idx]) attr_still_to_append = خطأ # قم بإضافة Null إلى أي سمات غير موجودة إذا attr_still_to_append: cfeature_Attributes.append (بلا) cfeature.setAttributes (cfeature_Attribut es) cfeatures.append (cfeature) destination_layer.dataProvider (). addFeatures (cfeatures) destination_layer.commitChanges () destination_layer.updateExtents () QgsMapLayerRegistry.instance ().

مثال بسيط يوضح استخدام أداة النرد pyQGIS:

import os shape_path = "/ path / to / my / shape / file.shp" gorzirra_layer = QgsVectorLayer (shape_path، "Gorzirra_layer"، "ogr") QgsMapLayerRegistry.instance (). addMapLayer (gorzirra_exlim) diced_title = " 255 طبقة مكعبة = نرد (gorzirra_layer، diced_title، vertex_limit)

شاهد الفيديو: استخدم Python لاستخراج بيانات Twitter من MongoDB إلى ArcGIS