أكثر

QGIS نمط حافة المضلع على أساس الميزة المجاورة؟


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

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

يمكنني زيادة سماكة الخط للميزة المجاورة بحيث تغطي الميزة الموجودة تحتها بالكامل (في الصورة المثال ، يبلغ سمكها ضعف سمكها بالفعل) ، ولكنها تبدأ بعد ذلك أيضًا في تغطية الجزء الداخلي من ذلك المضلع. يمكنني أيضًا التحويل إلى خطوط متعددة وقص الخط الساحلي ، لكن بعد ذلك أفقد الهندسة. أعتقد أن ما أحتاجه حقًا هو طريقة لمنع عرض الحدود من جانب واحد ، وفقط تغطيتها بشيء آخر لا ينجح.


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

البرنامج النصي التالي قد يساعد. إنه يحاكي نوعًا من عملية بناء الطوبولوجيا. يأخذ في الاعتبار أن المضلع المجاور قد لا يتم ترقيمه في نفس الاتجاه. في النتيجة ، يحتوي كل مقطع على سمات مع معرفات المعالم للمضلع الأيمن والأيسر. يمكن استخدام هذه القيم لإنشاء صلة بجدول البيانات الجدولية للمضلعات. إذا كنت تريد إذابة المقاطع إلى خطوط مستمرة ، فاستخدم أداة الإذابة من مجموعة أدوات المعالجة. لهذا لإنشاء نتائج مفيدة ، يجب مراعاة دمج السماتlpolyوrpolyإلى سمة مركبة ، واستخدمها في عملية الذوبان.

من PyQt4.QtCore استيراد QVariant layer = iface.activeLayer () segments = {} j = 0 للعمل في layer.getFeatures (): # polylines line = feat.geometry (). asPolygon () [0] لـ i في xrange ( len (line) -1): lsegment = ((line [i] [0]، line [i] [1])، (line [i + 1] [0]، line [i + 1] [1]) ) rsegment = ((السطر [i + 1] [0] ، السطر [i + 1] [1]) ، (السطر [i] [0] ، السطر [i] [1])) إذا كان الجزء في المقاطع: إذا المقاطع [lsegment] ['lpoly'] == -9999: المقاطع [lsegment] ['lpoly'] = feat.id () شرائح elif [lsegment] ['rpoly'] == -9999: الشرائح [lsegment] [' rpoly '] = feat.id () elif rsegment في المقاطع: إذا كانت الشرائح [rsegment] [' lpoly '] == -9999: المقاطع [rsegment] [' lpoly '] = feat.id () شرائح elif [rsegment] [ 'rpoly'] == -9999: المقاطع [rsegment] ['rpoly'] = feat.id () else: segments [lsegment] = {'lpoly': feat.id ()، 'rpoly': -9999، ' fid ': j} j + = 1 layer = QgsVectorLayer (' LineString؟ crs = EPSG: 4326 '،' Result '،' memory ') prov = layer.dataProvider () سمات = [QgsField (' fid '، QVariant.Int ) ، QgsField ('lpoly' ، QVariant.Int) ، QgsField ('rpoly' ، QVariant.Int) ، QgsField ('length'، QVariant.Double)] prov.addAttributes (سمات) QgsMapLayerRegistry.instance (). addMapLayer (layer) # create features feats = [] layer.startEditing () للمقطع في المقاطع: feat = QgsFeature () الرؤوس = [QgsPoint (مقطع [0] [0] ، مقطع [0] [1]) ، QgsPoint (مقطع [1] [0] ، مقطع [1] [1])] سمات = [مقاطع [مقطع] [' fid '] ، المقاطع [المقطع] [' lpoly '] ، المقاطع [المقطع] [' rpoly ']] feat.setGeometry (QgsGeometry.fromPolyline (الرؤوس)) الصفات. إضافة (feat.geometry (). length ()) feat .setAttributes (attributes) feats.append (feat) prov.addFeatures (feats) layer.updateExtents () layer.commitChanges ()

مثال: المضلعات ، معنونة بالمعرف ()

حدود المضلعات ، المسمى بـ lpoly فوق rpoly


شاهد الفيديو: QGIS + GeoServer. Layer publishing (شهر اكتوبر 2021).