Импортировать тип геометрии PostGIS в Python как тип геометрии из Shapely?

Таким образом, у меня есть ситуация, когда у меня есть тонна линий строк с разбитым маршрутом, где мне нужно объединить их, используя Shapely's LineMerge или Union OR PostGIS ST_Union.

Моя идея сейчас состоит в том, чтобы использовать Shapely для импорта строк в виде типов геометрии. Объедините их или объедините с помощью Shapely, а затем экспортируйте обратно в таблицу результатов в базе данных.

Тем не менее, тип геометрии в базе данных PostGIS - это всего лишь кучка толку. Подобно...

01020000020e61000....

Как я могу перевести это из базы данных в тип геометрии Python, используя Shapely, выполнить некоторые манипуляции, а затем экспортировать его обратно в базу данных?

В настоящее время это мой код, он просто импортирует эту строку объекта geom из базы данных и выдает ошибки, потому что это не тип Geometry.

def create_shortest_route_geom(shortest_routes):
    conn = connect_to_database()
    cur = conn.cursor()
    shortest_route_geoms = []
    for route in shortest_routes:
        source = str(int(route[1]))
        target = str(int(route[2]))
        query = 'SELECT the_geom FROM public.ways WHERE target_osm = ' + target + ' AND source_osm = ' + source + ' OR target_osm = ' + source + ' AND source_osm = ' + target + ';'
        cur.execute(query)
        total_geom = cur.fetchone()
        for index, node in enumerate(route):
            try:
                source = str(int(node))
                target = str(int(route[index + 1]))
                query = 'SELECT the_geom FROM public.ways WHERE target_osm = ' + target + ' AND source_osm = ' + source + ' OR target_osm = ' + source + ' AND source_osm = ' + target + ';'
                cur.execute(query)
                geom = cur.fetchone()
                query = "SELECT ST_Union("+str(geom[0])+","+str(total_geom[0])+")"
                cur.execute(query)
                total_geom = cur.fetchone()
            except IndexError:
                print "Last element"
        shortest_route_geoms.insert(total_geom)
    return shortest_route_geoms

РЕДАКТИРОВАТЬ: Я мог бы найти свой ответ здесь, более подробно изучить его, и обновлю свой вопрос с ответом, если я выясню это.

1 ответ

Решение

У Shapely уже есть библиотеки для этой конкретной проблемы.

PostGIS сохраняет геометрию как значения HEX. Используйте функцию загрузки Shapely, чтобы загрузить это с параметром hex=True.

В частности...

geom = shapely.wkb.loads(hex_geom[0], hex=True)

Не используйте PostGIS ST_Union, потому что для этого нужно многократно выгружать и загружать. Shapely настроил это также с linemerge

Другие вопросы по тегам