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

Не знаете, где задать вопрос? Задавайте здесь.
Ответить
Mips
Новоприбывший
Сообщения: 2
Зарегистрирован: 16 июл 2016, 15:54
Репутация: 0

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

Сообщение Mips » 16 июл 2016, 16:51

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

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

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

Сообщение Александр Мурый » 16 июл 2016, 17:34

Вопрос: почему бы не использовать растр?
Редактор материалов, модератор форума

ericsson
Гуру
Сообщения: 3321
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 748
Ваше звание: Вредитель полей

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

Сообщение ericsson » 16 июл 2016, 17:41

Использовать растровый слой, а хинт выводить через запрос к серверу.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 17 июл 2016, 07:55

UTFGrid?

[ Сообщение с мобильного устройства ]
Spatial is now, more than ever, just another column- The Geometry Column.

Mips
Новоприбывший
Сообщения: 2
Зарегистрирован: 16 июл 2016, 15:54
Репутация: 0

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

Сообщение Mips » 17 июл 2016, 22:35

Александр Мурый писал(а):Вопрос: почему бы не использовать растр?
а зуммирование будет работать? и прозрачность. Мне бы примерчик
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;
но не совсем понимаю для чего они?

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 18 июл 2016, 02:14

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
Spatial is now, more than ever, just another column- The Geometry Column.

ericsson
Гуру
Сообщения: 3321
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 748
Ваше звание: Вредитель полей

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

Сообщение ericsson » 18 июл 2016, 03:11

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

Ответить

Вернуться в «Я новичок!»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей