Mais

Criação de geometria de polígono usando matriz de pontos

Criação de geometria de polígono usando matriz de pontos


Estou analisando um arquivo gpx do OpenStreetMap que exportei daqui. Estou tentando colocar os dados em classes de recursos do arcgis geodatabase. Alguns dos recursos no gpx são pontos (salvos como wpt), enquanto outros são polígonos (salvos como trk consistindo em trkpt's). Usando o script abaixo, consigo copiar os pontos, sua geometria, os nomes e atributos que desejo. No entanto, de alguma forma, criar a geometria não funciona para os polígonos, embora os atributos sejam copiados sem problemas (deixei um pedaço de código para os atributos fora do exemplo abaixo). Eu encontrei esta questão que me levou a tentar construir os polígonos com os pontos ordenados ao contrário. No entanto, isso também não funcionou. Eu criei algumas instruções de impressão para verificar onde estava errado, veja a impressão abaixo. Também não aquela impressãopoly.arearesulta em0.0, impressãopoly.trueCentroidresulta emNenhum, etc. Portanto, o polígono simplesmente não é gerado a partir do array. Para mim parece quepoly = arcpy.Polygon (ar)simplesmente não funciona.

Exemplo GPX:

 Ian Brown Motors name = Ian Brown Motors shop = car_repair   Minimercado da loja de chaves Brodie building = yes name = Key Store Brodie's Minimarket opening_hours = 08h00-18h00 loja = supermercado fonte = pesquisa       

Roteiro:

from 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', referência_espacial = 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') para fc em [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) para mainElement na raiz: if mainElement.tag == 'metadados': continue se mainElement.tag == 'wpt': r = ic_pt.newRow () y = float (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 () para subElement em mainElement: if subElement.tag == 'trkseg': ar = arcpy.Array () para trkpt em subElement: y = float (trkpt.attrib ['lat']) x = float (trkpt.attrib ['lon ']) p = arcpy.Point (x, y) print p ar.add (p) print' comprimento do 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 se poly.centroid for None: ar2 = arcpy .Array () para p em ar: ar2.insert (0, p) para p em ar2: imprimir p poly = arcpy.Polygon (ar2) print 'poly.centroid try 2', poly.centroid ic_pl.insertRow (r)

Amostra de impressão para 1 polígono:

-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 comprimento da matriz 5 arN NaNaN -4,7133971 56,438564 NaN NaN -4,7133269 56,4386793 NaN NaN -4,7134965 56,4387108 NaN NaN comprimento da matriz 5 ar NaN NaCent 5 ar 0,413,7108 Nacent Nacent -4,713,48 Nacent -4,7108 Nacent -4,7108 NaC 4 ar-4 ar 0 4 7108 ar 0 4 7108 NaC-4 ar-4-10 8 ar NaC N-4-108 NaC N-4-108 ar Nacent-4-108 ar 0 4 710 8 ar 0 ar 0 4 7108 NaCente -4; try 1 None -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 try 2 Nenhum

Solução: conforme sugerido por @Vince abaixo nos comentários, ao colocar oVariedadeem umPolígono, declare explicitamente a referência espacial, para que ela se tornepoly = arcpy.Polygon (ar, wgs).



Acho que vale a pena colocar os comentários sobre esta questão em uma resposta que farei Community Wiki:

Tente aplicar a referência espacial à forma - poly = arcpy.Polygon (ar, wgs) - Vince 25 de junho às 12h08


Sim, eu faria o que Vince disse e adicionaria uma referência espacial, caso contrário, o polígono não tem ideia de onde deveria estar. Além disso, você pode configurar o wgs passando um ID conhecido (WKID) em vez de fazer referência a um arquivo .prj: wgs = arcpy.SpatialReference (4326) - crmackey 25 de junho às 12:17


A referência espacial padrão provavelmente tem uma resolução de vértice de 0,001 (1 mm), que reduz os vértices, tornando o centróide indefinido. - Vince 25 de junho às 12:22


@crmackey me dá um erro se eu usá-lo assim, mas se eu fizer da maneira no final desta página, ele funciona bem: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html# //… - Menno 25 de junho às 12h29


Devo ressaltar que minha sugestão só funciona para a versão 10.1 e posteriores. - crmackey 25 de junho às 12:37


Assista o vídeo: Równoległobok - wprowadzenie #1 Wielokąty