Mais

Obtenha o valor do atributo do polígono do arquivo de forma em um ponto específico usando Python (por exemplo, via PyShp)

Obtenha o valor do atributo do polígono do arquivo de forma em um ponto específico usando Python (por exemplo, via PyShp)


Eu tenho um arquivo de forma que compreende vários polígonos. Esses polígonos têm atributos. Estou tentando escrever um script em Python que pega um ponto de coordenada, determina em qual polígono ele cai e retorna os atributos desse polígono.

Até agora, usando PyShp eu tenho isso, que imprime todos os registros.

import shapefile sf = shapefile.Reader ("England.shp") records = sf.records () imprimir registros

Então, eu quero passar as coordenadas para o Palácio de Buckingham, que está dentro de um polígono que tem o valor de atributo 'Área' de 'Londres' e fazer com que ele retorne 'Londres'

Alguém pode me apontar na direção certa?


No nível mais simples, você deve percorrer cada polígono em seu arquivo de forma e verificar se eles apontam para dentro dele. Você pode interromper o loop quando encontrar o polígono correto. Você pode acelerar esse processo um pouco verificando se o ponto está dentro da extensão do polígono. Ao verificar a extensão primeiro, você está rapidamente restringindo as possibilidades, verificando rapidamente os 4 pontos de um retângulo.

A função a seguir verifica se um ponto está dentro de um polígono. Esta função por si só responderá à sua pergunta. Se você usar o método pyshp shapeRecords (), ele manterá a geometria e os registros associados para que, quando encontrar o polígono correto, você tenha acesso fácil aos atributos:

def point_in_poly (x, y, poly): # verifique se o ponto é um vértice if (x, y) in poly: return "IN" # verifique se o ponto está em um limite para i no intervalo (len (poly)): p1 = Nenhum p2 = Nenhum se i == 0: p1 = poli [0] p2 = poli [1] else: p1 = poli [i-1] p2 = poli [i] se p1 [1] == p2 [1] e p1 [1] == y e x> min (p1 [0], p2 [0]) e x  min (p1y, p2y): se y <= max (p1y, p2y) : if x <= max (p1x, p2x): if p1y! = p2y: xints = (y-p1y) * (p2x-p1x) / (p2y-p1y) + p1x se p1x == p2x ou x <= xints: dentro = não dentro de p1x, p1y = p2x, p2y se dentro: return "IN" else: return "OUT" # Teste um vértice para polígono de inclusão = [(-33,416032, -70,593016), (-33,415370, -70,589604), ( -33.417340, -70.589046), (-33.417949, -70.592351), (-33.416032, -70.593016)] lat = -33.416032 lon = -70.593016 imprimir point_in_poly (lat, lon, poligono) # testar um ponto limite para inclusão poly2 = [ (1,1), (5,1), (5,5), (1,5), (1,1)] x = 3 y = 1 ponto de impressão_ in_poly (x, y, poly2)

Assista o vídeo: GeoJSON to SHP with Pythonpyshp