tn.geologyidea.com
أكثر

اكتشف النقطة الواقعة بين خطين متوازيين

اكتشف النقطة الواقعة بين خطين متوازيين


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.


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

لدي ملف شكل نقطة مع سقوط بعض النقاط داخل شارع متعدد المسارات وبعضها في الخارج.

أرغب في إنشاء برنامج نصي ArcPy يجد النقاط التي تقع داخل شوارع Multi-Lane. أي بين هذه الخطوط المتوازية (الموضحة في الصورة).

لا أعرف كيف أحقق ذلك ، هل يستطيع أحد أن يساعدني؟

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

ولكن المشكلة الآن هي أن المضلع يعبر الخط فعليًا (أي يتداخل مع حدود المسارات المتعددة). لذلك سوف تلتقط النقاط غير الضرورية. هل هناك أي طريقة لمحاذاة هذا المضلع مع خط الشارع؟

ملاحظة: التكامل لن يعمل هنا ، لأنه يحرك خط الشارع أيضًا. أريد فقط محاذاة المضلع على طول خط الشارع.


سأحاول أدناه خوارزمية Arcpy (حتى اليدوية!)

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

أود أن أقول أن هذا تمرين هندسي.

كود مزيف:

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

كما يمكن للمرء أن يرى ، هناك حالات خاصة - نقاط سوداء محاطة بدائرة:

  1. ملتوية جدا 1 خط الطريق. يمكن التخلص من ذلك من خلال أ) العمل مع طرق ذات خطين فقط أو ب) التأكد من اختلاف معرفات FID للطرق التي تتقاطع مع النقطة الحمراء والنجمة. ومع ذلك ، إذا كان الطريق المنعطف يحتوي على تقاطع مع طريق آخر بخط واحد ، فقد لا ينجح ذلك.
  2. تقع النقطة السوداء على امتداد طريق خط عمودي واحد بالضبط. في هذه الحالة ، هناك فرصة لاختيار طريق حارة واحد كأقرب جار.
  3. النقطة السوداء تقع على الخط.

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

تطبيق بايثون:

استيراد arcpy ، traceback ، os ، sys من arcpy import env.overwriteoutput = صحيح # أشياء يمكن تغييرها --------- maxD = 30 mxd = arcpy.mapping.MapDocument ("CURRENT") pointLR = arcpy.mapping .ListLayers (mxd، "NODES") [0] lineLR = arcpy.mapping.ListLayers (mxd، "LINKS") [0] sjOneToMany = r'D:  scratch  sj2.shp 'RDNAME = "street" # - ----------------------- dDest = arcpy.Describe (lineLR) SR = dDest.spatialReference حاول: def showPyMessage (): arcpy.AddMessage (str (time .ctime ()) + "-" + message) g = arcpy.Geometry () geometryList = arcpy.CopyFeatures_management (pointLR، g) n = len (geometryList) endPoint = arcpy.Point () arcpy.SpatialJoin_analysis (pointLR، lineLR، sjOneToMany، "JOIN_ONE_TO_MANY"، "KEEP_COMMON"، ""، "WITHIN_A_DISTANCE"، maxD) initFidList = (- 1،) لـ fid في النطاق (n): TARGET_FID "=٪ s"٪ str (fid) nearTable = arcpy. .TableToNumPyArray (sjOneToMany، ("TARGET_FID"، "JOIN_FID")، استعلام) إذا كان len (nearTable) <2: continue fidLines = [int (row [1]) للصف في nearTable] FID "في٪ s"٪ str ( tuple (fidLines)) listOfLines = {} blackPoint = geometryLis t [fid] باستخدام arcpy.da.SearchCursor (lineLR، ("FID"، "Shape @"، "STREET")، الاستعلام) كصفوف: dMin = 100000 للصف في الصفوف: shp = row [1]؛ dCur = blackPoint.distanceTo (shp) listOfLines [row [0]] = row [-2:] if dCur

هناك حل آخر ممكن ربما يكون أكثر أناقة. إنها تنطوي على التثليث. اسمحوا لي أن أعرف ما إذا كان الأمر مثيرًا للاهتمام وسأحدِّث إجابتي


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

استيراد المجموعات استيراد arcpy FC = "fc" points = "Points" pgons = "pgons" arcpy.env.overwriteOutput = بنية def صحيح (oid_coords): # إنشاء مستند للنموذج OID: ddict = collections.defaultdict (list) لـ k، v في oid_coords: ddict [k] .append (v) line1، line2 = ddict.keys () # افترض أن الخطوط المتوازية لها نفس الاتجاه ، لذا قم بعكس السهم الثاني = arcpy .Array () arr.extend (arcpy.Point (* pt) لـ pt في ddict [line1]) arr.extend (arcpy.Point (* pt) لـ pt في ddict [line2] [:: - 1]) إرجاع arcpy .Polygon (arr) #id هو حقل عدد صحيح يزاوج الخطوط المتوازية معًا unique = list (set (t [0] for t in arcpy.da.SearchCursor (FC، "id"))) polygons = [] for uni in فريد: polygons.append (buildpoly ([r for r in row] للصف في arcpy.da.SearchCursor (FC، ["OID @"، "SHAPE @ XY"]، "id = {}". format (uni) ، explode_to_points = True))) arcpy.CopyFeatures_management (polygons، pgons)

من هناك ، إنها دعوة إلى Intersect / Select Layer حسب الموقع / ما لديك. نلاحظ أنسمضلع الشكل ليس مثاليًا لأنني رسمته يدويًا وهناك بعض الأقواس التيexplode_to_pointsلا يتعامل بشكل صحيح. فقط اركض تكثف أو ما يعادلها.


شاهد الفيديو: שאלות אינטגרטיביות בפונקציה קווית. מתמטיקה לכיתות ח