2008-10-10 23 views
11

Tengo un problema similar al this post. Necesito mostrar hasta 1000 polígonos en un mapa de Google incrustado. Los polígonos están en una base de datos SQL, y puedo renderizar cada uno como un solo archivo KML sobre la marcha usando un HttpHandler personalizado (en ASP.NET), como este http://alpha.foresttransparency.org/concession.1.kml.Cómo simplificar (reducir el número de puntos) en KML?

Incluso en mi (muy rápida) máquina de desarrollo, toma un tiempo para cargar incluso un par de docenas de formas. Así que dos preguntas, en realidad:

  1. lo que sería una buena estrategia para la prestación de estos como marcadores en lugar de las placas una vez que esté más allá de cierto nivel de zoom?

  2. ¿Hay un algoritmo disponible públicamente para simplificar un polígono (reduciendo el número de puntos) para que no muestre más puntos que los que tienen sentido en un cierto nivel de zoom?

Respuesta

0

que no saben mucho aobut KML, pero creo que la solución habitual a la pregunta # 2 implica iterar a través de los puntos, y la supresión de cualquiera de los segmentos de línea bajo un cierto tamaño. Esto causará algunos efectos "desafortunados" en algunos casos, pero es relativamente rápido y fácil de hacer.

0

Recomendaría 2 cosas: - Calcular y combinar polígonos que se tocan. Esto implica MUCHO procesamiento y matemáticas duras, pero lo hice así que sé que es posible. - Cree su propia superposición en lugar de usar KML en formato PNG, mientras los combina en la sugerencia anterior. Tendrás que crear MUCHOS PNG, pero está ardiendo rápidamente en el cliente.

Buena suerte :)

+0

Gracias - Realmente no tengo los recursos para duplicar tanto de lo que la API de Google ofrece de forma gratuita. –

2

Para su primera pregunta, ¿podría calcular el área de un polígono en particular, y relacionar cada nivel de zoom a una superficie mínima determinada , de modo que al acercarse o alejarse desaparecen los polígonos y aparecen marcadores según el nivel de zoom.

Para la segunda pregunta, utilizaría la sugerencia de Mark Bessey.

0

Hace un momento necesitaba una solución para su pregunta # 2 y después de ver algunos de los algoritmos de simplificación de línea disponibles, creé la mía.

El proceso es simple y parece que funciona bien, aunque puede ser un poco lento si no se implementa correctamente:

P[0..n] es su matriz de puntos Deje T[n] definirse como el triángulo formado por los puntos P[n-1], P[n], P[n+1] Max es la cantidad de puntos a los que intenta reducir esta línea.

  1. Calcula el área de cada posible triángulo T[1..n-1] en el conjunto.
  2. Elija el triángulo T[i] con el área más pequeña
  3. Retire el punto P[i] para aplanar esencialmente el triángulo
  4. Volver a calcular el área de los triángulos afectadas T[n-1], T[n+1]
  5. vaya al paso # 2, si el número de puntos>Max
+0

Por curiosidad, ¿por qué no ir con Douglas-Peucker? A primera vista, su algoritmo parece considerablemente menos eficiente. También tiene como objetivo un número fijo de puntos, en lugar de una tolerancia determinada. Entonces, ¿cómo lo aplicaría a un gran número de formas de diferente complejidad? –

+0

Ya sabes ... podría intentar implementarlo pronto. Esta parte de mi aplicación se ejecuta con poca frecuencia, pero mirándola de nuevo, parece un mejor método. Gracias. –

Cuestiones relacionadas