ES:Uruguay/Importación del STM

From OpenStreetMap Wiki
Jump to navigation Jump to search

Esquema plan de importación

Objetivos

Importar las líneas del Sistema de Transporte Metropolitano que son provistas como datos abiertos.

Calendario

Hay que recibir comentarios.

Importar datos

Fuentes

Paradas de ómnibus y líneas geográficas de ómnibuses

Horarios de ómnibus (más actualizado y como verificación)


Adicionalmente, se usa una tabla hecha por MaxMz para la importación de calles; como base para arreglar nombres.


Tipo de importación

Es una importación de una sola vez (actualiza paradas y agrega las líneas).

Los datos se procesan y combinan con el mapa mediante scripts. Tanto los datos como los scripts tienen/hacen correcciones sobre los datos originales.

Planeo subir el mapa generado a OSM mediante JOSM (siguiendo Import/Guidelines y Automated_Edits_code_of_conduct).


Preparación de datos

Reducción y simplificación de datos

Paradas

No hay mucha simplificación que hacer ya que cada parada es un nodo real.

Lo que se hace es buscar las paradas que ya están mediante la referecia de la importación anterior (source:pkey=*) o las que fueron actualizadas (ref=*) y se aplican las modificaciones sobre esos nodos.

Líneas

Se evitan las líneas ya presentes en el mapa, que son solo dos: el 145, y el 409, (el bus turístico ya no estaba en los datos)


Planes de etiquetado

El etiquetado sigue lo descrito en Buses

Etiquetas de cambios

El usuario que subiría el mapa sería "STM_Import". Etiquetas:

import=yes

comment=Importación de datos del Sistema de Transporte Metropolitano

description="https://wiki.openstreetmap.org/wiki/ES:Uruguay/Importación_del_STM"


Transformación de datos

Herramientas utilizadas

  • lua: lenguaje de programación usado
  • slaxml: para leer y escribir archivos XML
  • mapshaper: para convertir los archivos shapefile a archivos de texto
  • graphhopper: para hacer coincidir las trazas GPS al mapa
  • osmfilter: para simplificar la búsqueda de ways

Paradas

Del archivo paradas.xml se extraen las coordenadas y el nombre. El nombre (calle y esquina) está en mayúsculas, por lo que se pasa al estilo correcto: mayúsculas iniciales (por ser nombres propios) con excepciones (tildes, eñes, "y", "de", etc.) que se encuentran en la tabla mencionada. Luego se combinan al formato "calle y esquina".

  • Primero se arreglan unas paradas que contienen ambas etiquetas de referencia (source:pkey=* y ref=*): se elimina la etiqueta ref=*, que al revisar estas paradas en el mapa se determinó que la referencia real seguía en source:pkey=*.
  • Paradas que tienen la etiqueta source:pkey=* (y todas las etiquetas innecesarias): se asume que estas paradas son las de la primera importación
    • Si no están en los datos, se eliminan
    • Si están en los datos: se eliminan las etiquetas innecesarias, se reemplaza la etiqueta de referencia, se le agrega el nombre, se le agrega una etiqueta de parada de bus (¿necesario?), y si sigue siendo la primera revisión, se actualiza la ubicación
  • Finalmente se agregan las paradas que están en los datos pero no en el mapa

Líneas

Para los nombres

Se extrajo una lista preliminar de los nombres de las líneas del archivo de líneas y se corrigieron (abreviaciones, mayúsculas, etc.) a mano.

Como estos nombres no están ordenados de la manera origen a destino, fueron procesados con Nominatim. Para esto se extrajeron las coordenadas inicial y final de cada línea (variante) y se combinaron con los nombres en comandos de búsqueda automatizada de Nominatim. Luego se ejecutaron las búsquedas. En los casos que el resultado de la búsqueda fue sencillo (si es correcto, hubo un resultado en el comando con el orden preliminar, si está invertido, el resultado está en el comando invertido) se actualizó el orden automáticamente. El resto de casos, se revisaron manualmente (acelerado con un script)

Para el recorrido
  • Se extraen las coordenadas del archivo de líneas y se escriben en archivos .gpx que son alineados al mapa con mapshaper en un mapa ligeramente modificado (sin restricciones de acceso ni calles problemáticas para la alineación) y luego son leídos y guardados en un archivo.
  • Se reduce el mapa con osmfilter para simplificar el trabajo de recorrer el camino. En el script se leen datos del mapa y las líneas. Por cada variante:
    • Se busca el nodo más cercano a cada punto del GPX alineado. Para los puntos inicial y final (que no coinciden con nodos) se busca el nodo más cercano y más alineado a partir del segundo/penúltimo nodo.
    • Se recorren los nodos del inicio al final de los datos.
      • Avanza de un nodo a otro mediante algún way del nodo actual, moviéndose en la dirección del nodo siguiente.
      • Se elije (y guarda) el nodo y el way más alineado.
      • Si hay un cambio de way (en medio de un way), se guarda donde ocurre.
  • Se dividen los ways adecuados. Para eso se recorren los ways a partir del inicio al final, pero cuando se encuentra el nodo a partir
    • Se crea un nuevo way con las mismas etiquetas y se le empiezan a cargar los nodos siguientes del way original, mientras se eliminan los siguientes al encontrado del original
    • Al terminar con un way, se actualizan las relaciones que lo involucran: se manejan las relaciones que están actualmente en el mapa:
      • Restricciones: se busca cuál way (si el nuevo o el viejo) from/to coincide con el via.
      • Para el resto de relaciones: se busca que coincida el way original con el anterior de la relación (o el nuevo con el siguiente); si coincide el original con el siguiente, está invertido; si no coincide nada, solamente se inserta en la relación.
    • Se recorren los nodos del inicio al final de los datos. Nuevamente, esta vez con el mapa correctamente partido.
  • Para agregar las rutas:
    • Se leen las paradas, y se obtienen sus las referencias, también se buscan estas paradas en el mapa para obtener sus identificadores.
    • Para leer los horarios:
      • Se lee cada tiempo de salida y tiempo final (se leen todos y se guarda el último) por cada variante.
      • Se combinan un periodo con el siguiente si uno empieza antes de que el otro termine, si no pasa una hora, o si hay un espacio menor a 4 veces la frecuencia (para reducir la cantidad de intervalos).
    • Se combinan los datos (si no está registrado en los horarios, o no tiene la línea GPS, se omite) para agregar las relaciones route, y route_master.

Código utilizado

https://github.com/VicSanRoPe/STM_Import

Resultados de la transformación de datos

Archivo OSM XML resultante: https://raw.githubusercontent.com/VicSanRoPe/STM_Import/master/MontevideoConBuses.osm.zip


Flujo de trabajo para combinar datos

Notas

  • Hay algunas paradas marcadas con highway=bus_stop pero no con public_transport=platform, la información que estas tengan se combinarían con las paradas coincidentes con referencia, a mano
  • Hay que arreglar algunas líneas manualmente (graphhopper se confunde a veces)


Flujo de trabajo

  • Verificar errores que puedan haber: primero los corregibles mediante el mapa para alineación o los scripts; y segundo los arreglos manuales
  • Política de tamaño de los cambios: un changeset (también podrían ser 2: las paradas actualizadas, y las líneas)
  • Planes para revertir: Revert_scripts, supongo