@ikiMap y la edición vectorial en Android

ikiMap, comparte tus mapas, es un portal desarrollado para el intercambio de información geográfica. Es algo similar a lo que hace Youtube pero con nuestra información geográfica. Si no lo conoces te recomiendo que lo visites. Sixtema, la empresa que desarrolla ikiMap nos planteó la creación de la versión para Android de la plataforma, y eso hicimos. Una vez tuvimos los requisitos en mano, comenzamos a valorar las diferentes posibilidades que existían ya desarrolladas en las que apoyarnos. Dentro de todas las necesidades del proyecto, respecto a la parte geográfica estaban:

  • Manejo de diferentes proveedores de cartografía
  • Manejo de formato KML con simbología propia
  • Desarrollo de procesos de edición

Valoramos los diferentes proyectos de software libre que existían en ese momento tales como osmdroid, mapsforge o gvSIG Mini. Todos son proyectos muy interesantes que permiten el desarrollo de aplicaciones con mapas para Android. Nosotros nos decidimos por gvSIG Mini. Este último nos permitía:

  • Manejo de diferentes proveedores de cartografía mediante la librería TileRaster, mediante la cual podemos incorporar sencillamente los nuevos proveedores de datos
  • Capacidades de manejo de información vectorial mediante las librerías GPE
  • Gracias a una refactorización que llevamos a cabo preparabamos gvSIG Mini para la incorporación de controles de edición vectorial

Además, el tener relación con los desarrolladores de gvSIG Mini, en principio nos daba un apoyo, que a lo largo del proyecto se demostró de mucha utilidad.
Así que decidido que apoyaríamos nuestro desarrollo en el proyecto gvSIG Mini nos metimos en harina.

La primera fase del proyecto estuvo orientada a implementar la parte más social de la plataforma. Desarrollada completamente utilizando las librerías proporcionadas por la plataforma Android, tuvimos que enfrentarnos a la gestión de Intents, creación de Parcelables para el manejo de información entre actividades, peculiaridad del sistema Android, y el control de Broadcast para la detección de cambios en el estado del sistema. Sin muchos problemas, conseguimos sacar adelante esta fase.

En una segunda fase nos adentramos en el desarrollo de las capacidades geográficas de la aplicación. Las tareas a las que nos enfrentamos fueron:

    • Integración de la vista de gvSIG Mini en nuestro desarrollo
    • Gestión de las diferentes capas base requeridas
    • Manejo de la posición actual del terminal
    • Gestión de la diferente simbología de la plataforma ikiMap
    • Procesos de creación y edición de geometrías en el terminal

Así que lo primero fue extraer la vista principal, el MapView, e incorporarla a nuestra aplicación. Tras el proceso de refactorización la MapView estaba preparada para poder ser utilizada como un componente dentro del desarrollo. En principio no debía ser algo que generase muchos problemas aunque a lo largo del desarrollo surgieron algunos que comentaremos más adelante.
Para la incorporación de las diferentes capas base, encontramos que parte de las que necesitábamos no se encontraban dentro de las aportadas por la librería TileRaster. Esta librería se configura mediante la edición de un archivo de texto donde se incluyen los parametros necesarios para la capa. Por ejemplo la inserción de la capa de CloudMade Red Alert quedaría de la siguiente manera:

102|Cloudmade Red Alert;0,
http://a.tile.cloudmade.com/8bafab36916b5ce6b4395ede3cb9ddea/8/256/>
http://b.tile.cloudmade.com/8bafab36916b5ce6b4395ede3cb9ddea/8/256/>
http://c.tile.cloudmade.com/8bafab36916b5ce6b4395ede3cb9ddea/8/256/,
png,18,0,256,
-2.0037508342789244E7,-2.0037508342789244E7,-2.0037508342789244E7,
-2.0037508342789244E7,2.0037508342789244E7,2.0037508342789244E7,
EPSG:900913,
156543.03392804096153584694438047:78271.516964020480767923472190235:
39135.758482010240383961736095118:19567.879241005120191980868047559:
9783.9396205025600959904340237794:4891.9698102512800479952170118897:
2445.9849051256400239976085059448:1222.9924525628200119988042529724:
611.49622628141000599940212648621:305.74811314070500299970106324311:
152.87405657035250149985053162155:76.437028285176250749925265810776:
38.218514142588125374962632905388:19.109257071294062687481316452694:
9.5546285356470313437406582263471:4.7773142678235156718703291131735:
2.3886571339117578359351645565868:1.1943285669558789179675822782934:
0.59716428347793945898379113914669:0.29858214173896972949189556957335:
0.14929107086948486474594778478667:0.074645535434742432372973892393336:
0.037322767717371216186486946196668:0.018661383858685608093243473098334:
0.009330691929342804046621736549167

Una vez que hemos insertado las diferentes capas en la librería podremos utilizarlas desde nuestra aplicación simplemente creando un renderer de la capa que necesitamos y pasandosela como parámetro a la TileOverlay que queremos crear:

renderer = Layers.getInstance().getRenderer(Nombre_de_la_capa);
baseLayer = new TileOverlay(getApplicationContext(), mapView,
Nombre_de_la_capa, renderer, CompatManager.getInstance()
.getRegisteredContext(), true);

Para el manejo de la posición actual del dispositivo se utilizó las funciones de la API de Android que gestionan el GPS de los terminales. La implementación dentro del proyecto realiza la búsqueda del mejor proveedor de localización teniendo en cuenta la precisión de la medida (Criteria.ACCURACY_FINE) y actualiza la posición cuando esta cambia. Permite así la realización de búsquedas por posición consumiendo las funciones que ofrece la API de ikiMap para este propósito.

La creación de mapas de ikiMap permite la asignación de diferente simbología a las geometrías. Desde el entorno web de la aplicación, esto no representa ningún problema. La mayoría de las librerías que se utilizan para webmapping permiten la asignación de símbolos personalizados mediante llamadas a una imagen que se encuentre publicada en la web. Para el caso de Android, el estado de las librerías en el momento del desarrollo, no disponía de esta funcionalidad. Para solucionar esto, se creó una clase SymbolizedJTSFeature que hereda de una JTSFeature. Para el manejo de símbolos se crearon clases propias como IkiMapCollectionSymbol. Resumiendo, lo que se hace es asignar a la geometría, cuando esta es tipo punto, un bitmap con el símbolo. Para ello se implementan servicios que descargan estás imágenes de la web y las sitúa sobre el mapa en la posición de la geometría asociándola a esta mediante el uso de las clases anteriores. Aquí es donde se nos han presentado algunos problemas con la gestión de la memoria. En la gestión de las imágenes dentro de la aplicación hay que tener control sobre los flujos de descarga de estas y el manejo de las mismas dentro de los diferentes estados de las actividades para evitar leaks de memoria y los errores ANR (Aplication Not Responding). Tras un exhaustivo estudio de la gestión de la memoria apoyándonos en herramientas como el Memory Analizer (MAT) se consiguió detectar las fuentes de los errores y optimizar el proceso de gestión de las imágenes.


Diagrama de clases para dibujado

Por último, la parte más importante de todo el desarrollo, la edición vectorial en dispositivos móviles. Esta parte era la que, a priori, más dudas planteaba. Necesitábamos poder crear geometrías dibujando en nuestro terminal. Tras la refactorización de la MapView de gvSIG Mini, esta quedó preparada para la inserción de controles de manera sencilla. Así que apoyandonos en la clase de gvSIG AbstractMapControl y la interfaz IMapControl, se generaron los controles de dibujado. Estos se apoyan en una capa de dibujado DrawingOverlay donde van creando las geometrías. El modo edición dispone de las funcionalidades comunes, como añadir punto y eliminar último punto. Una vez terminada la edición, se pueden incluir los datos alfanuméricos asociados a la geometría y seguidamente un parser de KML crea un fichero KML que es enviado a los servidores de la aplicación.

De momento la aplicación no ha visto la luz, esperemos que lo haga en breve y que se ponga a disposición el código con estas funcionalidades. Mientras os dejamos el vídeo con la presentación de las Jornadas de Sig Libre de Girona del 2012.

ikiMap, la plataforma social de la cartografía from SIGTE – Universitat de Girona on Vimeo.

Saludos.

Tienes alguna idea de proyecto y quieres convertirla en realidad?
Nos gustaría escucharte, cuéntanoslo

Los hechos nos definen

  • 1km.geomatico.es en los medios

    La idea de 1km.geomatico.es surgió en abril con la intención de ayudar en estos tiempos difíciles. https://twitter.com/geomati_co/status/1253588695296417793 No queríamos sacar ningún provecho económico de ello y contamos con la inestimable ayuda (también…

  • 9 años con el Museo de Ciencias Naturales de Barcelona

    La geolocalización es un atributo clave para la actividad en un museo de ciencias naturales puesto que la cartografía está presente en casi todos sus ámbitos de acción: colecciones, investigación,…

  • Formación GIS personalizada para tu sector

    Los miembros de Geomatico tenemos más de 10 años de experiencia en el sector GIS, incluyendo más de 30 formaciones presenciales y online: cursos para implantar un GIS ambiental en…

  • ¿Quiénes somos Geomatico, la empresa de la web “1km”?

    En 3 días, hemos pasado de ser conocidos sólo en el mundo del GIS y las aplicaciones geográficas a ser la “empresa de 1km.geomatico.es”, tras más de tres millones de…