我有一个Geopandas GeoDataframe,代表美国大陆各州。我想通过非平凡的映射将所有坐标转换为不同的坐标系。
我的计划是做类似的事情(这只是一个简单的测试,而不是真正的转换):
from shapely.ops import transform
def id_func(x, y):
return x-10, y
alabama = conus.iloc[0]
alabama.geometry = transform (id_func, alabama.geometry)
这不起作用,conus.geometry的值似乎没有变化。
有任何提示吗?
答案 0 :(得分:0)
shapely.ops.transform
函数可用于单个几何。例如(使用您的id_func
函数):
In [15]: from shapely.geometry import LineString
In [16]: from shapely.ops import transform
In [17]: l = LineString([(0, 0), (1, 1)])
In [18]: def id_func(x, y):
...: return x-10, y
In [20]: print(transform(id_func, l))
LINESTRING (-10 0, -9 1)
如果要将其应用于GeoSeries / GeoDataFrame中的每个几何,则需要遍历它们或应用函数:
new_geometries = [transform(id_func, geom) for geom in alabama.geometry]
顺便说一句,如果您正在寻找使用自定义函数转换几何的方法,那么仿射变换可能会很有趣:https://shapely.readthedocs.io/en/stable/manual.html#affine-transformations(而且大多数直接暴露在GeoDataFrame / GeoSeries上)
答案 1 :(得分:0)
此代码有效:
from shapely.ops import transform
def touv (x, y):
if type(x) is not float:
raise TypeError
return ll2UV (satlat, satlon, BSlat, BSlon, y, x)
for row in conus.index:
conus.at[row,'geometry'] = transform (touv, conus.loc[row,'geometry'])
看来,关键是我需要使用'.at'来执行分配。