Консистентная загрузка данных geoJSON Leaflet.js для повышения производительности

Мне нужно загрузить данные geoJSON из базы данных postgres, которая довольно тяжелая. Данные составляют около 1 МБ, тогда как остальная часть кода составляет около 35 КБ.

Что может быть лучшим вариантом, чтобы ускорить загрузку страницы?

Я думал о загрузке geoJSON через jQuery AJAX?

Любое другое предложение или вариант? Может компрессия?

Спасибо.


person Fabrizio Mazzoni    schedule 26.12.2013    source источник
comment
Что ты сейчас делаешь? Чтения JSON через службу, конечно, будет достаточно для 1 МБ данных. Сжатие всегда лучше (включить gzip очень просто). Хотя это не самый простой подход: я определенно рекомендую рассмотреть надежное решение, такое как GeoServer (geoserver.org), для обслуживания ваших данных (он будет подключаться к вашей базе данных postgres) через службу веб-функций (docs.geoserver.org/stable/en/user/services/wfs/ index.html). Это позволит создать надежное решение, которое будет масштабироваться от 1 МБ данных до 100 ГБ данных.   -  person Patrick D    schedule 26.12.2013
comment
Я загружаю непосредственно в свой PHP-скрипт, запрашивая БД и записывая полученный json в источнике страницы. Как я уже сказал, я не думаю, что это хорошее решение. Взглянул на геосервер и кажется очень интересным!   -  person Fabrizio Mazzoni    schedule 27.12.2013


Ответы (1)


Я бы посмотрел на TopoJSON, который творит чудеса с размером GeoJSON.

TopoJSON — это расширение GeoJSON, которое кодирует топологию. Вместо того, чтобы представлять геометрию дискретно, геометрия в файлах TopoJSON сшивается вместе из общих сегментов линий, называемых дугами. TopoJSON устраняет избыточность, предлагая гораздо более компактное представление геометрии, чем GeoJSON; типичные файлы TopoJSON на 80% меньше, чем их эквиваленты GeoJSON.

https://github.com/mbostock/topojson

Вы можете кодировать существующие файлы GeoJSON с помощью утилиты командной строки:

topojson -o output.json input.json

или в вашем случае, если возможно, используйте серверный API:

var topojson = require("topojson");
var collection = {type: "FeatureCollection", features: […]}; // GeoJSON
var topology = topojson.topology({collection: collection}); // TopoJSON

На стороне клиента вы должны десериализовать TopoJSON с помощью API на стороне клиента:

<script src="http://d3js.org/topojson.v1.min.js"></script>
var geoJson = topojson.feature(topology, object);

В идеале файлы TopoJSON следует кэшировать, а не генерировать их по каждому запросу, но это зависит от вашего приложения.

person iH8    schedule 27.12.2013