#python #pandas #latitude-longitude #geopandas
#python #pandas #широта-долгота #геопанды
Вопрос:
У меня есть файл CSV, в котором есть столбцы для широты и долготы. Данные для каждого находятся в ирландской системе координат сетки (северные и восточные направления). Как мне преобразовать правильную широту и долготу?
Пример того, что у меня есть Latitude 372000 Longitude 332000
.
Код
from shapely.geometry import Point
import geopandas as gpd
from geopandas import GeoDataFrame
import pandas as pd
df = pd.read_csv("File.csv", skiprows=0, low_memory=False, encoding='ANSI')
geometry = [Point(xy) for xy in zip(df['longitude'], df['latitude'])]
gdf = GeoDataFrame(df, geometry=geometry)
#this is a simple map that goes with geopandas
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
gdf.plot(ax=world.plot(figsize=(10, 6)), color='red', markersize=1.5)
Ответ №1:
Я считаю, что ирландская сетка использует CRS 29903 (согласно https://georepository.com/crs_29903/TM75-Irish-Grid.html ), в то время как мировой файл, поставляемый с GeoPandas, использует CRS 4326. Таким образом, вам нужно либо перепроектировать первое на второе, либо наоборот.
Что-то вроде:
gdf = gdf.to_crs(4326)
или
world = world.to_crs(29903)
затем вы можете проверить это с помощью (используя Jupyter здесь):
In: world.crs
Out:
Имя: TM75 / Ирландская сетка
Информация об оси [декартова]:
- E [east]: восток (метр)
- N [север]: север (метр) Область использования:
- название: Европа — Ирландия (Республика и Ольстер) — на суше
- границы: (-10.56, 51.39, -5.34, 55.43) Координируйте работу:
- название: Ирландская сетка
- метод: поперечная Меркаторская база данных: геодезическая база данных 1965 года
- Эллипсоид: модифицированный Эйри 1849
- Нулевой меридиан: Гринвич
Итак, собрав все это вместе (предполагая, что неявный CRS вашего файла .csv действительно равен 29903, это будет выглядеть так:
df = pd.read_csv("File.csv", skiprows=0, low_memory=False, encoding='ANSI')
geometry = [Point(xy) for xy in zip(df['longitude'], df['latitude'])]
gdf = GeoDataFrame(df, geometry=geometry, crs= 29903)
gdf = gdf.to_crs(4326)
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
gdf.plot(ax=world.plot(figsize=(10, 6)), color='red', markersize=1.5)
И вы получаете значения геометрии, которые выглядят следующим образом:
0 POINT (-6.45067 53.35318)
1 POINT (-6.44943 53.35470)
2 POINT (-6.44432 53.35355)
3 POINT (-6.43974 53.34900)
4 POINT (-6.44179 53.34956)
Комментарии:
1. Извините, вы меня потеряли. Я очень новичок в этом. Куда бы я поместил «gdf = gdf.to_crs(4326)» в написанном мной коде?
2. Ах, извините за неясность — это будет после gdf = GeoDataFrame (df, geometry= geometry). Итак, вы вводите фрейм геоданных, как вы это сделали, а затем, чтобы подготовить его к использованию с мировым GDF, у которого другой CRS, вы делаете gdf = gdf.to_crs(4326) .
3. Я вставил его после него, и он выдал мне «Ошибка значения: невозможно преобразовать наивные геометрии. Пожалуйста, сначала установите crs для объекта «.
4. Итак, когда вы инициализируете ирландские данные, давайте попробуем: gdf = GeoDataFrame(df, geometry = geometry, crs = 29903) Проблема в том, что когда вы создаете gdf из необработанных данных (в отличие от шейп-файла), он не знает, какие CRS вы используете, поэтому, когда выпопробуйте перепроектировать его, geopandas сбит с толку, потому что он должен перепроектировать из некоторых CRS. Считайте перепроектирование аналогичным языковому переводу — если вы не знаете, на каком языке написан исходный текст, вы не сможете его перевести.
5. Он запустил и построил карту, однако точки не сдвинулись со своего первоначального положения.