@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…
-
Visualización transporte público en tiempo real
https://vimeo.com/528250070/ Transportes Metropolitanos de Barcelona en tiempo real Desde 2016, Geomatico trabaja año a año con la agencia de transporte público de Barcelona (Transports Metropolitans de Barcelona, TMB) para desarrollo…
-
Formación GIS personalizada para tu sector
Los miembros de Geomatico tenemos más de 10 años de experiencia en formación en el sector GIS (PostGIS, QGIS), incluyendo más de 30 cursos presenciales y online: cursos para implantar…
-
Edificios 3D a partir del catastro
Estas últimas semanas tuvimos cierta repercusión en redes con una aplicación web (https://labs.geomatico.es/mapa-catastro-3d) que muestra los edificios de toda España en 3D, y permite navegar y simbolizarlos por año de construcción y…