viernes, 19 de junio de 2015

De los datos libres

Las ideas no nos pertenecen, los dueños son los que en realidad las realizan. Recuerdo alguna vez que conversaba con un amigo sobre nuestras grandiosas ideas, ideas para cambiar el mundo e impactar de verdad en la historia y comodidad de la humanidad. Al finalizar la charla constatamos que no importa lo grandiosas que sea nuestras ideas, en realidad no habíamos hecho nada.

Viajado y viviendo en el extranjero uno se pregunta sobre por qué ellos sí y por qué nosotros no, sobre muchos temas.  Y es así que comenzamos a trabajar sobre servicios que explotan la información existente para mejorar la calidad de los servicios que la gente requiere.  Una idea que da vueltas hace mucho tiempo es la de poseer información sobre el paso de las unidades de transporte público por determinada parada.  Tecnología que existe hace mucho tiempo en otros lugares y que en mi ciudad es toda una pesadilla para dar un paso hacia adelante. Ver por ejemplo que existe un planificador de viaje como el presentado por www.tisseo.fr que nos permite especificar la hora de partida o de llegada, y nos muestra varias posibilidades permutando las líneas de transporte existentes; y comparar eso con mi ciudad en donde ni siquiera las rutas de los buses se pueden encontrar en Internet.

Es por eso que decidí tratar de utilizar mis conocimientos para proporcionar una solución a este problema.
Se trata de un sistema que permite enlazar un punto de partida y otro de llegada mediante varias de las líneas de transporte existente.

PASOS
1. Obtener datos (geometría) de las calles por donde pasan los buses.
2. Generar la geometría de las líneas de transporte. Una línea pasa por una secuencia de calles, en teoría podemos armar la ruta completa basados en las calles y sus intersecciones.
3. Generar el sistema recomendador  que se basa en la líneas existentes.
4. Refinar el problema mediante la agregación de restricciones adicionales como horarios de pasada, desvíos, y retardos.

AVANCE
1. Obtener la geometría.
Varias instituciones del gobierno han utilizado recursos para generar información cartográfica de la ciudad. El acceso a esta información es difícil y esta sujeto a gran cantidad de procesos burocráticos. Pero, sabemos que la información esta presentada utilizando un servidor ArcIMS. Este servidor permite publicar imágenes de mapas con un formato propietario, como si se tratará de un servicio Web Map Service (WMS) o Web Features Service (WFS).

Se debe enviar una petición post al host que alberga el servidor ArcIMS.
POST /servlet/com.esri.esrimap.Esrimap?ServiceName=nombreServicio&CustomService=Query&ClientVersion=4.0&Form=True&Encode=False

Se debe revisar el tipo de objeto ARCXML que se envía al servidor.
Por ejemplo una petición es:

"< arcxml version="1.1">
    < request>
        < get_features checkesc="true" envelope="false" featurelimit="25" geometry="false" outputmode="xml">
        < layer id="10">
        < spatialquery subfields="NOMENCLATU NOMBRE_APE">
           
               
           

        < /spatialquery>
        < /layer>< /get_features>
    < /request>"

Y una respuesta que llega sobre HTTP es:

"< arcxml version="1.1">

  < features>
    < feature>
      < fields nombre_ape="DIEZ DE AGOSTO" nomenclatu="LS-29">
    < /fields>< /feature>
  < featurecount count="1" hasmore="false">
  < /featurecount>< /features>< /response>"
Con estos mecanismos, se desarrolla un programa que se encarga de recoger las calles de la ciudad.

Postgres

psql
\connect nombrebd


ST_Distance(geometry g1, geometry g2);


SELECT ST_Distance(
    ST_Transform(ST_GeomFromText('POINT(-72.1235 42.3521)',4326),32717),
    ST_Transform(ST_GeomFromText('LINESTRING(-72.1260 42.45, -72.123 42.1546)', 4326),32717)
  );
st_distance
en metros 
 
 
# SELECT PostGIS_version();
            postgis_version            
---------------------------------------
 2.1 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)