2017-10-18 13 views
0

Donc, j'ai une situation où j'ai une tonne de lignes de lignes d'une route brisée, où j'ai besoin de les unir ensemble en utilisant Shapely LineMerge ou Union OU PostGIS ST_Union.Importer un type de géométrie PostGIS dans Python en tant que type de géométrie à partir de Shapely?

Mon idée maintenant est d'utiliser Shapely pour importer le Linestrings en tant que types de géométrie. Associez-les ou fusionnez-les à l'aide de Shapely, puis réexportez-les vers une table de résultats dans la base de données.

Cependant, le type de géométrie dans la base de données PostGIS est juste un tas de charabia. Comme ...

01020000020e61000.... 

Comment puis-je traduire de la base de données à un type de géométrie Python à l'aide Shapely, faire quelques manipulations, puis l'exporter de nouveau à une base de données?

Actuellement, il s'agit de mon code, il s'agit simplement d'importer la chaîne d'objet geom de la base de données et de lancer des erreurs car ce n'est pas un type de géométrie.

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 

EDIT: I may have found my answer here, looking more into it and will update my question with an answer if I figure this out.

+0

Au lieu de chaînes de concaténation de valeurs à des requêtes SQL s'il vous plaît utiliser des espaces réservés. Rend le code plus lisible, supprime le besoin de gérer manuellement les citations et réduit le risque d'injections en général. –

Répondre

1

Shapely already has libraries for this specific problem.

PostGIS stocke les géométries en tant que valeurs HEX. Utilisez la fonction load de Shapely pour charger ceci avec le paramètre hex = True.

... Plus précisément

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

Ne pas utiliser PostGIS ST_Union, parce que vous devez charger et décharger à plusieurs reprises pour que cela fonctionne. Shapely a également configuré avec linemerge