OpenLayers2. Как лучше нанести на карту 10000 полигонов?
-
- Новоприбывший
- Сообщения: 2
- Зарегистрирован: 16 июл 2016, 15:54
- Репутация: 0
OpenLayers2. Как лучше нанести на карту 10000 полигонов?
Добрый день. Сразу скажу, что скриптёр я ещё тот, так что не судите строго. С документацией у openlayers2 дела обстоят как то не очень или я просто не умею читать буржуйскую документацию. В основном ковыряю чужие примеры. Ну да не суть.
Задача у меня такая: необходимо с сервера отображать данные метеолокатора. Каждый локатор имеет 10000 квадратиков, т.е. матрицу 100х100. Координаты для каждого квадратика постоянны (4х4км), я их рассчитаю и буду передавать как константы. У каждого квадратика должно быть два свойства - цвет (число от 0 до 32) и высота (число от 0 до 13000). Т.е. при запросе серверу передаётся номер локатора, а сервер отправляет в ответ массив, в котором каждый из 10000 элементов содержит 4 координаты углов, цвет и высоту.
Я пробовал рассчитывать координаты углов в браузере чтобы уменьшить ответ сервера, но получается даже медленнее, чем загрузить готовые. Подгрузка данных с готовыми координатами получается порядка двух мегабайт, но сие работает в локалке, т.е. всё относительно быстро. И если нанести все 10000 квадратиков на карту, то это ещё терпимо, а если прикрутить к каждому квадратику евент, который при наведении на квадратик должен показывать хинт с цифрой высоты и цвета, то браузер начинает существенно лагать. А если таких локаторов нанести 3-4, то браузер сначала виснет на минуту-другую, а также при попытке сдвинуть/смаштабировать карту каждый раз подвисает секунд на 30.
Так вот есть ли какой то предел у опенлейерса? 10000 полигонов с ховером - это много для него? или я что-то неправильно делаю?
Посоветуйте, пожалуйста, как лучше подгружать и отображать столько данных и как оптимальнее сделать ховер на квадратиках?
Задача у меня такая: необходимо с сервера отображать данные метеолокатора. Каждый локатор имеет 10000 квадратиков, т.е. матрицу 100х100. Координаты для каждого квадратика постоянны (4х4км), я их рассчитаю и буду передавать как константы. У каждого квадратика должно быть два свойства - цвет (число от 0 до 32) и высота (число от 0 до 13000). Т.е. при запросе серверу передаётся номер локатора, а сервер отправляет в ответ массив, в котором каждый из 10000 элементов содержит 4 координаты углов, цвет и высоту.
Я пробовал рассчитывать координаты углов в браузере чтобы уменьшить ответ сервера, но получается даже медленнее, чем загрузить готовые. Подгрузка данных с готовыми координатами получается порядка двух мегабайт, но сие работает в локалке, т.е. всё относительно быстро. И если нанести все 10000 квадратиков на карту, то это ещё терпимо, а если прикрутить к каждому квадратику евент, который при наведении на квадратик должен показывать хинт с цифрой высоты и цвета, то браузер начинает существенно лагать. А если таких локаторов нанести 3-4, то браузер сначала виснет на минуту-другую, а также при попытке сдвинуть/смаштабировать карту каждый раз подвисает секунд на 30.
Так вот есть ли какой то предел у опенлейерса? 10000 полигонов с ховером - это много для него? или я что-то неправильно делаю?
Посоветуйте, пожалуйста, как лучше подгружать и отображать столько данных и как оптимальнее сделать ховер на квадратиках?
- Вложения
-
- примерно так должны выглядеть квадратики локатора
- mrl.JPG (137.66 КБ) 4986 просмотров
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: OpenLayers2. Как лучше нанести на карту 10000 полигонов?
Вопрос: почему бы не использовать растр?
Редактор материалов, модератор форума
-
- Гуру
- Сообщения: 3321
- Зарегистрирован: 27 июл 2009, 19:26
- Репутация: 748
- Ваше звание: Вредитель полей
Re: OpenLayers2. Как лучше нанести на карту 10000 полигонов?
Использовать растровый слой, а хинт выводить через запрос к серверу.
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: OpenLayers2. Как лучше нанести на карту 10000 полигонов?
UTFGrid?
[ Сообщение с мобильного устройства ]
[ Сообщение с мобильного устройства ]
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Новоприбывший
- Сообщения: 2
- Зарегистрирован: 16 июл 2016, 15:54
- Репутация: 0
Re: OpenLayers2. Как лучше нанести на карту 10000 полигонов?
а зуммирование будет работать? и прозрачность. Мне бы примерчикАлександр Мурый писал(а):Вопрос: почему бы не использовать растр?
данные о каждом локаторе хранятся в оракловой базе в виде двух записей, состоящей из пары десятков полей с технической информацией и поля blob с данными о 10000 квадратиках: одна запись отвечает за цвет, вторая - за высоту.В базе на данный момент около миллиона записей. Вытягивание из базы одной записи длиться чуть больше секунды. И это ещё без распарсивания на отдельные квадраты. Так что такой вариант не приемлем. Проще тогда уж в яваскрипте хранить массив квадратиков и из него выдергивать.ericsson писал(а):Использовать растровый слой, а хинт выводить через запрос к серверу.
Да, спасибо, это и правда красиво и быстро, но мне нужен именно openlayers и именно второй, т.к. уже очень много прикручено к данной карте, даже свои тейлы.Denis Rykov писал(а):UTFGrid?
Код: Выделить всё
var layerListeners = {
featureclick: function(e) {
alert("id=" + e.feature.id + ", color=" + e.feature.attributes.color + ", height=" + e.feature.attributes.height);
},
featureover: function(e) {
console.log("over", e.feature.id);
}
};
//featurecollection приходит с сервера
var geojson_format = new OpenLayers.Format.GeoJSON();
var layer1 = new OpenLayers.Layer.Vector(
// "Layer1", {eventListeners: layerListeners}
);
map.addLayer(layer1);
layer1.addFeatures(geojson_format.read(featurecollection));
И ещё, частенько вижу такие строки:
var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers;
но не совсем понимаю для чего они?
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: OpenLayers2. Как лучше нанести на карту 10000 полигонов?
OL2 умеет UTFGrid http://dev.openlayers.org/docs/files/Op ... id-js.html
Данный фрагмент кода позволяет брать тип рендера из URL, по дефолту в OL2 используются ['SVG', 'VML', 'Canvas']. Вот почитайте: https://trac.osgeo.org/openlayers/wiki/ ... WithCanvasMips писал(а):И ещё, частенько вижу такие строки:
var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers;
но не совсем понимаю для чего они?
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Гуру
- Сообщения: 3321
- Зарегистрирован: 27 июл 2009, 19:26
- Репутация: 748
- Ваше звание: Вредитель полей
Re: OpenLayers2. Как лучше нанести на карту 10000 полигонов?
Если запрос данных из базы занимает больше секунды, значит с архитектурой базы у вас какой-то адский ад. Я никакой специалист по Oracle, но так не должно быть вообще никогда.
Собственно, если вы не можете привести базу в нормальное состояние, можете периодически вываливать данные во что-то промежуточное и более быстрое (UTFGrid - один из вариантов, но не единственный).
Собственно, если вы не можете привести базу в нормальное состояние, можете периодически вываливать данные во что-то промежуточное и более быстрое (UTFGrid - один из вариантов, но не единственный).
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость