https://www.data.gov.uk/dataset/0fb911e ... of-england
Шейп-файл находится в британской национальной сетке. (EPSG:27700).
У меня также есть DataFrame с местоположениями с широтой и долготой (WGS84). Я хочу определить, к какому церемониальному графству относится каждая точка.
Для большинства округов пространственное соединение работает правильно.
Однако для Корнуолла, Большого Лондона и Ратленда соединение всегда возвращает NaN, даже если при построении точки точки явно находятся внутри границы округа.
Код
Код: Выделить всё
import geopandas as gpd
from shapely.geometry import Point
regions = gpd.read_file("Ceremonial_County_Boundaries.shp")
points = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df["lon"], df["lat"])
points_bng = points.to_crs(regions.crs)
# Spatial join
joined = gpd.sjoin(points_bng, regions, how="left", predicate="within")
Пространственное соединение правильно соответствует примерно 90% местоположений.
Но все точки в Корнуолле, Большом Лондоне и Ратленде возвращаются как несовпадающие (index_right = NaN).
Я изолировал полигоны из шейп-файла:
Код: Выделить всё
county_poly = regions[regions["NAME"] == "Cornwall"]
print("Valid:", county_poly.geometry.is_valid.unique())
Код: Выделить всё
Valid: [False]
Все остальные округа возвращают Valid: [True] и работают правильно.
Что я пробовал
- Визуально подтверждено, что точки лежат внутри многоугольника
- CRS правильный
Очки: EPSG:4326 → преобразовано в 27700
Будем благодарны за помощь или мысли?
Подробнее здесь: https://stackoverflow.com/questions/798 ... ied-into-a
Мобильная версия