【发布时间】:2020-04-05 21:54:37
【问题描述】:
我有以下字符串,其中包含不同 poligons 的坐标[x,y],[x,y]...
test3 = [(39.414604,-7.021836),(39.814045,-4.073939),(41.315235,-4.384754),(40.917038,-7.398971),(39.414604,-7.021836)],[(38.844185,-4.804621),(39.241299,-1.899833),(40.74308,-2.205491),(40.34742,-5.17429),(38.844185,-4.804621)],[(40.347511,-5.174313),(40.743309,-2.20434),(42.242691,-2.530139),(41.847603,-5.569263),(40.347511,-5.174313)],[(39.365192,-1.941078),(40.867912,-1.567062),(41.276688,-4.670904),(39.775406,-4.976737),(39.365192,-1.941078)],[(39.706161,-1.849863),(41.207623,-1.465817),(41.617561,-4.594476),(40.117233,-4.908839),(39.706161,-1.849863)],[(39.702591,-5.033657),(40.101254,-2.077048),(41.602196,-2.389729),(41.204681,-5.413605),(39.702591,-5.033657)],[(40.502308,-3.713448),(42.002708,-3.320609),(42.411217,-6.481188),(40.911678,-6.801756),(40.502308,-3.713448)],[(38.999126,-4.084739),(40.50222,-3.713471),(40.911449,-6.800602),(39.409878,-7.104931),(38.999126,-4.084739)],[(39.706161,-1.849863),(41.207623,-1.465817),(41.617561,-4.594476),(40.117233,-4.908839),(39.706161,-1.849863)]
当检查test3的输出时,它带有'和'' at the begining and end (this can be avoided by usingprint(test3)`
> test3
'[(39.414604,-7.021836),(39.814045,-4.073939),(41.315235,-4.384754),(40.917038,-7.398971),(39.414604,-7.021836)],[(38.844185,-4.804621),(39.241299,-1.899833),(40.74308,-2.205491),(40.34742,-5.17429),(38.844185,-4.804621)],[(40.347511,-5.174313),(40.743309,-2.20434),(42.242691,-2.530139),(41.847603,-5.569263),(40.347511,-5.174313)],[(39.365192,-1.941078),(40.867912,-1.567062),(41.276688,-4.670904),(39.775406,-4.976737),(39.365192,-1.941078)],[(39.706161,-1.849863),(41.207623,-1.465817),(41.617561,-4.594476),(40.117233,-4.908839),(39.706161,-1.849863)],[(39.702591,-5.033657),(40.101254,-2.077048),(41.602196,-2.389729),(41.204681,-5.413605),(39.702591,-5.033657)],[(40.502308,-3.713448),(42.002708,-3.320609),(42.411217,-6.481188),(40.911678,-6.801756),(40.502308,-3.713448)],[(38.999126,-4.084739),(40.50222,-3.713471),(40.911449,-6.800602),(39.409878,-7.104931),(38.999126,-4.084739)],[(39.706161,-1.849863),(41.207623,-1.465817),(41.617561,-4.594476),(40.117233,-4.908839),(39.706161,-1.849863)]'
我想用这个字符串作为坐标信息来绘制交互式地图中的多边形。为此,我使用以下代码,特别是需要 list 输入的 locations 参数
from ipyleaflet import Map, Polygon
polygon = Polygon(
locations=[test3],
color="green",
fill_opacity= 0.5,
fill_color="green"
)
m = Map(center=(38.5531, -4.6914), zoom=6)
m.add_layer(polygon);
m
问题在于[test3] 等于:(注意开头的['[ 和结尾的]']
['[(39.414604,-7.021836),(39.814045,-4.073939),(41.315235,-4.384754),(40.917038,-7.398971),(39.414604,-7.021836)],[(38.844185,-4.804621),(39.241299,-1.899833),(40.74308,-2.205491),(40.34742,-5.17429),(38.844185,-4.804621)],[(40.347511,-5.174313),(40.743309,-2.20434),(42.242691,-2.530139),(41.847603,-5.569263),(40.347511,-5.174313)],[(39.365192,-1.941078),(40.867912,-1.567062),(41.276688,-4.670904),(39.775406,-4.976737),(39.365192,-1.941078)],[(39.706161,-1.849863),(41.207623,-1.465817),(41.617561,-4.594476),(40.117233,-4.908839),(39.706161,-1.849863)],[(39.702591,-5.033657),(40.101254,-2.077048),(41.602196,-2.389729),(41.204681,-5.413605),(39.702591,-5.033657)],[(40.502308,-3.713448),(42.002708,-3.320609),(42.411217,-6.481188),(40.911678,-6.801756),(40.502308,-3.713448)],[(38.999126,-4.084739),(40.50222,-3.713471),(40.911449,-6.800602),(39.409878,-7.104931),(38.999126,-4.084739)],[(39.706161,-1.849863),(41.207623,-1.465817),(41.617561,-4.594476),(40.117233,-4.908839),(39.706161,-1.849863)]']
我的问题是:如何在test3 的开头和结尾去掉那个',以便在执行[test3] 时,输入正确 - as [[x,y],[x,y],...,[x,y]]
-- 编辑-- test3 去哪了?
以dataframe开头:
df['Footprint']
0 MULTIPOLYGON (((-6.854965 38.740932,-3.940099 ...
1 MULTIPOLYGON (((-7.021836 39.414604,-4.073939 ...
2 MULTIPOLYGON (((-4.804621 38.844185,-1.899833 ...
3 MULTIPOLYGON (((-5.174313 40.347511,-2.20434 4...
4 MULTIPOLYGON (((-1.941078 39.365192,-1.567062 ...
5 MULTIPOLYGON (((-1.849863 39.706161,-1.465817 ...
6 MULTIPOLYGON (((-5.033657 39.702591,-2.077048 ...
7 MULTIPOLYGON (((-3.713448 40.502308,-3.320609 ...
8 MULTIPOLYGON (((-4.084739 38.999126,-3.713471 ...
9 MULTIPOLYGON (((-3.870231 39.827106,-3.49322 4...
Name: Footprint, dtype: object
接下来,我将坐标的顺序从(x,y)倒转为(y,x)
test2 = df['Footprint'].map(lambda polygon: shapely.ops.transform(lambda x, y: (y, x), shapely.wkt.loads(polygon)))
test2
0 (POLYGON ((38.740932 -6.854965, 39.140369 -3.9...
1 (POLYGON ((39.414604 -7.021836, 39.814045 -4.0...
2 (POLYGON ((38.844185 -4.804621, 39.241299 -1.8...
3 (POLYGON ((40.347511 -5.174313, 40.743309 -2.2...
4 (POLYGON ((39.365192 -1.941078, 40.867912 -1.5...
5 (POLYGON ((39.706161 -1.849863, 41.207623 -1.4...
6 (POLYGON ((39.702591 -5.033657, 40.101254 -2.0...
7 (POLYGON ((40.502308 -3.713448, 42.002708 -3.3...
8 (POLYGON ((38.999126 -4.084739, 40.50222 -3.71...
9 (POLYGON ((39.827106 -3.870231, 41.329609 -3.4...
Name: Footprint, dtype: object
接下来,我创建一个包含坐标的字符串列表:
geom_str = []
for i in test2: # same for multipolygon.geoms
test = str(i)
geom_str.append(test)
geom_str
['MULTIPOLYGON (((38.740932 -6.854965, 39.140369 -3.940099, 40.6422 -4.245644, 40.244202 -7.224669, 38.740932 -6.854965)))',
'MULTIPOLYGON (((39.414604 -7.021836, 39.814045 -4.073939, 41.315235 -4.384754, 40.917038 -7.398971, 39.414604 -7.021836)))',
'MULTIPOLYGON (((38.844185 -4.804621, 39.241299 -1.899833, 40.74308 -2.205491, 40.34742 -5.17429, 38.844185 -4.804621)))',
'MULTIPOLYGON (((40.347511 -5.174313, 40.743309 -2.20434, 42.242691 -2.530139, 41.847603 -5.569263, 40.347511 -5.174313)))',
'MULTIPOLYGON (((39.365192 -1.941078, 40.867912 -1.567062, 41.276688 -4.670904, 39.775406 -4.976737, 39.365192 -1.941078)))',
'MULTIPOLYGON (((39.706161 -1.849863, 41.207623 -1.465817, 41.617561 -4.594476, 40.117233 -4.908839, 39.706161 -1.849863)))',
'MULTIPOLYGON (((39.702591 -5.033657, 40.101254 -2.077048, 41.602196 -2.389729, 41.204681 -5.413605, 39.702591 -5.033657)))',
'MULTIPOLYGON (((40.502308 -3.713448, 42.002708 -3.320609, 42.411217 -6.481188, 40.911678 -6.801756, 40.502308 -3.713448)))',
'MULTIPOLYGON (((38.999126 -4.084739, 40.50222 -3.713471, 40.911449 -6.800602, 39.409878 -7.104931, 38.999126 -4.084739)))',
'MULTIPOLYGON (((39.827106 -3.870231, 41.329609 -3.49322, 41.739006 -6.624273, 40.237854 -6.931492, 39.827106 -3.870231)))']
接下来,我删除了一些不必要的字符:
extent = []
for i in range(len(geom_str)):
test = geom_str[i]
test = test.replace('MULTIPOLYGON (((', '(')
test = test.replace(')))', ')')
test = test.replace(', ', ')')
test = test.replace(')', '),(')
test = test.replace(' ', ',')
test = str(test)[:-2]
extent.append(test)
extent
['(38.740932,-6.854965),(39.140369,-3.940099),(40.6422,-4.245644),(40.244202,-7.224669),(38.740932,-6.854965)',
'(39.414604,-7.021836),(39.814045,-4.073939),(41.315235,-4.384754),(40.917038,-7.398971),(39.414604,-7.021836)',
'(38.844185,-4.804621),(39.241299,-1.899833),(40.74308,-2.205491),(40.34742,-5.17429),(38.844185,-4.804621)',
'(40.347511,-5.174313),(40.743309,-2.20434),(42.242691,-2.530139),(41.847603,-5.569263),(40.347511,-5.174313)',
'(39.365192,-1.941078),(40.867912,-1.567062),(41.276688,-4.670904),(39.775406,-4.976737),(39.365192,-1.941078)',
'(39.706161,-1.849863),(41.207623,-1.465817),(41.617561,-4.594476),(40.117233,-4.908839),(39.706161,-1.849863)',
'(39.702591,-5.033657),(40.101254,-2.077048),(41.602196,-2.389729),(41.204681,-5.413605),(39.702591,-5.033657)',
'(40.502308,-3.713448),(42.002708,-3.320609),(42.411217,-6.481188),(40.911678,-6.801756),(40.502308,-3.713448)',
'(38.999126,-4.084739),(40.50222,-3.713471),(40.911449,-6.800602),(39.409878,-7.104931),(38.999126,-4.084739)',
'(39.827106,-3.870231),(41.329609,-3.49322),(41.739006,-6.624273),(40.237854,-6.931492),(39.827106,-3.870231)']
接下来,我在每个 (x,y) 坐标的开头添加[]:
extent2 = []
for i in range(len(extent)):
test = '[' + extent[i] + '],'
extent2.append(test)
接下来,我在最后删除一些不必要的字符:
extent2[len(extent2)-1] = str(extent2[5])[:-1]
接下来,我将所有索引连接在一起(此步骤我想在 FOR LOOP 中进行转换)
test = [extent2[1]+extent2[2]+extent2[3]+extent2[4]+extent2[5]+extent2[6]+extent2[7]+extent2[8]+extent2[9]]
最后,我得到了test3,如下:
test3 = str(test).replace("['[", '[')
test3 = str(test3).replace("]']", ']')
test3
【问题讨论】:
-
test3 = eval(test3)? -
test3来自哪里?你真的像问题开头那样定义它吗? -
@ArcturusB 我已添加并编辑问题以显示 test3 的来源。
-
@CDJB 很好的解决方案。我已经编辑了问题以添加
test3的来源,以防我可以在清理/准备数据时解决此问题。 -
@GCGM 鉴于您已经拥有该代码,我会说这是最好的方法 - 可能有一个函数可以从 Polygon 对象中提取坐标作为元组,但最好发布作为另一个问题。很高兴它有帮助:)