32 votos

GeoJSON demasiado voluminoso - ¿qué hacer?

Estoy usando folleto.js para permitir a los usuarios de la web seleccionar una región. Las regiones válidas son los estados de EE.UU., las provincias canadienses y los países del mundo (excepto EE.UU. y Canadá). Yo mismo construí un shapefile utilizando Qgis y lo guardé como geojson. Simplifiqué las geometrías tanto como pude.

El shapefile resultante es de 400kb, pero el geojson es de más de un megabyte. Esto es más grande de lo que me gustaría. Necesito reducir la sobrecarga de la red que supone la transferencia de esta información.

¿Cuál es la forma correcta de hacerlo? Las opciones que puedo imaginar son:

  1. Servir el archivo geojson gzipped, descomprimir en el cliente.
  2. Parsear el shapefile en el cliente a geojson
  3. Generar mis propios mosaicos a partir del shapefile y servirlos

¡Si alguien pudiera decirme qué opción es la mejor (o ninguna de las anteriores) se lo agradecería!

29voto

shane22 Puntos 21

Mapshaper.org es una práctica herramienta gratuita en línea que le permite cargar un archivo geojson, mostrarlo como un mapa y, a continuación, elegir uno de los tres algoritmos de simplificación cuya intensidad puede ajustarse con un control deslizante.

Actualiza el mapa y resalta en rojo los lugares en los que hay una pérdida de integridad, como un solapamiento entre dos regiones. Hay un botón de "corrección" que normalmente (pero no siempre) soluciona estos problemas.

Puede encontrar un nivel de simplificación que sea aceptable y exportar el archivo geojson recién simplificado.

Obviamente, esto depende del nivel de detalle que necesites, pero los resultados pueden ser impresionantes. Por ejemplo, aquí está el mapa de Escocia a partir de un archivo geojson de 40 mb:

enter image description here

Una aplicación del 99% lo reduce a un archivo de 441 kb sin solapamientos y con pérdida de detalles que son invisibles a este nivel de zoom:

enter image description here

Una aplicación del 99,95% (hasta 29kb) muestra qué tipo de simplificación de la ruta se está aplicando (y aún así consigue evitar solapamientos, y es perfectamente adecuada para usos como el clorotipo a nivel nacional):

enter image description here

15voto

TorgoGuy Puntos 753

Antes de recorrer caminos más laboriosos, la opción más sencilla es reducir la geometría. ¿Cuáles son tus conjuntos de datos de origen? ¿Cómo los has simplificado? ¿Cuánto redujo el tamaño del archivo geojson?

Si estás seguro de que has hecho todo lo que puedes en lo anterior, entonces la fruta más baja de tus opciones es

  1. Servir el archivo geojson gzipped, descomprimir en el cliente.

Todos los navegadores modernos desempaquetan los datos comprimidos automáticamente, por lo que sólo hay que configurar el servidor web para que empaquete los datos antes de enviarlos. Esto suele ser relativamente sencillo, ya que hay mucho material disponible para Apache , IIS ou Nginx

Mi consejo sería probar esto primero, hacer pruebas, y luego si la latencia / respuesta / tamaño de los datos no es aceptable, entonces pasar a otras opciones. Yo también desconfiaría de tratar de optimizar prematuramente, buscaría determinar por qué necesita reducir el tamaño de los datos, y una vez que tenga razones sólidas (y números) para hacerlo, entonces implementar iterativamente los cambios y volver a probar para ver qué ganancias está obteniendo.

8voto

DavidWhitney Puntos 1957

Me pregunto si podría hacer uso de la compresión encontrada en esta respuesta que habla de comprimiendo el GeoJSON con topojson .

No sé si Leaflet podrá seguir leyendo el GeoJSON - algo para probar =)

Más información sobre topojson: https://github.com/mbostock/topojson/

3voto

ESV Puntos 4591

Estoy de acuerdo con @Kelso más arriba en simplificar su geometría.

Si no tienes acceso a tu servidor para desinflar los datos con gzip fácilmente podrías echar un vistazo al Paquete de mensajes para serializar su geoJSON en datos binarios (Creo que es una implementación de la Especificaciones de BSON que es utilizado por cosas como MongoDB para almacenar datos, pero podría estar equivocado) . Hay bibliotecas en Python y javascript (entre otros) que puedes utilizar para serializar/deserializar los datos.

2voto

Lucky Strike Puntos 23

A pesar de la antigüedad de esta pregunta, esto podría ayudar a otras personas. Trabajando mucho en proyectos web con GeoJSONs, tuve este problema frecuentemente. Mi solución: El tipo de archivo GeoJSON BrokJSON ( brokjson.dev ). Dependiendo de su GeoJSON puede reducir el tamaño dramáticamente sin perder ningún dato.

Mira este GeoJSON con dos puntos y algunos datos:

{
  "type": "FeatureCollection",
  "features": [
  {
    "type": "Feature",
    "properties": {
      "id": 1,
      "title": "Datapoint 1",
      "value": 343
    },
    "geometry": {
      "type": "Point",
      "coordinates": [8.5402,47.3782]
    }
  },
  {
    "type": "Feature",
    "properties": {
      "id": 1,
      "title": "Datapoint 2",
      "value": 14
    },
    "geometry": {
      "type": "Point",
      "coordinates": [8.5637,47.4504]
    }
  }]
}

Transformado en BrokJSON se ve así:

{
  "properties": ["id", "title", "value"],
  "geometries": [{
    "type": "Point",
    "features": [
      [[8.5402, 47.3782], [1, "Datapoint 1", 343]],
      [[8.5637, 47.4504], [1, "Datapoint 2", 14]]
    ]
  }
]}

Almaceno mis geodatos como BrokJSON y los transformo para MapBox o leaflet en tiempo de ejecución a GeoJSON.

Más detalles: https://www.brokjson.dev

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X