Suite

Obtenez la valeur d'attribut de polygone de fichier de formes à un point spécifique à l'aide de Python (par exemple via PyShp)

Obtenez la valeur d'attribut de polygone de fichier de formes à un point spécifique à l'aide de Python (par exemple via PyShp)


J'ai un fichier de formes comprenant plusieurs polygones. Ces polygones ont des attributs. J'essaie d'écrire un script en Python qui prend un point de coordonnées, détermine dans quel polygone il tombe et renvoie les attributs de ce polygone.

Jusqu'à présent, en utilisant PyShp, j'ai ceci, qui imprime tous les enregistrements.

importer un fichier de formes sf = shapefile.Reader("England.shp") records = sf.records() imprimer des enregistrements

Je veux donc transmettre des coordonnées pour Buckingham Palace, qui se trouve à l'intérieur d'un polygone qui a la valeur d'attribut 'Area' de 'London' et le renvoyer 'London'

Est-ce que quelqu'un peut-il me montrer la bonne direction?


Au niveau le plus simple, vous devez parcourir chaque polygone de votre fichier de formes et vérifier s'ils pointent à l'intérieur. Vous pouvez arrêter la boucle lorsque vous trouvez le bon polygone. Vous pouvez accélérer un peu ce processus en vérifiant si le point se trouve à l'intérieur de l'étendue du polygone. En vérifiant d'abord l'étendue, vous réduisez rapidement les possibilités en vérifiant rapidement les 4 points d'un rectangle.

La fonction suivante vérifie si un point est à l'intérieur d'un polygone. Cette fonction à elle seule répondra à votre question. Si vous utilisez la méthode pyshp shapeRecords(), elle conservera la géométrie et les enregistrements associés. Ainsi, lorsque vous trouverez le bon polygone, vous aurez facilement accès aux attributs :

def point_in_poly(x,y,poly): # vérifie si le point est un sommet if (x,y) dans poly: return "IN" # vérifie si le point est sur une frontière pour i in range(len(poly)): p1 = Aucun p2 = Aucun si i==0 : p1 = poly[0] p2 = poly[1] sinon : p1 = poly[i-1] p2 = poly[i] si p1[1] == p2[1] et p1[1] == y et x > min(p1[0], p2[0]) et x < max(p1[0], p2[0]): return "IN" n = len(poly) inside = Faux p1x,p1y = poly[0] pour i dans la plage(n+1) : p2x,p2y = poly[i % n] si y > min(p1y,p2y) : si y <= max(p1y,p2y) : si x <= max(p1x,p2x) : si p1y != p2y : xints = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x si p1x == p2x ou x <= xints : inside = not inside p1x,p1y = p2x,p2y if inside: return "IN" else: return "OUT" # Tester un sommet pour l'inclusion poligono = [(-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 print point_in_poly(lat, lon, poligono) # teste un point limite pour l'inclusion poly2 = [ (1,1), (5,1), (5,5), (1,5), (1,1)] x = 3 y = 1 print point_ in_poly(x, y, poly2)

Voir la vidéo: 6 - Create Shapefile From Coordinates using Python and PyShp - Garmin API