2017-01-24 3 views
0

Для небольшого проекта я разрешаю пользователям добавлять области в базу данных. Их запрос отправляется в http://nominatim.openstreetmap.org, и я храню широту и долготу. Если доступно, я также сохраняю данные контура geoJSON polygon.Leaflet.js и сложные полигоны

Пример вывода: http://nominatim.openstreetmap.org/search?q=wyoming&format=xml&polygon_geojson=1&addressdetails=1

Эта Выделенная область затем отображается на карте с помощью leaflet.js. Для многих полигонов это работает очень хорошо, но кажется, что существует ограничение на количество данных, которые может обрабатывать библиотека. Некоторые довольно сложные области (которые требуют longtext для хранения в mysql) просто не отображаются вообще, без ошибки.

Я думаю, что мой вопрос состоит из двух частей: 1 - Правильно ли я предполагаю, что большие наборы данных являются корнем проблемы, или должен ли leaflet.js уметь их обрабатывать? 2 - Какой был бы лучший способ упростить такие наборы данных? В лифлете есть такой алгоритм для отображения областей, но это, похоже, уже является неудачной точкой.

И пока мы на тему: Сейчас я перерабатываю lnglat многоугольники Номинатима в латвийский листок, разбивая данные и исправляя их обратно в javascript. Есть ли более простой/безопасный способ сделать это? Должен ли я перенести эту задачу на сервер и использовать некоторую библиотеку/функцию php?

Я ценю вашу помощь!

Edit: Забыл упомянуть: по случаю, что многоугольник не может вынести, моя консоль дает мне эту ошибку: TypeError: т равна нулю

ответ

1

are the large datasets the root of the problem or should leaflet.js be able to handle those?

Leaflet.js будет обрабатывать все, что вы бросаете на Это. Однако существует ограничение на то, что ваш веб-браузер может обрабатывать без замедления.

Помните, что каждый современный веб-браузер имеет инструменты анализа производительности, которые вы можете использовать, чтобы увидеть, какие части кода лифлета (или внутренних элементов браузера) занимают большую часть вашего времени.

What would be the best way of simplifying such datasets?

Вы, вероятно, хотите посмотреть на Douglas-Peucker algorithm за отправную точку в этих алгоритмах.

Имейте в виду, что Leaflet использует этот алгоритм для упрощения полигонов на каждом уровне масштабирования, вплоть до пикселя.

Для некоторых крупных сложных полигонов, нарезанных их чем-то вроде Leaflet.VectorGrid, можно улучшить производительность.

Однако для упрощения наборов данных нет серебряной пули. Лучший способ будет зависеть от конкретных данных, которые вы используете.

on the occasion that the polygon fails to render, my console gives me this error: TypeError: t is null

Это другое дело, и может быть симптомом искаженных данных.

Для отображения более точных сообщений об ошибке используйте файл leaflet-src.js вместо файла leaflet.js. Начиная с Leaflet 1.0.0-beta2, leaflet-src.js имеет исходную карту, которая может указывать на отдельные исходные файлы, что позволяет лучше отлаживать.

+0

спасибо.Это были неверные данные - я написал свой код, ожидая только одномерных многоугольных данных, которые работают во многих случаях, но не во всех из них. Вероятно, не было обнаружено, что в середине 40 000 точек данных. Также отличный совет с -src.js - этот wil определенно пригодится. На данный момент я буду использовать полные наборы данных для моего прототипа. Мне нужно вернуться к простому, как только производительность станет важной. – asto

+0

Если вы сомневаетесь, нормализуйте все свои полигоны в MultiPolygons только одним полигоном и одним внешним кольцом. Это должно помочь (неверно) интерпретировать одномерные массивы как многоугольники. – IvanSanchez

Смежные вопросы