如何知道坐标是否在坐标多边形内
How to know if a coordinate is inside a polygon of coordinates
事实证明,我需要验证坐标是否在多边形内部,如果坐标在多边形内部,它 return 是一个具有属性 'SCANOMBRE' 的列,其中包含每个多边形的名称,现在已经解释了问题我在多边形所在的 geojson 文件中有以下数据。
此数据集包含以下列
barrios = gpd.GeoDataFrame.from_file('dataset/scat_geojson.geojson')
print(barrios.SCANOMBRE, barrios.geometry)
以上数据是我很准时感兴趣的
现在我有一个包含坐标点的文件,我需要验证它是否属于上面列表中的多边形。
此数据集包含在纬度和经度列中
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")
事实证明,我需要验证坐标是否在多边形内部,如果坐标在多边形内部,它 return 是一个具有属性 'SCANOMBRE' 的列,其中包含每个多边形的名称,现在已经解释了问题我在多边形所在的 geojson 文件中有以下数据。
此数据集包含以下列
barrios = gpd.GeoDataFrame.from_file('dataset/scat_geojson.geojson')
print(barrios.SCANOMBRE, barrios.geometry)
以上数据是我很准时感兴趣的
现在我有一个包含坐标点的文件,我需要验证它是否属于上面列表中的多边形。
此数据集包含在纬度和经度列中
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")