Импортировать тип геометрии 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