Как найти точку в многоугольнике из файла Geojson, используя Python и Geopandas - PullRequest
1 голос
/ 05 июля 2019

Итак, у меня есть файл .geojson, который содержит FeatureCollection нескольких полигонов, представляющих страну.Я пытаюсь определить, находится ли конкретная точка внутри одного из этих многоугольников.Если так, я возвращаю всю функцию;если нет, я возвращаю простое сообщение.

Пока что я могу загрузить данные в GeoDataFrame с помощью геопанд, но по некоторым причинам я не могу успешно выполнить итерации по геоданным и успешно выполнить polygon.contains(point).Мне кажется, что итерация останавливается после определенного момента, или, возможно, мой код не работает вообще.

Я попробовал несколько предложений от S / O и других учебных пособий в Google, но я не смог успешно получить то, что хотел.Ниже приведен мой код.

файл Geojson

данные

код

%matplotlib inline

import json
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
import shapely
from shapely.geometry import Point, Polygon
from descartes import PolygonPatch
import geocoder
import requests
import copy

session = requests.Session()

test_point = [14.1747157, 10.4952759]


f, ax = plt.subplots(1, figsize=(10, 10))

url = 'https://trello-attachments.s3.amazonaws.com/599b7f6ff18b8d629ac53168/5d03586a06add530095c325c/26f5d54bbfa9731ec16737641b59de9a/CMR_adm3-2.geojson'

df = gpd.read_file(url)
df['Area']= df['geometry'].area
df['centroid'] = df['geometry'].centroid

df.plot(ax=ax, column="Area", cmap='OrRd', alpha=0.5, edgecolor='k')
# ax.set_title(arr + " " + depart + " " + region, fontsize = font_size)
# print(df.head(3))

plt.show()
print("The length of the Dataframe is:", len(df))


def find_department(df, point):

    for feature in df['geometry']:

        polygon = Polygon(feature)
#         print(type(polygon))
        if polygon.contains(point):
#             print(feature.to_json())
            print ('Found containing polygon:', feature)

        else:
            print('Found nothing!')


p1 = Point(float(test_point[0]), float(test_point[1]))
dept = find_department(df, p1)
print("The department is:", dept)

Это ответ, который я получаю, когда запускаю его на ноутбуке:

Response From running the code on jupyter notebook

1 Ответ

1 голос
/ 06 июля 2019

Это сработало для меня:

def find_department(df, point):
    for index, row in df.iterrows():
        if row.geometry.contains(point):
            return row
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...