1 votos

¿Extraer el nombre del polígono del marco de datos si el punto geográfico está dentro del polígono?

Tengo dos conjuntos de datos, uno con el nombre del polígono y el polígono y otro con el nombre de la ubicación y la latitud y longitud.

Datos 1 (Geopandas Dataframe)

import geopandas as gpd
data_poly = gpd.read_file(path + "Data_community_file.geojson")

COMMUNITY NAME   POLYGON
New York         MULTIPOLYGON (((55.1993358199345 25.20971347951325, 
                 55.19385836251354 25.20134197109752.... 25.20971347951325)))
Chennai          MULTIPOLYGON (((65.1993358199345 22.20871347951325, 
                 55.19325836251354 15.20132197109752 .... 15.20971347951325))) 

Datos 2 (Marco de datos)

STOP NAME            LONGITUDE       LANGITUDE
Chennai main stop    55.307228       25.248844
Cabra stop           55.278824       25.205862
USA stop NY          55.069368       24.973946

Si el dato 2 (nombre_parada) está dentro del dato 1 (polígono) hay que extraer el nombre del polígono. Es decir, si la parada USA NY está presente en cualquier "New York" hay que añadir el nombre en la nueva columna en data2.(Hay que convertir la lat y lot a formato Point(Lat,Lon) para el código de abajo).

Código de ejemplo :

import json
    from shapely.geometry import shape, Point
    # depending on your version, use: from shapely.geometry import shape, Point

    # load GeoJSON file containing sectors
    with open('sectors.json') as f:
        js = json.load(f)

    # construct point based on lon/lat returned by geocoder
    point = Point(-122.7924463, 45.4519896)

    # check each polygon to see if it contains the point
for feature in js['features']:
    polygon = shape(feature['geometry'])
    if polygon.contains(point):
        print(feature)

El código anterior será capaz de extraer el polígono basado en el "Punto". ¿Cómo aplicar lo mismo para el marco de datos en el lugar del punto?

2voto

Tao Puntos 1

Les presento una gran operación: geopandas.sjoin() ( docs ). Con este método puede saber qué geometrías de un GeoDataFrame 'intersecan', 'contienen' o están 'dentro' de otra. Para utilizarlo, debes tener dos GeoDataFrame. En tu caso, tienes que transformar el DataFrame lat/lon a él, haciendo algo así:

from shapely.geometry import Point
df['geometry'] = df.apply(lambda x: Point([x['LONGITUDE', x['LATITUDE']], axis=1)

A continuación, puede utilizar sjoin . Como resultado, tendrá las columnas de df concatenado al data_poly en las filas en las que df está dentro de data_poly .

import geopandas as gpd
joined_gdf = gpd.sjoin(df, data_poly, op='within')

ACTUALIZACIÓN :

Para realizar sjoin debe tener libspatialindex y rtree instalados. Usted puede hacer esto sin sudo con:

$ pip install rtree
$ conda install -c conda-forge libspatialindex

0voto

user161642 Puntos 1272

He aquí la respuesta a la pregunta anterior. Muchas gracias a @Adelson.

Install these two packages to avoid the "Error"

    #!pip install rtree
    #conda install -c conda-forge libspatialindex 

Polygon Data (GeoDataFrame)
data_poly = gpd.read_file("data.geojson")
# Readonly the required columns 
# Drop NAN

Location Data (GeoDataFrame)
bus = pd.read_Csv(busstop.csv)

#convert dataframe to geodatframe
gdf = geopandas.GeoDataFrame(
    bus, geometry=geopandas.points_from_xy(bus.stop_location_longitiude, bus.stop_location_latitiude))

#Output
joined_gdf = gpd.sjoin(gdf, data_poly, op='within')

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X