Страница 1 из 1

OpenLayers2. Как лучше нанести на карту 10000 полигонов?

Добавлено: 16 июл 2016, 16:51
Mips
Добрый день. Сразу скажу, что скриптёр я ещё тот, так что не судите строго. С документацией у openlayers2 дела обстоят как то не очень или я просто не умею читать буржуйскую документацию. В основном ковыряю чужие примеры. Ну да не суть.
Задача у меня такая: необходимо с сервера отображать данные метеолокатора. Каждый локатор имеет 10000 квадратиков, т.е. матрицу 100х100. Координаты для каждого квадратика постоянны (4х4км), я их рассчитаю и буду передавать как константы. У каждого квадратика должно быть два свойства - цвет (число от 0 до 32) и высота (число от 0 до 13000). Т.е. при запросе серверу передаётся номер локатора, а сервер отправляет в ответ массив, в котором каждый из 10000 элементов содержит 4 координаты углов, цвет и высоту.
Я пробовал рассчитывать координаты углов в браузере чтобы уменьшить ответ сервера, но получается даже медленнее, чем загрузить готовые. Подгрузка данных с готовыми координатами получается порядка двух мегабайт, но сие работает в локалке, т.е. всё относительно быстро. И если нанести все 10000 квадратиков на карту, то это ещё терпимо, а если прикрутить к каждому квадратику евент, который при наведении на квадратик должен показывать хинт с цифрой высоты и цвета, то браузер начинает существенно лагать. А если таких локаторов нанести 3-4, то браузер сначала виснет на минуту-другую, а также при попытке сдвинуть/смаштабировать карту каждый раз подвисает секунд на 30.
Так вот есть ли какой то предел у опенлейерса? 10000 полигонов с ховером - это много для него? или я что-то неправильно делаю?
Посоветуйте, пожалуйста, как лучше подгружать и отображать столько данных и как оптимальнее сделать ховер на квадратиках?

Re: OpenLayers2. Как лучше нанести на карту 10000 полигонов?

Добавлено: 16 июл 2016, 17:34
Александр Мурый
Вопрос: почему бы не использовать растр?

Re: OpenLayers2. Как лучше нанести на карту 10000 полигонов?

Добавлено: 16 июл 2016, 17:41
ericsson
Использовать растровый слой, а хинт выводить через запрос к серверу.

Re: OpenLayers2. Как лучше нанести на карту 10000 полигонов?

Добавлено: 17 июл 2016, 07:55
Denis Rykov
UTFGrid?

[ Сообщение с мобильного устройства ]

Re: OpenLayers2. Как лучше нанести на карту 10000 полигонов?

Добавлено: 17 июл 2016, 22:35
Mips
Александр Мурый писал(а):Вопрос: почему бы не использовать растр?
а зуммирование будет работать? и прозрачность. Мне бы примерчик
ericsson писал(а):Использовать растровый слой, а хинт выводить через запрос к серверу.
данные о каждом локаторе хранятся в оракловой базе в виде двух записей, состоящей из пары десятков полей с технической информацией и поля blob с данными о 10000 квадратиках: одна запись отвечает за цвет, вторая - за высоту.В базе на данный момент около миллиона записей. Вытягивание из базы одной записи длиться чуть больше секунды. И это ещё без распарсивания на отдельные квадраты. Так что такой вариант не приемлем. Проще тогда уж в яваскрипте хранить массив квадратиков и из него выдергивать.
Denis Rykov писал(а):UTFGrid?
Да, спасибо, это и правда красиво и быстро, но мне нужен именно openlayers и именно второй, т.к. уже очень много прикручено к данной карте, даже свои тейлы.

Код: Выделить всё

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));
убрал лишнее... в общем если eventListeners заремлен как сейчас, карта таскается приемлимо с 10000 квадратиками, но если включить всё начинает тормозить. Такое может быть или я что-то наворотил?

И ещё, частенько вижу такие строки:
var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers;
но не совсем понимаю для чего они?

Re: OpenLayers2. Как лучше нанести на карту 10000 полигонов?

Добавлено: 18 июл 2016, 02:14
Denis Rykov
OL2 умеет UTFGrid http://dev.openlayers.org/docs/files/Op ... id-js.html
Mips писал(а):И ещё, частенько вижу такие строки:
var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers;
но не совсем понимаю для чего они?
Данный фрагмент кода позволяет брать тип рендера из URL, по дефолту в OL2 используются ['SVG', 'VML', 'Canvas']. Вот почитайте: https://trac.osgeo.org/openlayers/wiki/ ... WithCanvas

Re: OpenLayers2. Как лучше нанести на карту 10000 полигонов?

Добавлено: 18 июл 2016, 03:11
ericsson
Если запрос данных из базы занимает больше секунды, значит с архитектурой базы у вас какой-то адский ад. Я никакой специалист по Oracle, но так не должно быть вообще никогда.
Собственно, если вы не можете привести базу в нормальное состояние, можете периодически вываливать данные во что-то промежуточное и более быстрое (UTFGrid - один из вариантов, но не единственный).