2 votos

Generar una base de datos de rutas para todo el mundo manteniendo las etiquetas

Llevo unos días investigando este asunto, pero no he dado con una solución que funcione.

Básicamente, lo que estamos tratando de hacer es crear una base de datos mundial completa, preferiblemente en PostgreSQL, utilizando PostGIS. Nuestro archivo del mundo es la totalidad de los datos del planeta, en formato pbf (~34GB).

Hasta ahora, he intentado utilizar las herramientas osm2pgrouting y osm2po para generar esta base de datos, pero ambas herramientas fallaron para la configuración que estamos utilizando.

Nuestra máquina es un linux x64 ubuntu-server, con 20 GB de RAM más 20 GB de área de intercambio. Estamos utilizando un HHD de 2TB para esto.

En mi último intento con osm2po, intenté ejecutarlo con 18 GB de ram ( -Xmx18432m ), pero falló después de algún tiempo. Lo intentaré de nuevo con más memoria asignada a la máquina virtual de java e informaré de los resultados.

Pero principalmente, mis principales preguntas aquí son:

  • ¿Es posible generar una base de datos de rutas para todo el mundo con estas herramientas y nuestra máquina actual?
  • ¿Es la asignación de RAM la única optimización que puedo hacer para que osm2po pueda manejar archivos grandes?
  • ¿Puede osm2po guardar las etiquetas de los nodos en la base de datos PostgreSQL? Sé que esto es posible para la tabla ways, ya que ya existe en la base de datos e incluso tiene una columna llamada osm_meta Y también sé que es posible recuperar esta información mientras se lee el archivo de datos osm, pero supongo que estos datos sólo estarán disponibles para la parte del front-end de osm2po.

1voto

Athena Puntos 2149

Yo pude importar un archivo planetario completo en unos 5 días usando osm2pgsql con casi las mismas especificaciones de máquina que tú.

Podrías hacer eso, y luego usar el PGRouting Calcular la topología (además de la otra información en esa página) para construir su red.

Esto tiene la ventaja añadida de proporcionarle una base de datos PostGis con todas las etiquetas para utilizarla en las consultas o en el renderizado de mapas.

Echa un vistazo a Esta entrada del blog pero tenga en cuenta que debe cambiar la declaración de creación de la tabla por la siguiente:

create table network(gid bigserial, osm_id bigint, name varchar, the_geom geometry, source bigint, target bigint, length float);

La instalación de PGSql es una brisa en Trusty, con Postgres 9.3 hice lo siguiente:

sudo apt-get install postgresql-9.3-pgrouting
sudo apt-get update

psql -U username -d dbname
CREATE EXTENSION pgrouting;
/q

Luego ejecuté el Sql de la entrada del blog anterior para dividir los caminos en segmentos enrutables y crear un gráfico de red, sin embargo me encontré con que tenía que modificarlo para que no fallara en los errores y quitar las NOTAS, así que esto es lo que usé

drop table if exists network;
create table network(gid bigserial, osm_id bigint, name varchar, the_geom geometry, source bigint, target bigint, length float);

CREATE OR REPLACE FUNCTION compute_network() RETURNS text as $$
DECLARE
streetRecord record;
wayRecord record;
pointCount integer;
pointIndex integer;
geomFragment record;
BEGIN
-- for each street

--FOR streetRecord in select way, osm_id, name from planet_osm_line where highway is not null and st_contains((select way from planet_osm_polygon where boundary = 'administrative' and name like 'Sector 1' limit 1), way) LOOP

    FOR streetRecord in select way, osm_id, name from planet_osm_line where highway is not null LOOP

   -- for each street in the region of interest
   SELECT * from planet_osm_ways where id = streetRecord.osm_id into wayRecord; 

   BEGIN
       FOR pointIndex in array_lower(wayRecord.nodes, 1)..array_upper(wayRecord.nodes,1)-1 LOOP
           -- RAISE NOTICE 'Inserting name % source %, target %', streetRecord.name, wayRecord.nodes[pointIndex], wayRecord.nodes[pointIndex+1];
           select st_makeline(st_pointn(streetRecord.way, pointIndex), st_pointn(streetRecord.way, pointIndex+1)) as way into geomFragment;
           insert into network(osm_id, name, the_geom, source, target, length) values(streetRecord.osm_id, streetRecord.name, geomFragment.way, wayRecord.nodes[pointIndex], wayRecord.nodes[pointIndex+1], st_length(geomFragment.way));
       END LOOP;
   EXCEPTION
       WHEN OTHERS THEN
                RAISE NOTICE 'ERROR: on streetRecord Id - % - Name < % >' ,streetRecord.osm_id,  streetRecord.name;
   END;
END LOOP;

 return 'Done';
END;
$$ LANGUAGE 'plpgsql';

select * from compute_network();

El blog también es incorrecto, no utiliza assign_vertex, debería ser

SELECT pgr_createTopology('network', 0.00001, 'the_geom', 'gid');

Todavía no he hecho ninguna ruta. Te sugiero que lo pruebes primero en un pequeño extracto del país. Haremos todo el planeta eventualmente cuando esté seguro de que tengo suficiente espacio en el disco para el gráfico de la red.

0voto

Fh. Puntos 225

Hace un mes un amigo me pidió que convirtiera la topología de todas las calles transitables del archivo planet con osm2po. Finalmente nos pusimos de acuerdo en excluir las autopistas pero incluir todo lo que va desde el tronco hasta la vía. Me llevó unas 5 horas en (no me pidas detalles) un servidor linux dedicado con 24Gig de RAM. Vale, osm2po hace muchas cosas de preprocesamiento y aplica filtros para reducir los datos lo antes posible. Si realmente necesitas cada pieza de información, tienes que volver a la base de datos y tienes que esperar días, no horas.

Usted preguntó ¿Es la asignación de RAM la única optimización que puedo hacer para que osm2po pueda manejar archivos grandes? ...

No hay una estrategia de inclinación que se necesita exactamente aquí

Usted preguntó ¿Puede osm2po guardar las etiquetas de los nodos? ...

Depende de lo que vayas a convertir. Casos sencillos como tener en cuenta los bolardos o las señales de tráfico son posibles y se escribirán en el SQL respectivamente.

0voto

Mia Puntos 6

Así que, después de seguir Carsten de los comentarios, por fin pude generar una base de datos de rutas para todo el mundo.

El truco consistía en utilizar el tileSize argumento de la línea de comandos de osm2po . Los valores reales que utilicé fueron java -Xmx8192m -jar osm2po-core-4.8.8-signed.jar prefix=world tileSize=10x10,1.0 planet-140430.osm.pbf en caso de que te lo preguntes.

Esto generó un script sql de 44GB (14GB comprimido). osm2po también mantiene la identificación de los nodos OSM originales en las columnas osm_source_id y osm_target_id que me da los medios para consultar las etiquetas de un osm2pgsql base de datos generada.

Desafortunadamente, no pude hacer una base de datos de enrutamiento optimizada de Marca C de la sugerencia del Sr. G., y no creo que haya una manera fácil de hacerlo siguiendo ese camino.

Gracias a todos por el apoyo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X