геопанда присваивается геометрии - PullRequest
0 голосов
/ 21 мая 2019

У меня есть геопанда 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 голосов
/ 30 мая 2019

Этот код работает:

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» для выполнения назначения.

0 голосов
/ 25 мая 2019

Функция shapely.ops.transform работает с геометрией single . Например (используя вашу функцию 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 )

...