Преобразование ирландской сетки (северные и восточные направления) для исправления северных и восточных направлений

#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. Он запустил и построил карту, однако точки не сдвинулись со своего первоначального положения.