أكثر

أقصر مسار من نقاط في طبقة واحدة إلى نقاط في طبقة أخرى عبر الطرق في QGIS

أقصر مسار من نقاط في طبقة واحدة إلى نقاط في طبقة أخرى عبر الطرق في QGIS


أبحث عن طريقة لحساب أقصر مسار من العناوين إلى محطات مترو الأنفاق عبر شبكة من الطرق.

لدي المكوِّن الإضافي Road Graph ، ومع ذلك ، فإن العناوين ومحطات مترو الأنفاق عبارة عن طبقات نقطية لا تتداخل مع الرؤوس في طبقة الطرق.

في QGIS ، هل هناك طريقة لحساب أقصر مسافة من نقاط العنوان / محطة مترو الأنفاق إلى الطرق ، وإنشاء قمم في تلك المواقع ، ثم حساب أقصر مسافة عبر شبكة الطرق؟

  • المربعات السوداء - العناوين
  • دوائر بيضاء - توقف مترو الانفاق
  • خطوط رمادية - طرق


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

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

 ## أدوات التوجيه = مجموعة ## نقاط = نقطة متجه ## شبكة = خط متجه ## مسار = خط متجه ناتج من PyQt4.QtCore استيراد * من PyQt4.QtGui استيراد * من استيراد qgis.core * من استيراد qgis.gui * من qgis.networkanalysis استيراد * من Processing.tools.vector استيراد VectorWriter point_layer = Processing.getObject (نقاط) network_layer = Processing.getObject (شبكة) كاتب = VectorWriter (مسار ، بلا ، [QgsField ("الترتيب" ، QVariant.Int)] ، network_layer.dataProvider (). geometryType ()، network_layer.crs ()) # تحضير الرسم البياني vl = network_layer Director = QgsLineVectorLayerDirector (vl، -1، "،"، "، 3) rightter = QgsDistanceArcProperter () manager.addProperter (rightter) crs = vl.crs () builder = QgsGraphBuilder (crs) # تحضير ميزات النقاط = Processing.features (point_layer) point_count = point_layer.featureCount () points = [] for in features: points.append (f.geometry (). asPoint ()) tiedPoints = Director.makeGraph (باني ، نقاط) رسم بياني = builder.graph () route_vertices = [] لـ i في النطاق (0 ، p oint_count-1): progress.setPercentage (int (100 * i / point_count)) from_point = tiedPoints [i] to_point = tiedPoints [i + 1] from_id = graph.findVertex (from_point) to_id = graph.findVertex (to_point) (شجرة ، cost) = QgsGraphAnalyzer.dijkstra (رسم بياني ، from_id ، 0) إذا كانت الشجرة [to_id] == -1: تابع # تجاهل زوج النقاط هذا وإلا: # اجمع كل النقاط بين نقاط route_points = [] curPos = to_id while (curPos ! = from_id): route_points.append (graph.vertex (graph.arc (tree [curPos]) .inVertex ()) .point ()) curPos = graph.arc (tree [curPos]) .outVertex () route_points.append (from_point) # add a feature fet = QgsFeature () fet.setGeometry (QgsGeometry.fromPolyline (route_points)) fet.setAttributes ([i]) 

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

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

ستحتاج إلى تعديل سمات متجه النقطة ، لكل من الوصول (مدخل مترو الأنفاق) وطبقات الراحة (العناوين) ، عن طريق إضافة عمود يسمى "acam_id" يحتوي على رقم تعريف فريد لكل نقطة.

# تعريف المدخلات والمخرجات # =================================== ## أدوات التوجيه = مجموعة ## وصول = نقطة متجه ## وسائل الراحة = نقطة متجه ## شبكة = خط متجه ## مسافة = رقم 1600 ## المسارات = خط متجه الإخراج # جسم الخوارزمية # ================== ================ من PyQt4.QtCore استيراد * من PyQt4.QtGui استيراد * من qgis.core استيراد * من qgis.gui استيراد * من qgis.networkanalysis استيراد * من Processing.tools .vector import VectorWriter استيراد معالجة التقدم. ("acc_id"، QVariant.Int)، QgsField ("amen_id"، QVariant.Int)، QgsField ("length"، QVariant.Double)]،  network_layer.dataProvider (). geometryType ()، network_layer.crs ()) # إعداد الرسم البياني vl = network_layer Director = QgsLineVectorLayerDirector (vl، -1، "،"، "3) السليم = QgsDistanceArcProperter () manager.ad () point_count = access_count + features_count points = [] ids = [] لـ f في ميزات access_features: Points.append (f.geometry (). asPoint ()) ids.append (f ['acam_id']) للحصول على f في الميزات_المزايا: النقاط. إلحاق (f.geometry (). asPoint ()) ids.append (f ['acam_id']) tiedPoints = Director.makeGraph (منشئ ، نقاط) رسم بياني = builder.graph () route_vertices = [] progress.setText ("معالجة المسارات ... ") لـ i في النطاق (0 ، access_count): progress.setPercentage (int (100 * i / access_count)) from_point = tiedPoints [i] from_id = graph.findVertex (from_point) (الشجرة ، التكلفة) = QgsGraphAnalyzer.dijkstra (رسم بياني ، from_id ، 0) لـ j في النطاق (access_count ، point_count): to_point = tiedPoints [j] to_id = graph.findVertex (to_point) إذا كانت الشجرة [to_id]! = - 1 و (التكلفة [to_id] <= المسافة أو المسافة <= 0): # اجمع كل النقاط بين نقطتي route_points = [] curPos = to_id while (curPos! = from_id): route_points.append (graph.vertex (رسم بياني. arc (tree [curPos]) .inVertex ()) .point ()) curPos = graph.arc (tree [curPos]) .outVertex () route_points.append (from_point) # add a feature fet = QgsFeature () fet.setGeometry (QgsGeometry.fromPolyline (route_points)) fet.setAttributes ([id [i]، ids [j]، cost [to_id]])

شاهد الفيديو: QGIS Calculate Overlapping Areas u0026 Topology