www org mapwindows mapwindow español java .net graphics rendering maps

java - org - mapwindows 5



¿Cuál es la mejor manera de leer, representar y representar datos de mapas? (11)

Estoy interesado en escribir una aplicación de navegación simplista como un proyecto de mascota. Después de buscar datos de mapas gratuitos, me he decidido por los datos del mapa TIGER 2007 Line / Shapefile de la Oficina del Censo de EE. UU . Los datos se dividen en archivos zip para condados individuales y descargué un solo mapa de datos de mi área.

¿Cuál sería la mejor manera de leer en este mapa de datos en un formato utilizable?

Como podria yo:

  • Lea en estos archivos
  • Parse them - ¿Expresión regular o alguna biblioteca que ya puede analizar estos Shapefiles?
  • Cargue los datos en mi aplicación. ¿Debería cargar los puntos directamente en alguna estructura de datos en la memoria? Use una pequeña base de datos? No necesito persistencia una vez que cierras la aplicación de los datos del mapa. El usuario puede cargar el Shapefile nuevamente.

¿Cuál sería la mejor manera de renderizar el mapa una vez que lo haya leído en los datos de Shapefile?

Idealmente, me gustaría poder leer en un shapefile de datos de mapas de condados y renderizar todas las líneas de polietileno en la pantalla y permitir la rotación y la escala.

Como podria yo:

  • Convierte puntos lat / lon a coordenadas de pantalla? - Por lo que sé, Shapefile usa longitud y latitud para sus puntos. Así que, obviamente, tendré que convertirlos de alguna forma en coordenadas de pantalla para mostrar las características del mapa.
  • Renderice los datos del mapa (una serie de polilíneas para carreteras, límites, etc.) de manera que pueda rotar y escalar fácilmente todo el mapa.
  • ¿Representar todo mi mapa como una serie de "mosaicos" para que solo se muestren las entidades / líneas dentro del área de visualización?

Ex. de datos TIGER representados como un mapa de visualización:
texto alternativo http://i43.tinypic.com/ngosjl.png

Alguien con algo de experiencia y conocimiento sobre cuál es la mejor manera de leer en estos archivos, cómo debería representarlos (base de datos, en la estructura de datos de la memoria) en mi programa, y ​​cómo debería renderizar (con rotación / escalado) los datos del mapa en la pantalla sería apreciado.

EDITAR: para aclarar, no quiero utilizar ninguna API de mapas de Google o Yahoo. Del mismo modo, no quiero usar OpenStreetMap. Estoy buscando un enfoque más desde cero que utilizar esos apis / programas. Esta será una aplicación de escritorio .


También podría trabajar con la aplicación de mapas visuales de Earth de Microsoft y api o usar la API de Google. Siempre he programado comercialmente con productos de ESRI y no he jugado tanto con las APIs abiertas.

Además, es posible que desee ver a Maker. y Finder! Son programas relativamente nuevos, pero creo que son gratuitos. Puede estar limitado a la incrustación de datos. Maker se puede encontrar aquí.

El problema es que el procesamiento espacial es bastante nuevo en la escala no comercial.


SharpMap es un motor de mapeo .NET 2.0 de fuente abierta para WinForms y ASP.NET. Esto puede proporcionar toda la funcionalidad que necesita. Se trata de los formatos de datos de trama y vectores GIS más comunes, incluidos los archivos shape de ESRI.


Una solución es usar MapXtreme. Tienen API para Java y C #. La API puede cargar estos archivos y representarlos.

Para Java:

http://www.mapinfo.com/products/developer-tools/desktop%2c-mobile-%26-internet-offering/mapxtreme-java

Para .NET:

http://www.mapinfo.com/products/developer-tools/desktop%2c-mobile-%26-internet-offering/mapxtreme-2008

Usé esta solución en una aplicación de escritorio y funcionó bien. Ofrece mucho más que solo información de representación.

Ahora hacer esto desde cero podría llevar bastante tiempo. Ellos tienen una versión de evaluación que puedes descargar. Creo que solo imprime "MAPXTREME" sobre el mapa como una marca de agua, pero es completamente utilizable de otra manera


la solucion es :

  • un servidor geoespacial como mapserver, geoserver, degree (opensource).

Pueden leer y servir shapefiles (y muchas otras cosas). Por ejemplo, geoserver (cuando está instalado) sirve datos de los shapefiles TIGER de la Oficina del Censo de EE. UU. Como demostración

  • una biblioteca cartográfica javascript como openlayers (vea los ejemplos en el texto del enlace)

Hay muchos ejemplos en la web que usan esta solución


Primero, te recomiendo que uses los archivos 2008 TIGER .

En segundo lugar, como otros señalan, ahora hay muchos proyectos que ya leen, interpretan, convierten y usan los datos. Sin embargo, construir su propio analizador para estos datos es casi trivial, por lo que no hay razón para pasar por el código de otro proyecto y tratar de extraer lo que necesita a menos que planee usar su proyecto como un todo.

Si quieres comenzar desde el nivel inferior

Parsing

Construir su propio analizador TIGER (razonablemente fácil, solo una base de datos de segmentos de línea), y construir un render simple sobre eso (líneas, polígonos, letras / nombres) también será bastante fácil. Deberá ver varios tipos de proyección de mapas para la fase de renderizado. El más utilizado (y por lo tanto, el más familiar para los usuarios) es la proyección de Mercator , es bastante simple y rápido. Es posible que desee jugar con el apoyo de otras proyecciones.

Esto proporcionará un poco de "diversión" en términos de ver cómo proyectar un mapa, y cómo invertir esa proyección (digamos que un usuario hace clic en el mapa, quiere ver el latido / longitud en el que hizo clic - requiere invertir la proyección actual) ecuación).

Representación

Cuando desarrollé mi procesador de imagen, decidí basar mi ventana en un tamaño fijo (dispositivo integrado) y una ampliación fija. Esto significaba que podía centrar el mapa en lat / lon, y con el píxel central = centro lat / lon con un aumento dado, y dada la proyección de mercator, podía calcular qué píxel representaba cada lat / lon, y viceversa.

En cambio, algunos programas permiten que la ventana varíe, y en lugar de usar un aumento y un punto fijo, utilizan dos puntos fijos (a menudo las esquinas superior izquierda e inferior derecha de un rectángulo que define la ventana). En este caso, resulta trivial determinar la transferencia de píxel a lat / lon: solo se trata de unos pocos cálculos de interpolación. Girar y escalar hace que esta función de transferencia sea un poco más compleja, pero no debe ser considerablemente así, sigue siendo una ventana rectangular con interpolación, pero las esquinas de las ventanas no necesitan estar en una orientación particular con respecto al norte. Esto agrega algunas cajas de esquina (puedes voltear el mapa y verlo como si fuera del interior de la tierra, por ejemplo) pero no son onerosas, y pueden resolverse mientras trabajas en él.

Una vez que haya realizado la transferencia lat / lon a pixel, renderizar líneas y polígonos es bastante simple excepto por problemas gráficos normales (como bordes de líneas o superposiciones inapropiadas de polígonos, suavizado, etc.). Pero renderizar un mapa feo básico como lo hacen muchos renderizadores de código abierto es bastante sencillo.

También podrás jugar con los cálculos de distancia y de gran círculo; por ejemplo, una buena regla empírica es que cada grado de latitud o longitud en el ecuador es aproximadamente 111.1KM, pero uno cambia a medida que te acercas a uno de los polos, mientras el otro continúa permaneciendo a 111.1kM.

Almacenamiento y estructuras

Sin embargo, la forma de almacenar y consultar los datos depende en gran medida de lo que planee hacer con ella. Surgen muchos problemas difíciles si desea usar la misma estructura de base de datos para la demografía versus el enrutamiento: una estructura de base de datos dada e indexación será rápida para uno y lenta para el otro.

Usar códigos postales y cargar solo los códigos postales cercanos funciona para proyectos de representación de mapas pequeños, pero si necesita una ruta en todo el país necesita una estructura diferente. Algunas implementaciones tienen bases de datos ''superpuestas'' que solo contienen las principales carreteras y ajustan las rutas a la superposición (o a través de varias superposiciones: local, metropolitana, de condado, de estado o de país). Esto da como resultado un enrutamiento rápido pero a veces ineficiente.

Embaldosado

Mosaico de su mapa no es realmente fácil. Con aumentos más bajos puede renderizar un mapa completo y cortarlo. A mayores aumentos, no puede procesar todo de una vez (debido a restricciones de memoria / espacio), por lo que debe dividirlo.

Cortar líneas en los bordes de las teselas para obtener resultados individuales no es perfecto: a menudo, lo que se hace son líneas que se representan más allá del límite (o, al menos, se conservan los datos del extremo de la línea, aunque el procesamiento se detiene una vez descubre que se ha caído del borde) - esto reduce el error que ocurre con las líneas que parecen no coincidir exactamente mientras viajan a través de las teselas.

Verás de lo que estoy hablando mientras trabajas en este problema.

No es trivial encontrar los datos que también entran en una determinada losa: una línea puede tener ambos extremos fuera de una baldosa determinada, pero viajar a través de ella. Necesitará consultar libros gráficos sobre esto ( el libro de Michael Abrash es la referencia fundamental , disponible gratuitamente ahora en el enlace anterior). Si bien se trata principalmente de juegos, la ventana, recorte, bordes de polígono, colisión, etc. se aplican aquí.

Sin embargo, es posible que desee jugar en un nivel superior.

Una vez que haya hecho lo anterior (ya sea mediante la adaptación de un proyecto existente o haciendo lo anterior), es posible que desee jugar con otros escenarios y algoritmos.

La geocodificación inversa es razonablemente fácil. Ingrese lat / lon (o haga clic en el mapa) y obtenga la dirección más cercana. Esto le enseña a interpretar direcciones a lo largo de segmentos de línea en datos TIGER.

La geocodificación básica es un problema difícil. Escribir un analizador de direcciones es un proyecto útil e interesante, y luego convertirlo en lat / lon utilizando los datos de TIGER no es trivial, pero es muy divertido. Comience por ser simple y pequeño al requerir el nombre exacto y la coincidencia de formato, y luego comience a buscar coincidencias ''me gusta'' y concordancia fonética. Hay mucha investigación en esta área: mire los proyectos de los motores de búsqueda para obtener ayuda aquí.

Encontrar el camino más corto entre dos puntos es un problema no trivial. Existen muchos algoritmos para hacerlo, la mayoría de los cuales están patentados. Recomiendo que, si prueba esto, vaya con un algoritmo sencillo de su propio diseño y luego investigue y compare su diseño con el estado de la técnica. Es muy divertido si te interesa la teoría de grafos.

Seguir un camino y dar instrucciones de forma preventiva no es tan fácil como parece a primera vista. Dado un conjunto de instrucciones con una matriz asociada de pares lat / lon, ''siga'' la ruta usando entrada externa (GPS o GPS simulado) y desarrolle un algoritmo que dé instrucciones al usuario a medida que se aproxima a cada intersección real. Observe que hay más pares lat / lon que instrucciones debido a curvas de caminos, etc., y deberá detectar la dirección de desplazamiento, etc. Muchos casos de esquina que no verá hasta que intente implementarlo.

Búsqueda de punto de interés Este es interesante: necesitas encontrar la ubicación actual y todos los puntos de interés (que no sean parte de TIGER, hacer tuyos u obtener otra fuente) dentro de una cierta distancia (en línea recta, o más difícil - distancia de manejo) de el origen. Este es interesante porque debe convertir la base de datos de POI en un formato que es fácil de buscar en esta circunstancia. No puede tomarse el tiempo para revisar millones de entradas, hacer el cálculo de distancia (sqrt (x ^ 2 + y ^ 2)) y devolver los resultados. Necesita tener algún método o algoritmo para reducir la cantidad de datos primero.

Vendedor viajero. Enrutamiento con múltiples destinos. Solo una versión más difícil de enrutamiento regular.

Puede encontrar una serie de enlaces a muchos proyectos y fuentes de información sobre este tema aquí .

¡Buena suerte, y publique lo que haga, no importa cuán rudimentario o feo sea, para que otros puedan beneficiarse!

-Adán


Si no le importa pagar una solución, Safe Software produce un producto llamado FME. Esta herramienta lo ayudará a traducir datos de cualquier formato a casi cualquier otro. Incluyendo KML en formato Google Earth o renderizado como JPEG (o una serie de archivos JPEG). Después de convertir los datos, puede insertar google earth en su aplicación utilizando su API o simplemente mostrar las imágenes en mosaico.

Como un lado no FME es una plataforma muy poderosa, por lo que al hacer sus traducciones puede agregar o eliminar partes de datos que no necesariamente necesita. Fusiona fuentes si tienes más de una. Convierta las coordenadas (no recuerdo exactamente qué usa Google Earth). Almacenar copias de seguridad en una base de datos. Pero en serio si estás dispuesto a desembolsar unos pocos dólares, deberías investigar esto.

También puede crear indicadores (al igual que en su mapa de muestra) que contienen una ubicación (dónde ubicarlo) y otros datos / comentarios sobre la ubicación. Estas banderas vienen en muchas formas y tamaños.


Una simplificación sobre una proyección de Mercator u otra es suponer un factor de conversión constante para la latitud y la longitud. Multiplique los grados de latitud por 69.172 millas; para la longitud, escoja la latitud media de su área de mapa y multiplique (180-longitud) por coseno (middle_latitude) * 69.172. Una vez que haya convertido a millas, puede usar otro conjunto de conversiones para llegar a las coordenadas de la pantalla.

Esto es lo que funcionó para mí en 1979.

Mi fuente para el número de millas por grado.


para almacenar datos de tigre localmente, elegiría Postgresql con las herramientas de postgis .

tienen una impresionante colección de herramientas, especialmente para ti, el Geocoder Tiger ofrece una buena forma de importar y utilizar los datos de tigre.

Tendrás que echar un vistazo a las herramientas que interactúan con Postgis, muy probablemente algún tipo de servidor de mapas

de http://postgis.refractions.net/documentation/ :

Ahora hay varias herramientas de código abierto que funcionan con PostGIS. El proyecto uDig está trabajando en un entorno de escritorio de lectura / escritura completo que puede funcionar directamente con PostGIS. Para la asignación de Internet, el servidor de mapas de la Universidad de Minnesota puede usar PostGIS como fuente de datos. El kit de herramientas geo GOS Java GIS tiene soporte PostGIS, al igual que el servidor de funciones web GeoServer. GRASS admite PostGIS como fuente de datos. El visor JUMP Java GIS de escritorio tiene un plugin simple para leer datos PostGIS, y el escritorio QGIS tiene una buena compatibilidad con PostGIS. Los datos de PostGIS se pueden exportar a varios formatos SIG de salida utilizando la biblioteca OGR C ++ y las herramientas de línea de comandos (y de cource con el volcador de archivos Shape incluido). Y, por supuesto, cualquier lenguaje que pueda funcionar con PostgreSQL puede funcionar con PostGIS; la lista incluye Perl, PHP, Python, TCL, C, C ++, Java, C # y más.

edit: depite mapserver que tiene la palabra SERVER en su nombre, esto será utilizable en un entorno de escritorio.


Cuando di esta respuesta, la pregunta fue etiquetada

"¿Cuál sería la mejor forma de renderizar un Shapefile (datos de mapa) con polilíneas en .Net?"

Ahora es una pregunta diferente, pero dejo mi respuesta a la pregunta original.

Escribí una versión .net que podía dibujar datos vectoriales (como la geometría de un archivo shp) usando GDI + simple en c #. Fue muy divertido.

El motivo fue que necesitábamos manejar diferentes versiones de geometrías y atributos con mucha información adicional, por lo que no podíamos usar un componente de mapa comercial o de código abierto.

Lo principal cuando se hace esto es establecer una ventana gráfica y traducir / transformar las coordenadas WGIS84 a una escala descendente y las coordenadas GDI + x, y y esperar con proyección si es necesario siquiera reproyectarlas.


Pregunta graciosa Así es como lo hago.

Recolecto la geometría que necesito en cualquier formato en que aparezcan. He estado extrayendo datos de USGS, por lo que se reduce a un montón de:

Luego escribí un programa que "compila" esas definiciones de forma en una forma que es eficiente de representar. Esto significa realizar cualquier proyección y conversión de formato de datos que sean necesarios para mostrar los datos de manera eficiente. Algunos detalles:

  • Para una aplicación 2D, puede usar cualquier proyección que desee: Proyecciones de mapas .
  • Para 3D, desea convertir esas latitudes / longitudes en coordenadas 3D. Aquí hay algunas matemáticas sobre cómo hacer eso: transformación de coordenadas esféricas a coordenadas rectangulares normales .
  • Divida todas las primitivas en un quadree / octree (2D / 3D). Los nodos hoja en este árbol contienen referencias a toda la geometría que intersecta el cuadro delimitador de ese nodo hoja (alineado al eje). (Esto significa que una pieza de geometría se puede referenciar más de una vez).
  • La geometría se divide en una tabla de vértices y una tabla de comandos de dibujo. Este es un formato ideal para OpenGL. Los comandos se pueden emitir a través de glDrawArrays utilizando buffers de vértices ( Objetos de búfer de vértice ).
  • Se usa un patrón general de visitante para recorrer el quadtree / octree. Caminar implica comprobar si el visitante intersecta los nodos dados del árbol hasta que se encuentra un nodo hoja. Los visitantes incluyen: dibujo, detección de colisión y selección. (Debido a que las hojas de los árboles pueden contener referencias duplicadas a la geometría, el andador marca los nodos como visitados y los ignora a continuación. Estas marcas deben reiniciarse o actualizarse antes de realizar la siguiente caminata).
  • El uso de un sistema de partición espacial (uno de los árboles) y una representación eficiente en el dibujo es crucial para lograr altos framerates. He descubierto que en este tipo de aplicaciones, desea que su velocidad de fotogramas sea lo más alta posible 20 fps como mínimo. Sin mencionar el hecho de que un montón de rendimiento le dará muchas oportunidades para crear un mejor mapa. (El mío está lejos de verse bien, pero llegará algún día).
  • La partición espacial ayuda a mejorar el rendimiento al reducir el número de comandos de dibujo enviados al procesador. Sin embargo, podría llegar un momento en que el usuario realmente quiera ver todo el conjunto de datos (quizás una vista arial). En este caso, necesita un nivel de sistema de control de detalles. Dado que mi aplicación trata con las calles, le doy prioridad a las carreteras y carreteras más grandes. Mi código de dibujo sabe cuántas primitivas puedo dibujar antes de que mi framerate disminuya. Los primitivos también están ordenados por esta prioridad. Solo dibujo los primeros x elementos donde x es la cantidad de primitivos que puedo dibujar con la velocidad de fotogramas deseada.

El resto es el control de la cámara y la animación de cualquier información que desee mostrar.

Aquí hay algunos ejemplos de mi implementación existente:

Imagen http://seabusmap.com/assets/Picture%205.png Imagen http://seabusmap.com/assets/Picture%207.png


Aunque ya decidió utilizar los datos de TIGER, puede interesarle OSM (Open Street Map) , ya que OSM tiene una importación completa de los datos TIGER en ella, enriquecidos con datos aportados por el usuario. Si te apegas al formato TIGER, tu aplicación será inútil para los usuarios internacionales, con OSM obtienes TIGER y todo lo demás a la vez.

OSM es un proyecto abierto que presenta un mapa mundial gratuito editado colaborativamente. Puede obtener todos estos datos como XML estructurado, ya sea para buscar una región o descargar todo el mundo en un archivo grande.

Existen algunos procesadores de mapas para OSM disponibles en varios lenguajes de programación, la mayoría de ellos de código abierto, pero aún queda mucho por hacer.

También hay un servicio de enrutamiento OSM disponible. Tiene una interfaz web y también puede consultarse a través de una API de servicio web. Nuevamente, no está todo terminado. Los usuarios definitivamente podrían usar una aplicación de enrutamiento móvil o de escritorio construida sobre esto.

Incluso si no decide ir con ese proyecto, puede obtener mucha inspiración de él. Solo eche un vistazo a la wiki del proyecto y a las fuentes de los diversos proyectos de software que están involucrados (encontrará enlaces a ellos dentro de la wiki).