Функция для преобразования координат в серии панд и добавления в качестве дополнительной серии
Я хочу взять в качестве ряда координат, хранящихся в кадре данных pandas, и определить функцию, которая будет проходить через каждую запись, преобразовывать ее (BNG Easting Northing в Lat и Long) и сохранять ее в новом столбце в той же строке. Эта функция Элиз Хуард выглядит так, как будто она должна делать именно это
def proj_transform(df):
#bng = pyproj.Proj(init='epsg:27700')
bng = pyproj.Proj("+init=EPSG:27700")
#wgs84 = pyproj.Proj(init='epsg:4326')
wgs84 = pyproj.Proj("+init=EPSG:4326")
lats = pd.Series()
lons = pd.Series()
for idx, val in enumerate(df['Easting']):
lon, lat = pyproj.transform(bng,wgs84,df['Easting'][idx], df['Northing'][idx])
lats.set_value(idx, lat)
lons.set_value(idx, lon)
df['lat'] = lats
df['lon'] = lons
return df
но я получаю следующую ошибку, как только я пытаюсь запустить функцию. Любой совет о том, что может быть причиной, или альтернативный подход в качестве обходного пути.
RuntimeError: non-convergent inverse meridional dist
Образец используемых данных;
Site Reference LA Reference Start Date Easting Northing
0 380500145 NaN 20130101 105175.0 105175.0
1 380500128 NaN 20060331 104000.0 104000.0
2 380500085 NaN 20030401 105055.0 105055.0
3 380500008 NaN 19980930 108480.0 108480.0
4 380500009 NaN 19980930 105415.0 105415.0
5 380500136 SHLAA20100101 105081.0 105081.0
6 380500038 NaN 19980930 105818.0 105818.0
3 ответа
Как отмечает @ptrj;
RuntimeError: non-convergent inverse meridional dist
В данном случае это вызвано значениями NaN в данных.
Предполагая, что pyproj.transform работает правильно на одиночных (восточных, северных) парах координат, тогда вместо:
for idx, val in enumerate(df['Easting']):
lon, lat = pyproj.transform(bng,wgs84,df['Easting'][idx], df['Northing'][idx])
lats.set_value(idx, lat)
lons.set_value(idx, lon)
Пытаться:
lons, lats = map(lambda x: pyproj.transform(bng, wgs84, x[0], x[1]),
zip(df['Easting'], df['Northing']))
И оставьте остальное без изменений.
редактировать
Это работает:
arr = map(lambda x: pyproj.transform(bng, wgs84, x[0], x[1]),
zip(df['eastings'], df['northings']))
lons, lats = map(array, zip(*arr))
Я думаю, что функция работает нормально, но форматирование вашего ввода является виновником. В пятой строке ваших образцов данных нет места между SHLAA
и дата - они составляют одно выражение в столбец LA Ref, в то время как столбец northings получает NaN
, это NaN
значение приводит к RuntimeError: b'non-convergent inverse meridional dist'
в функции pyproj.transform
,
После добавления пробела и переформатирования некоторых необходимых имен столбцов все заработало (или, по крайней мере, выглядело так).
Мой код:
import pandas as pd
import pyproj
from inspect import cleandoc
from io import StringIO
s = '''
Site_Reference LA_Reference Start_Date eastings northings
0 380500145 NaN 20130101 105175.0 105175.0
1 380500128 NaN 20060331 104000.0 104000.0
2 380500085 NaN 20030401 105055.0 105055.0
3 380500008 NaN 19980930 108480.0 108480.0
4 380500009 NaN 19980930 105415.0 105415.0
5 380500136 SHLAA 20100101 105081.0 105081.0
6 380500038 NaN 19980930 105818.0 105818.0
'''
s = cleandoc(s)
df = pd.read_csv(StringIO(s), sep = '\s+')
print(df)
Site_Reference LA_Reference Start_Date eastings northings
0 380500145 NaN 20130101 105175 105175
1 380500128 NaN 20060331 104000 104000
2 380500085 NaN 20030401 105055 105055
3 380500008 NaN 19980930 108480 108480
4 380500009 NaN 19980930 105415 105415
5 380500136 SHLAA 20100101 105081 105081
6 380500038 NaN 19980930 105818 105818
def proj_transform(df):
bng = pyproj.Proj("+init=EPSG:27700")
wgs84 = pyproj.Proj("+init=EPSG:4326")
lats = pd.Series()
lons = pd.Series()
for idx, val in enumerate(df['eastings']):
lon, lat = pyproj.transform(bng,wgs84,df['eastings'][idx], df['northings'][idx])
lats.set_value(idx, lat)
lons.set_value(idx, lon)
df['lat'] = lats
df['lon'] = lons
return df
df_transformed = proj_transform(df)
print(df_transformed)
Site_Reference LA_Reference Start_Date eastings northings lat lon
0 380500145 NaN 20130101 105175 105175 50.771035 -6.183048
1 380500128 NaN 20060331 104000 104000 50.759899 -6.198721
2 380500085 NaN 20030401 105055 105055 50.769898 -6.184649
3 380500008 NaN 19980930 108480 108480 50.802348 -6.138924
4 380500009 NaN 19980930 105415 105415 50.773309 -6.179846
5 380500136 SHLAA 20100101 105081 105081 50.770144 -6.184302
6 380500038 NaN 19980930 105818 105818 50.777128 -6.174468