geo pandas не распознающая точка в многоугольнике - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть два кадра данных. Один имеет многоугольники зданий (около 70 КБ), а другой имеет точки, которые могут быть или не быть внутри полигонов (около 100 КБ). Мне нужно определить, находится ли точка внутри многоугольника или нет.

Когда я строю оба кадра данных (пример ниже), график показывает, что некоторые точки находятся внутри многоугольников, а другие - нет. Однако, когда я использую .within (), результат говорит, что ни одна из точек не находится внутри многоугольников.

Я воссоздал пример создания одного многоугольника и одной точки «вручную» вместо импорта данных, и в этом случае .within () распознает, что точка находится в многоугольнике. Поэтому я предполагаю, что совершаю ошибку, но не знаю, где.

Пример: (Я просто опубликую часть, которая соответствует одной точке и одному многоугольнику для простоты. В этом случае каждый фрейм данных содержит либо одну точку, либо один многоугольник)

1) Использование импортированных данных. Фрейм данных dmR имеет точки, а фрейм данных dmf имеет многоугольник

import pandas as pd
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
from shapely import wkt
from shapely.geometry import Point, Polygon
plt.style.use("seaborn")

# I'm skipping the data manipulation stage and 
# going to the point where the data are used.

print(dmR)

               geometry
35  POINT (-95.75207 29.76047)

print(dmf)
               geometry
41964  POLYGON ((-95.75233 29.76061, -95.75194 29.760...

# Plot
fig, ax = plt.subplots(figsize=(5,5))
minx, miny, maxx, maxy = ([-95.7525, 29.7603, -95.7515, 29.761])
ax.set_xlim(minx, maxx)
ax.set_ylim(miny, maxy)
dmR.plot(ax=ax, c='Red')
dmf.plot(ax=ax, alpha=0.5)
plt.savefig('imported_data.png')

Результат показывает, что точка находится внутри многоугольника . Тем не менее,

print(dmR.within(dmf))
35       False
41964    False
dtype: bool

2) Если я попытаюсь воссоздать это вручную, это будет выглядеть следующим образом (возможно, есть лучший способ сделать это, но я не могу понять это):

# Get the vertices of the polygon to create it by hand
poly1 = dmf['geometry']
g = [i for i in poly1]
x,y = g[0].exterior.coords.xy
x,y

(array('d', [-95.752332508564, -95.75193554162979, -95.75193151831627, -95.75232848525047, -95.752332508564]),
 array('d', [29.760606530637265, 29.760607694859385, 29.76044470363038, 29.76044237518235, 29.760606530637265]))

# Create the polygon by hand using the corresponding vertices
coords = [(-95.752332508564, 29.760606530637265),
          (-95.75193554162979, 29.760607694859385),
          (-95.75193151831627, 29.7604447036303),
          (-95.75232848525047, 29.76044237518235),
         (-95.752332508564, 29.760606530637265)]
poly = Polygon(coords)

# Create point by hand (just copy the point from 1) above
p1 = Point(-95.75207, 29.76047)

# Create the GeoPandas data frames from the point and polygon
ex = gpd.GeoDataFrame()
ex['geometry']=[poly]
ex = ex.set_geometry('geometry')
ex_p = gpd.GeoDataFrame()
ex_p['geometry'] = [p1]
ex_p = ex_p.set_geometry('geometry')

# Plot and print
fig, ax = plt.subplots(figsize=(5,5))
ax.set_xlim(minx, maxx)
ax.set_ylim(miny, maxy)
ex_p.plot(ax=ax, c='Red')
ex.plot(ax = ax, alpha=0.5)
plt.savefig('by_hand.png')

В этом случае результат также показывает точку в многоугольнике . Тем не менее,

ex_p.within(ex)
0    True
dtype: bool

, которые распознают, что точка находится в многоугольнике. Все предложения о том, что делать, приветствуются! Спасибо.

1 Ответ

0 голосов
/ 25 февраля 2020

Я не знаю, является ли это наиболее эффективным способом сделать это, но я смог сделать то, что мне было нужно в Python и использовать Geo pandas.

вместо point.within(polygon) подход, я сделал пространственное соединение (geopandas.sjoin(df_1, df_2, how = 'inner', op = 'contains')) Это приводит к новому фрейму данных, который содержит точки, которые находятся в пределах многоугольников, и исключает те, которые не являются. Более подробную информацию о том, как это сделать, можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...