我有一个观察数据集,其中包含(纬度,经度)数据作为字符串,格式如下:
'POINT (30.6280359000000004 -96.3051219999999972)'
'POINT (40.7815247999999997 -74.0058204000000046)'
我试图将这些字符串解析为Shapely点,以便它们可以在GeoPandas数据帧中使用。我编写了一个简单的函数来解析字符串:parse_point
。这适用于由Pandas列中的单个记录制作的单个测试字符串,以便在GeoTagStart'上运行。但是,map函数提供的错误列表索引超出范围,请参见下文。通过在代码执行时使用print,我可以看到下面的pandas map()函数将列视为单个数组或列表,而我已经理解了Pandas列上的map()函数是逐行的。行。我想出错的任何想法以及如何使这项工作?它可能很简单,但我无法看到它。
谢谢!
from shapely.geometry import Point
def parse_point(record):
pieces = record.split() # splits each record into a list of 3
x = float(pieces[1].lstrip('(')) # latitude
y = float(pieces[2].rstrip(')')) # longitude
point = Point(x,y) # convert to Shapely Point
return point
test1 = df['GeoTagStart'][3]
test2 = df['GeoTagStart'][50]
print(parse_point(test1))
assert type(parse_point(test1)) == Point # this works fine, returns shapely.geometry.point.Point
print(parse_point(test2))
assert type(parse_point(test2)) == Point # this works fine
df['new_col'] = df['momGeoTagStart'].map(lambda x: parse_point(x)) # this throws an error:
<ipython-input-5-92a2b4f58255> in <lambda>(x)
24 assert type(parse_point(test2)) == Point
25
---> 26 df['new_col'] = df['GeoTagStart'].map(lambda x: parse_point(x))
27
<ipython-input-5-92a2b4f58255> in parse_point(record)
13 def parse_point(record):
14 pieces = record.split()
---> 15 x = float(pieces[1].lstrip('('))
16 y = float(pieces[2].rstrip(')'))
17 point = Point(x,y)
IndexError: list index out of range
答案 0 :(得分:0)
您应该“初始化”坐标系
import geopandas as gpd
import folium
df = gpd.GeoDataFrame.from_file('shapefile.shx')
df.crs = {'init' :'epsg:28992'}
m = folium.Map([52,5.8],tiles='cartodbpositron', zoom_start=8)
folium.GeoJson(df).add_to(m)
m