Lebih banyak lagi

Membuat geometri poligon menggunakan tatasusunan titik

Membuat geometri poligon menggunakan tatasusunan titik


Saya menghuraikan fail gpx OpenStreetMap yang saya eksport dari sini. Saya cuba memasukkan data ke dalam kelas ciri geodatabase arcgis. Sebilangan ciri dalam gpx adalah titik (disimpan sebagai wpt), sementara yang lain adalah poligon (disimpan sebagai trk yang terdiri daripada trkpt). Dengan menggunakan skrip di bawah ini, saya berjaya menyalin poin, geometri mereka, nama dan atribut yang saya mahukan. Walau bagaimanapun, membuat geometri tidak berfungsi untuk poligon, walaupun atributnya disalin tanpa masalah (saya meninggalkan sedikit kod untuk atribut daripada contoh di bawah). Saya menjumpai soalan ini yang mendorong saya untuk membina poligon dengan titik-titik yang disusun sebaliknya. Bagaimanapun ini tidak berjaya. Saya membuat beberapa pernyataan cetak untuk memeriksa di mana ia salah, lihat cetakan di bawah. Tidak juga percetakan itupoli.areakeputusan dalam0.0, percetakanpoly.trueCentroidkeputusan dalamTiada, dll. Oleh itu poligon tidak dihasilkan dari tatasusunan. Bagi saya nampaknyapoly = arcpy.Poligon (ar)hanya tidak berfungsi.

Contoh GPX:

 Ian Brown Motors nama = Ian Brown Motors shop = car_repair   Kedai Kunci Brodie's Minimarket bangunan = nama ya = Kunci Kedai Minimarket Brodie's Minimarket = 08: 00-18: 00 kedai = sumber pasar raya = tinjauan       

Skrip:

dari xml.etree import ElementTree as Et import os import arcpy arcpy.env.overwriteOutput = 1 wgs = arcpy.SpatialReference (r'C:  Program Files  ArcGIS  Desktop10.0  Coordinate 'r'Systems  Geographic Coordinate Systems  World  WGS 'r'1984.prj') gdb = PATH_TO_GDB f = PATH_TO_GPX all_records = [] p = Et.parse (f) root = p.getroot () arcpy.CreateFeatureclass_management (gdb, 'shops_pt', 'POINT', 'POINT' = wgs) arcpy.CreateFeatureclass_management (gdb, 'shops_pl', 'POLYGON', spatial_reference = wgs) shops_pt = os.path.join (gdb, 'shops_pt') shops_pl = os.path.join (gdb, 'shops_pl') untuk fc di [shops_pt, shops_pl]: arcpy.AddField_management (fc, 'name', 'TEXT', 255) arcpy.AddField_management (fc, 'type', 'TEXT', 50) arcpy.AddField_management (fc, 'opening_hours', 'TEXT', 255) ic_pt = arcpy.InsertCursor (shops_pt) ic_pl = arcpy.InsertCursor (shops_pl) for mainElement dalam root: if mainElement.tag == 'metadata': teruskan jika mainElement.tag == 'wpt': r = ic_pt.newRow () y = terapung (mainElement.attrib ['lat']) x = float (mainElement.attrib ['lon']) p = arcpy.Point (x, y) r.shape = p ic_pt.insertRow (r) elif mainElement.tag == 'trk': r = ic_pl.newRow () untuk subElement in mainElement: if subElement.tag == 'trkseg': ar = arcpy.Array () untuk trkpt dalam subElement: y = float (trkpt.attrib ['lat']) x = float (trkpt.attrib ['lon ']) p = arcpy.Point (x, y) print p ar.add (p) print' array array ', len (ar) print' ar [0] ', ar.getObject (0),' ar [- 1] ', ar.getObject (len (ar) -1) poly = arcpy.Polygon (ar) r.shape = poly print' poly.centroid try 1 ', poly.centroid jika poly.centroid Tiada: ar2 = arcpy Array () untuk p in ar: ar2.insert (0, p) for p in ar2: print p poly = arcpy.Polygon (ar2) print 'poly.centroid try 2', poly.centroid ic_pl.insertRow (r)

Contoh cetakan untuk 1 poligon:

-4.7134965 56.4387108 NaN NaN -4.7135666 56.4385955 NaN NaN -4.7133971 56.438564 NaN NaN -4.7133269 56.4386793 NaN NaN -4.7134965 56.4387108 NaN NaN array panjang 5 ar [0] -4.7134965 NaN NaN4388108 cuba 1 Tiada -4.7134965 56.4387108 NaN NaN -4.7133269 56.4386793 NaN NaN -4.7133971 56.438564 NaN NaN -4.7135666 56.4385955 NaN NaN -4.7134965 56.4387108 NaN NaN poly.centroid cuba 2 Tiada

Penyelesaian: seperti yang disarankan oleh @Vince di bawah dalam komen, semasa meletakkanArraydidalamPoligon, secara jelas menyatakan rujukan spasial, sehingga akan menjadipoly = arcpy.Poligon (ar, wgs).



Saya rasa komen mengenai soalan ini patut diberi jawapan yang akan saya buat Komuniti Wiki:

Cuba gunakan rujukan spasial pada bentuk - poly = arcpy.Polygon (ar, wgs) - Vince 25 Jun pada 12:08


Ya, saya akan melakukan seperti yang dikatakan oleh Vince dan menambahkan rujukan spasial, jika tidak, poligon tidak tahu di mana ia sepatutnya. Anda juga boleh menyiapkan wg dengan memasukkan ID yang terkenal (WKID) daripada merujuk fail .prj: wgs = arcpy.SpatialReference (4326) - crmackey 25 Jun pada 12:17


Rujukan spasial lalai kemungkinan mempunyai resolusi puncak 0,001 (1mm), yang runtuh bucu, menjadikan centroid tidak ditentukan. - Vince 25 Jun jam 12:22


@crmackey ini memberi saya ralat jika saya menggunakannya seperti itu, tetapi jika saya melakukannya dengan cara di bahagian bawah halaman ini, ia berfungsi dengan baik: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html# //… - Menno 25 Jun jam 12:29


Saya harus menunjukkan bahawa cadangan saya hanya berfungsi untuk versi 10.1 dan seterusnya. - crmackey 25 Jun pada 12:37


Tonton videonya: V Одделение - Македонски јазик - Скратеници