如何知道坐标是否在坐标多边形内

How to know if a coordinate is inside a polygon of coordinates

事实证明,我需要验证坐标是否在多边形内部,如果坐标在多边形内部,它 return 是一个具有属性 'SCANOMBRE' 的列,其中包含每个多边形的名称,现在已经解释了问题我在多边形所在的 geojson 文件中有以下数据。

dataset of poligonos

此数据集包含以下列

barrios = gpd.GeoDataFrame.from_file('dataset/scat_geojson.geojson')
print(barrios.SCANOMBRE, barrios.geometry)

以上数据是我很准时感兴趣的

现在我有一个包含坐标点的文件,我需要验证它是否属于上面列表中的多边形。

dataset off points

此数据集包含在纬度和经度列中

pdv = pd.read_excel('dataset/Matriz_Final.xlsx')
pdv.columns = pdv.columns.str.strip()
print(pdv.Latitud, pdv.Longitud)

现在我的问题来了,我如何知道这些坐标点中的每一个是否都在多边形内,以及它如何 return 带有坐标和 SNAME 变量的字典,类似于以下示例.

进行了验证,希望你把信息这样给我,以便我以后做图,希望你能帮助我,非常感谢。

  • 已将国家/地区用作多边形/多边形 (barrios)
  • 已经产生了一些点,一些将落在国家内(puntos
  • left 的简单情况 sjoin() 告诉您哪些点在多边形中,哪些点不在多边形中
  • 已经可视化证明它有效(绿色有效点,紫色无效)
import geopandas as gpd
import pandas as pd
import numpy as np

barrios = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))

# generate some points, some are valid some invalid
puntos = pd.DataFrame(
    {
        "Latitud": np.linspace(*barrios.total_bounds[[0, 2]], 100),
        "Longitud": np.linspace(*barrios.total_bounds[[1, 3]], 100),
    }
)

# find valid points by do an sjoin
valid = gpd.GeoDataFrame(puntos,
    geometry=gpd.points_from_xy(puntos["Latitud"], puntos["Longitud"]), crs="epsg:4326"
).sjoin(barrios.loc[:, ["geometry"]], how="left").assign(
    valid=lambda d: (~d["index_right"].isna()).astype(int)
)

示例输出

Latitud Longitud geometry index_right valid
0 -180 -90 POINT (-180 -90) nan 0
1 -176.364 -88.246 POINT (-176.3636363636364 -88.24600878787879) 159 1
2 -172.727 -86.492 POINT (-172.7272727272727 -86.49201757575757) 159 1
3 -169.091 -84.738 POINT (-169.0909090909091 -84.73802636363637) 159 1
4 -165.455 -82.984 POINT (-165.4545454545454 -82.98403515151516) nan 0
5 -161.818 -81.23 POINT (-161.8181818181818 -81.23004393939394) nan 0
6 -158.182 -79.4761 POINT (-158.1818181818182 -79.47605272727273) nan 0
7 -154.545 -77.7221 POINT (-154.5454545454545 -77.72206151515152) 159 1
8 -150.909 -75.9681 POINT (-150.9090909090909 -75.9680703030303) nan 0
9 -147.273 -74.2141 POINT (-147.2727272727273 -74.2140790909091) nan 0

可视化验证

m = barrios.explore()
valid.explore(m=m, column="valid")