地理熊猫分配给几何

时间:2019-05-21 18:32:43

标签: python pandas geopandas shapely

我有一个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的值似乎没有变化。

有任何提示吗?

2 个答案:

答案 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'来执行分配。