أكثر

عد النقاط في المضلع باستخدام PyQGIS


هل هناك أي تكامل بسيط لحساب عدد النقاط في المضلع باستخدام تكامل QGIS-Python؟

بمعنى آخر ، هل هناك أي وظائف محددة مسبقًا للنقاط في مضلع QGIS باستخدام Python ، حتى نتمكن من استخدامها في نص Python الخاص بنا؟


طرق رائعة نشرت بالفعل! هناك أيضًا أدوات من صندوق أدوات المعالجة التي يمكنك الاتصال بها من البرنامج النصي الخاص بك (هذا على افتراض أنك تقوم بتشغيل البرامج النصية داخل QGIS):

  • عد النقاط في المضلع
  • تحسب النقاط في المضلع (مرجح)
  • عد النقاط الفريدة في المضلع

باستخدام الأداة الأولى ، يمكنك تسميتها باستخدام:

نتيجة معالجة الاستيراد = "path  to  save_output.shp" Processing.runalg ("qgis: countpointsinpolygon"، "path  to  polygon_layer.shp"، "path  to  point_layer.shp"، 'NUMPOINTS'، النتيجة)

أيننقاطهو اسم الحقل الذي يخزن عدد النقاط.

أنا أستخدم QGIS 2.8.2-Wien ، المكوّن الإضافي لمعالجة الإصدار 2.9.3. أتمنى أن يساعدك هذا!


أعدت كتابة إجابتي من سؤال موازٍ لنقاط العد في ميزة الأطلس الحالي: كيف أحسب النقاط ضمن ميزة Print composer atlas الحالية في QGIS 2.8؟

أنشئ وظيفة جديدة في محرر التعبير:

من qgis.core استيراد * من qgis.gui استيراد * من qgis.utils استيراد ifaceqgsfunction (args = "auto" ، group = "Custom") def countPointsInPolygon (pointLayerName، geom، feature، original): # إذا كانت النقطة الجغرافية هي فارغ ، قم بإرجاع 0 إذا (geom is None): إرجاع 0 # الحصول على مرجع طبقة النقطة من اسم الطبقة pointLayer = QgsMapLayerRegistry.instance (). mapLayersByName (pointLayerName) [0] # Raise إذا لم يتم العثور على الطبقة إذا كانت pointLayer هي بلا: رفع استثناء (" لم يتم العثور على الطبقة: "+ pointLayerName) # نقطة العد ضمن ميزة المضلع الحالية countPoint = 0 لـ pointFeature في pointLayer.getFeatures (): pointGeom = pointFeature.geometry () if (pointGeom is None): تابع إذا pointGeom.within (geom): countPoint + = 1 نقطة العد العودة

استخدمه كتعبير على طبقة المضلع حيث "النقاط الرئيسية" هي اسم طبقة النقطة:countPointsInPolygon ("نقاط mypoints" ، $ الهندسة)

إذا كنت لا ترغب في تنفيذها كتعبير ، يمكنك استدعاء الوظيفة من البرنامج النصي الخاص بك لتكرار ميزات طبقة المضلع التي تستدعي countPointsInPolygon لكل ميزة.


أبسط طريقة هي استخدام "سمة الانضمام حسب الموقع". يمكنك القيام بذلك من القائمة (إدارة البيانات> الانضمام حسب الموقع) ، أو باستخدام Python ("qgis: Joinbylocation") مع الخيار "أخذ ملخص الميزات المتقاطعة" ، وحساب مجموع الحقل مع "1" في كل نقطة .


لم أعمل مطلقًا مع Python API الخاص بـ QGIS ، لذا فإن جوابي هو تخمين جامح. لكن يبدو أن QGIS يستخدم كائنات هندسية GEOS مشابهة لـ django. لذلك يمكن أن يعمل هذا في QGIS أيضًا:

لين (geom.coords)

أفترض أن المضلع الخاص بك هو ميزة qgs:

http://qgis.org/api/classQgsFeature.html

لم أختبرها ولكن أعتقد أنها ستنجح:

لين (polygon.geometry (). asPolygon ())

يعطي polygon.geometry () فئة qgsgeometry.

يعطي qgsgeometry.asPolygon () قائمة بنقطة المضلع.

تحرير: هل تريد النقاط داخل المضلع؟ لديك نقاط في طبقة أخرى وتتساءل أي منها يتقاطع مع مضلعك؟