أكثر

لقطة مقابل تقاطع

لقطة مقابل تقاطع


كنت أشعر بالفضول لماذا كان قص ملفات الأشكال أمرًا صعبًا للغاية وما إذا كان مختلفًا عن ملفات الأشكال المتقاطعة؟

سترى من أحد أسئلتي أنني تخليت عن محاولة قص خط متعدد مع مضلع (هنا)

جربت طرقًا مختلفة مختلفة:

  1. ogr2ogr التحويل (بطيء جدًا)

    استيراد العملية الفرعية subprocess.call (["C:  Program Files  GDAL  ogr2ogr"، "-f"، "ESRI Shapefile"، "-clipsrc"، clipping_shp، output_shp، input_shp]) print ('Done!')
  2. SQL ogr (بطيء جدًا)

    من osgeo import ogr ogr.UseExceptions () ogr_ds = ogr.Open ('K: / compdata / OS_Shape_Files / os_open_roads / trim'، True) # Windows: r'C:  path  to  data 'start = time.clock ( ) طباعة ('البداية:') طباعة (ogr_ds) SQL = "" " SELECT ST_Intersection (A. Geometry، B. Geometry) AS geometry، A. *، B. * FROM ROADLINK_Project A، cut_se59ef_poly_60 B حيث ST_Intersects (A. geometry، B.geometry)؛ "" "layer = ogr_ds.ExecuteSQL (SQL، Dialect =" SQLITE ") # نسخ النتيجة إلى مصدر البيانات كطبقة ملف شكل جديد 2 = ogr_ds.CopyLayer (layer، 'h1_buf_int_ct3') # حفظ ، إغلاق layer = layer2 = ogr_ds = بلا طباعة ("انتهى في٪ .0f ثانية"٪ time.clock () - البداية)
  3. pyclipper (لا يمكن تشغيل هذا)

    الحل = pc.Execute2 (pyclipper.CT_INTERSECTION، pyclipper.PFT_NONZERO، pyclipper.PFT_NONZERO)
  4. rTree (لم أستطع الحصول على هذا العمل لأن لدي python 3.4)

    استيراد fiona من شكل استيراد shapely.geometry ، تعيين استيراد rtree bufSHP = production_poly_shape intSHP = 'K: / compdata / OS_Shape_Files / os_open_roads /trim/ROADLINK_Project.shp' ctSHP = 'output.shp' start = time.clock () بدءًا من ') بـ fiona.open (bufSHP،' r ') كـ layer1: مع fiona.open (ctSHP،' r ') كـ layer2: # نقوم بنسخ المخطط وإضافة الخاصية الجديدة لمخطط shp الناتج الجديد = layer2.schema .copy () schema ['properties'] ['uid'] = 'int: 10' # نفتح أول shp فارغ لكتابة محتوى جديد من كلا الآخرين shp باستخدام fiona.open (intSHP، 'w'، 'ESRI Shapefile '، schema) كـ layer3: index = rtree.index.Index () لـ feat1 في layer1: fid = int (feat1 [' id ']) geom1 = الشكل (feat1 [' geometry ']) index.insert (fid، geom1 .bounds) لـ feat2 في layer2: geom2 = شكل (feat2 ['geometry']) في القائمة (index.intersection (geom2.bounds)): if fid! = int (feat2 ['id']): feat1 = layer1 [fid] geom1 = الشكل (feat1 ['geometry']) إذا geom1.intersects (geom2): # نأخذ سمات من ctSHP props = feat2 ['properties'] # ثم قم بإلحاق السمة uid التي نريدها من خصائص shp الأخرى ['uid'] = feat1 ['properties'] ['uid'] # أضف المحتوى إلى المخطط الصحيح في shp layer3.write الجديدة ({'الخصائص' : props، 'geometry': mapping (geom1.intersection (geom2))}) print ("Finished in٪ .0f seconds"٪ time.clock () - start)

أخيرًا ، نظرت إلى هذا ولكن لم أتمكن من تشغيله مع Python 3.4.

ثم في R حاولت:

  1. g تقاطع (x، y، byid = TRUE)

  2. الفرق g

  3. مخصصgClipالأمر الذي وجدته على الإنترنت

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

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

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

لست بحاجة إلى الاحتفاظ بأي ميزات يوفرها التقاطع مجرد مقطع مستقيم. أعتقد أنني لا أحتاج أيضًا إلى ملفات الأشكال بشكل صارم ويمكنني تحويل شبكة الطرق في المملكة المتحدة سعة 500 ميجابايت إلى قاعدة بيانات جغرافية؟


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

يُنشئ الكود أدناه مضلعًا تقريبيًا من النقاط التي يمكن الوصول إليها في غضون X دقيقة (عن طريق التخزين المؤقت) ؛ يتقاطع معها بشبكة طرق ؛ ثم يخزن شبكة الطرق بشكل طفيف لإنشاء توازن متساوٍ لطيف. (الشيء الوحيد الذي أود إضافته هو طريقة للانضمام إلى المضلعات على طول الطريق)

ولدت هذه المباراة ArcGIS متساوي الزمان بشكل جيد:

استيراد عملية فرعية استيراد fiona من shapely.geometry import Point، mapping، shape، MultiLineString، MultiPolygon، Polygon، LineString من shapely.ops استيراد unary_union من fiona.crs الاستيراد من_epsg # Projections: # من pyproj import Proj ، تحويل # wgs84 = Proj (" + init = EPSG: 4326 ") # LatLon مع بيانات WGS84 المستخدمة بواسطة وحدات GPS و Google Earth # osgb36 = Proj (" + init = EPSG: 27700 ") # UK Ordnance Survey، 1936 datum # original = Proj (init = 'EPSG : 4326 ') # destination = Proj (init =' EPSG: 4326 ') # إنشاء ملف شكل من Intersected # Note حاول استخدام ديكتريدر pts = [] مع open (production_csv_file) كـ f: لـ x في csv.reader (f) : # Lat، Lng، Minutes واحتفظ بهذه النقاط داخل if float (x [2]) <= float (period): # Shapely: pts.append (Point (# transform (original، destination، float (x [1]) ، float (x [0])) float (x [1])، float (x [0]))) # Buffer (قسمة التباعد على 100) # Buffer + 10٪ buffer = [point.buffer (1.1 * float ( RADIUS_KM) ​​/ 100) للنقطة في النقاط] # Union merged = unary_union (buffer) # إزالة الثقوب الخارج_polys = [] بالنسبة إلى poly_l المدمج: external_polys.append (Polygon (poly_l.exterior)) merged = MultiPolygon (external_polys) # احفظ مخطط ملف الشكل المؤقت = {'geometry': 'Polygon'، 'Properties': {'id ':' int '}،} مع fiona.open (production_poly_shape، "w"، driver = "ESRI Shapefile"، crs = from_epsg (4326)، schema = schema) كإخراج: output.write ({' geometry ': mapping (مدمجة)، "الخصائص": {'id': 123}}) # Bounds bounds = merged.bounds x_min = '٪ .5f'٪ bounds [0] x_max = '٪ .5f'٪ bounds [2] y_min = '٪ .5f'٪ bounds [1] y_max = '٪ .5f'٪ bounds [3] print (x_min، x_max، y_min، y_max) # Clip باستخدام GDAL # http://www.gisinternals.com/release.php print ("Generation Time to Rough Shapefile:٪ .0f seconds"٪ (time.clock () - start)) print ("Beginning Clip") start = time.clock () # تأكد من احتواء ملف الشكل على فهرس #ogrinfo "… /ROADLINK_Project.shp" -sql "إنشاء فهرس مكاني على ROADLINK_Project" subprocess.call (["C:  Program Files  GDAL  ogr2ogr"، "-f"، "ESRI Shapefile"، "-spat"، x_min، y_min ، x_max ، y_max ، "-clipsrc" ، المنتج uce_poly_shape، temporary_poly_shape، my_roads_shape]) print ('Clipped in٪ .0f seconds'٪ (time.clock () - start)) road_lines = ([الشكل (pol ['geometry']) للقطب في fiona.open (temporary_poly_shape) ]) عازلة = [] # عازلة + 10٪ للطريق في road_lines: buffer.append (road.buffer (1.1 * float (RADIUS_KM) ​​/ 100)) # Union merged = unary_union (buffer) # إزالة الثقوب الخارج_polys = [] من أجل poly_l مدمج: outside_polys.append (Polygon (poly_l.exterior)) مدمج = مضلع متعدد (external_polys) # حفظ مخطط ملف الشكل النهائي = {'geometry': 'Polygon'، 'properties': {'id': 'int '}، مع fiona.open (final_poly_shape، "w"، driver = "ESRI Shapefile"، crs = from_epsg (4326)، schema = schema) كإخراج: output.write ({' geometry ': mapping (merged)، 'الخصائص': {'id': 123}}) طباعة ('Complete! إجمالي الوقت المستغرق:٪ .0f '٪ (time.clock () - total_start))

ساعدني @ user30184 على إحراز تقدم جيد وأريد مشاركة نتائجي.

أحفظ حدود مضلع المقص الصغير الخاص بي:

# Bounds bounds = merged.bounds x_min = '٪ .5f'٪ bounds [0] x_max = '٪ .5f'٪ bounds [2] y_min = '٪ .5f'٪ bounds [1] y_max = '٪ .5f' ٪ حدود [3]

ثم قم بتشغيل الأمر التالي:

subprocess.call (["C:  Program Files  GDAL  ogr2ogr"، "-f"، "ESRI Shapefile"، "-spat"، x_min، y_min، x_max، y_max، "-clipsrc"، clipping_shp، output_shp، input_shp ])

تحديد --spat -> هذا يجعل الأمر الخاص بي أسرع (مزيد من التفاصيل أدناه).

حاولت أيضًا إنشاء فهرس:

ogrinfo "… /ROADLINK_Project.shp" -sql "إنشاء فهرس مكاني على ROADLINK_Project"

ومع ذلك ، لم ألاحظ أي تحسن في السرعة. أعتقد أن هذا لأنني أنشأت الشكل باستخدام ArcGIS وبالتالي يستخدم ogr2ogr مؤشر ArcGIS. لذلك أجريت بعض التجارب (.shp الخاص بي هو 504 ميجابايت ، ومؤشر arcGIS الخاص بي .shx هو 24 ميجابايت ومؤشر quadtree. qix الخاص بي هو أيضًا حوالي 25 ميجابايت ... لم أكن متأكدًا مما يجب تعيين مستوى العودية عليه ، ولذلك استخدمت المستوى الافتراضي)

1) إزالة جميع ملفات الفهرس وإضافة الفهرس الافتراضي باستخدام ogrinfo الذي يستغرقه 592 ثوانٍ لتقاطع ملف أشكال لطرق المملكة المتحدة بسعة 500 ميغا بايت مع مضلع 5 ميغا بايت باستخدام الأمر ogr2ogr

2) يتطلب الأمر استخدام ArcGIS 56 ثواني لأداء تقاطع

3) يتطلب الأمر استخدام ArcGIS 105 ثواني لأداء مقطع

4) إذا قمت بإزالة ملف الفهرس وأعدت تشغيل الأمر ogr2ogr ، فسيستغرق الأمر 621 ثواني (لذلك يبدو أن ملف الفهرس يوفر لي 30 ثانية).


شاهد الفيديو: أقوي مشاهد الأكشن في مسلسل هوجان - محمد عادل إمام. Hogan Series - Mohammed Adel Emam