如何转换坐标以在 GeoPandas 中使用? (例如,37_N)

How to convert coordinates for use in GeoPandas? (e.g., 37_N)

我有以下数据框:

import pandas as pd
df_coords = pd.DataFrame({'lat': {'1010': '37_N',
  '1050': '32_N',
  '1059': '19_N',
  '1587': '6_S',
  '3367': '44_N'},
 'lon': {'1010': '65_W',
  '1050': '117_W',
  '1059': '156_W',
  '1587': '106_E',
  '3367': '12_E'}})

我正在尝试转换这些坐标,以便构建一个 GeoPandas 数据框对象,但我似乎无法弄清楚如何转换字符串。

import geopandas as gpd
gpd.points_from_xy(x=["37_N"], y=["65_W"])
# ---------------------------------------------------------------------------
# ValueError                                Traceback (most recent call last)
# <ipython-input-36-a02c9f8a011d> in <module>
# ----> 1 gpd.points_from_xy(x=["37_N"], y=["65_W"])

# ~/anaconda3/envs/soothsayer_py3.8_env/lib/python3.8/site-packages/geopandas/array.py in points_from_xy(x, y, z, crs)
#     256     output : GeometryArray
#     257     """
# --> 258     return GeometryArray(vectorized.points_from_xy(x, y, z), crs=crs)
#     259 
#     260 

# ~/anaconda3/envs/soothsayer_py3.8_env/lib/python3.8/site-packages/geopandas/_vectorized.py in points_from_xy(x, y, z)
#     241 def points_from_xy(x, y, z=None):
#     242 
# --> 243     x = np.asarray(x, dtype="float64")
#     244     y = np.asarray(y, dtype="float64")
#     245     if z is not None:

# ~/anaconda3/envs/soothsayer_py3.8_env/lib/python3.8/site-packages/numpy/core/_asarray.py in asarray(a, dtype, order)
#      83 
#      84     """
# ---> 85     return array(a, dtype, copy=False, order=order)
#      86 
#      87 

# ValueError: could not convert string to float: '37_N'

谁能描述一下如何将 N,S,W,E 信息转换为 GeoPandas 的实际坐标?

您需要将经度和纬度值映射到 -180 and 180 之间的范围内。 Here geopandas 文档

这是一个函数。

def convert_value(value):

    if value.endswith('_N') or value.endswith('_E'):

        return int(value[:-2])

    if value.endswith('_S') or value.endswith('_W'):

        return -int(value[:-2])

输入要转换的值,例如“12_W”。该函数将 return "-12"。不能保证什么值应该是负值,什么值应该是正值。我只是在最有意义的地方设置了减号。

geopandas.points_from_xy(value_longitude, value_latitude, crs="EPSG:4326")