简体   繁体   中英

How To Find a Point In Polygon from a Geojson file Using Python And Geopandas

So I have a .geojson file that contains a FeatureCollection of multiple polygons representing a country. I am trying to determine if a specific point is inside one of these polygons. If so, I return the entire feature itself; if not, I return a simple message.

So far, I am able to load the data into a GeoDataFrame using geopandas, but for some reasons, I can't successfully iterate through the geodataframe and successfully perform polygon.contains(point) . It seems to me that the iteration stops after a certain point, or maybe my code does not work at all.

I have tried multiple suggestions from S/O and other tutorials on Google, but I couldn't successfully get what I wanted. Below is my code.

Geojson file

data

Code

%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)

This is the response I get when I run it on notebook:

在 jupyter notebook 上运行代码的响应

This worked for me:

def find_department(df, point):
    for index, row in df.iterrows():
        if row.geometry.contains(point):
            return row

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM