geopandas sjoin возвращает пустые строки

#python #geopandas

#python #геопанды #geopandas

Вопрос:

У меня есть таблица полигонов всех выходных областей Великобритании, структурированная таким образом:

 newpoly


        OBJECTID    OA11CD  LAD11CD Shape__Are  Shape__Len  TCITY15NM   geometry
67519   67520   E00069658   E06000018   3.396296e 04    1006.464423 Nottingham  POLYGON ((456069.067 340766.874, 456057.000 34...
67520   67521   E00069659   E06000018   1.014138e 05    1404.327776 Nottingham  POLYGON ((456691.549 340778.104, 456557.864 34...
67521   67522   E00069660   E06000018   1.812783e 04    731.882609  Nottingham  POLYGON ((456945.994 340821.233, 456969.220 34...
67522   67523   E00069661   E06000018   2.765546e 04    1112.317587 Nottingham  POLYGON ((456527.178 340669.119, 456484.993 34...
67523   67524   E00069662   E06000018   3.647822e 04    964.989153  Nottingham  POLYGON ((456301.845 340419.759, 456244.357 34...
  

и таблица пунктов, структурированная следующим образом:

 restaurants

    name    latitude    longitude   geometry
0   Restaurant Sat Bains with rooms 52.925050   -1.167712   POINT (-1.16771 52.92505)
1   Revolution Hockley  52.954090   -1.144025   POINT (-1.14403 52.95409)
2   Revolution Cornerhouse  52.955517   -1.150088   POINT (-1.15009 52.95552)
  

но когда я делаю:

 spatial_join = gpd.sjoin(restaurants, newpoly, op = 'contains')
spatial_join
  

0 строк совпадают.

геометрическая колонка ресторанов была составлена с помощью:

 restaurants = pd.read_csv('Restaurants_clean.csv')
restaurants = gpd.GeoDataFrame(
    restaurants, geometry=gpd.points_from_xy(restaurants.longitude, restaurants.latitude))
  

Я пробовал разные аргументы ‘op’, но возникает та же проблема. Я убежден, что должно быть объединение, потому что в таблице существуют все области вывода Великобритании.

Я что-то упускаю?

Ответ №1:

Вы используете разные проекции. Я уверен, что GeoPandas sjoin на самом деле предупреждает вас об этом. Создайте свой точечный слой следующим образом:

 restaurants = pd.read_csv('Restaurants_clean.csv')
restaurants = gpd.GeoDataFrame(
    restaurants, 
    geometry=gpd.points_from_xy(restaurants.longitude, restaurants.latitude),
    crs=4326)
restaurants = restaurants.to_crs(newpoly.crs) 
  

Сначала я указываю CRS ввода (как 4326, что является кодом EPSG WS84, то есть координатами lon / lat), а затем повторно проецирую данные на те же CRS, которые newpoly есть (я предполагаю, 27700).

Комментарии:

1. Да, это решаемая проблема. Я не получал предупреждения, но это может быть связано с тем, что я использую vscode

2. Да, по какой-то причине VSCode по умолчанию подавляет предупреждения.