OpenLayers : Стиль векторной графики.

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Аватара пользователя
wmk
Активный участник
Сообщения: 102
Зарегистрирован: 11 янв 2009, 17:38
Репутация: 0
Откуда: Казань
Контактная информация:

OpenLayers : Стиль векторной графики.

Сообщение wmk » 22 сен 2009, 12:08

Господа вопрос такой есть:
Как можно в OpenLayers настроить стиль векторной линии для "OpenLayers.Control.Measure"?

Сейчас стили такие:

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

sketchSymbolizers = {
                "Point": {
                    pointRadius: 4,
                    graphicName: "circle",
                    fillColor: "white",
                    fillOpacity: 1,
                    strokeWidth: 1,
                    strokeOpacity: 1,
                    strokeColor: "#333333"
                },
                "Line": {
                    strokeWidth: 5,
                    graphicName: "circle",
                    strokeOpacity: 1,
                    pointRadius: 4,
                    strokeColor: "#FF5300"
                    //strokeDashstyle: "dash"
                },
                "Polygon": {
                    strokeWidth: 2,
                    strokeOpacity: 1,
                    strokeColor: "#666666",
                    fillColor: "white",
                    fillOpacity: 0.3
}
Выглядит стиль линии так:

Изображение

А мне хочется на каждую точку линии добавить свою картинку ... и получить что то вроде этого:

Изображение

Вопрос в том реально ли такое сделать ... ?
OurGuns.ru - пневматическое оружие России и мира
Пневматическое оружие , Страйкбольное оружие , Пейнтбольное оружие

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers : Стиль векторной графики.

Сообщение Mavka » 22 сен 2009, 13:16

лангольеры под окном жрали время ом-ном-ном

Аватара пользователя
wmk
Активный участник
Сообщения: 102
Зарегистрирован: 11 янв 2009, 17:38
Репутация: 0
Откуда: Казань
Контактная информация:

Re: OpenLayers : Стиль векторной графики.

Сообщение wmk » 22 сен 2009, 14:52

Есть такой вариант ... получить геометрию линии и наставить по её точкам меток с нужной картинкой ... но тогда при её редактировании надо и координаты меток пересчитывать.
OurGuns.ru - пневматическое оружие России и мира
Пневматическое оружие , Страйкбольное оружие , Пейнтбольное оружие

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: OpenLayers : Стиль векторной графики.

Сообщение bim2010 » 23 сен 2009, 13:02

А у меня это как-то получается:

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

            var myStyles = new OpenLayers.StyleMap({
                "default": new OpenLayers.Style({
                 externalGraphic: "hom19.gif",
                 graphicWidth: 14,
Идея взята из примера
http://openlayers.org/dev/examples/styles-rotation.html
Не стиль линий меняем а стиль для точек. В результате для всех объектов - узловые точки картинки и еще можно угол разный задать и прозрачность.

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

 rotation: "${angle}",
 graphicOpacity: 1,
А вот стиль линии пунктиром как - не знаю. Но это же косяк OL если они это не могут сделать. Ведь это просто необходимо...Дописывать самому?

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers : Стиль векторной графики.

Сообщение Mavka » 23 сен 2009, 14:16

bim2010
А не покажете ли скриншот?
лангольеры под окном жрали время ом-ном-ном

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: OpenLayers : Стиль векторной графики.

Сообщение bim2010 » 23 сен 2009, 15:25

Например смайлик под углом - запоминаю вектор в Субд Google Gears
Меня если честно когда я это делал больше волновали такие вопросы:
1.В чем хранить вектор на клиенте?
2.Вопрос производительности OL - как движка для вектора. (Адресный план одной улицы - домов 400 не более)
3.Прозрачность
4.Угол наклона
5.Скрыть вектор на определенном масштабе (пока не знаю как).
Вложения
OL.jpg
вектор в OL+ Google Gears
OL.jpg (236.47 КБ) 15613 просмотров

Аватара пользователя
wmk
Активный участник
Сообщения: 102
Зарегистрирован: 11 янв 2009, 17:38
Репутация: 0
Откуда: Казань
Контактная информация:

Re: OpenLayers : Стиль векторной графики.

Сообщение wmk » 23 сен 2009, 19:28

bim2010 писал(а):А у меня это как-то получается:
Класс, спасибо оч помогли :)
Вот только сразу вопрос: А получается так только в режиме "Редактирование"?

Я просто когда линию рисую ... картинкой отображается только последняя вершина, а все остальные нет.

Но когда перехожу в режим редактирования то все они становятся картинками. По сути хорошо, но хочется чтоб картинки оставались всегда :) ... а у Вас это реализовано ... если ДА то подскажите плиз!
  • А линию курсивом можно так сделать: "strokeDashstyle: "solid" // solid, dash, dot, similar
  • Скрыть вектор это же просто ... нужно просто получать параметры карты такие как Scale и Resolution. У карты есть методы map.getScale(), map.getResolution(). Чтоб определять все это "на лету" нужно добавить на карту обрабочик map.events.register("moveend", null, Moved) ... где Moved это функция которая этим заниматся будет
OurGuns.ru - пневматическое оружие России и мира
Пневматическое оружие , Страйкбольное оружие , Пейнтбольное оружие

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: OpenLayers : Стиль векторной графики.

Сообщение bim2010 » 24 сен 2009, 10:14

Да стиль линии просто пунктиром это и у меня есть, например при расчете длинны и площади
http://openlayers.com/dev/examples/measure.html
Вопрос шире в управлении стилем линии .
Например, в транспортном графе - указание направления движения, как это реализовано в GPSMapEdit. Какие есть в OL варианты управления стилем линии? Цвет, толщина, прозрачность, … а сам тип линии?
Да можно извратится, и присвоив для узлов тип – картинка (треугольник), вращая его получить направление движения в графе.
“Вот только сразу вопрос: А получается так только в режиме "Редактирование"?”
Но когда перехожу в режим редактирования то все они становятся картинками. По сути хорошо, но хочется чтоб картинки оставались всегда
Это, по моему, надо решать не с помощью Ol , а уже на серверной стороне – там менять стиль точек.
Если все же хочется это делать с вектором, надо найти переменные “стиль точек по умолчанию”.
Я не пробовал это делать.
А я раньше уже задавал этот вопрос
viewtopic.php?f=19&t=2906&p=10066#p10066
Вопрос 2. Как в OpenLayers на крупных масштабах убрать векторные слои?

Пробовал вот так:

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

if (map.getZoom() < 7) {
vector.renderer.destroy(); 
}
Это не работает
Если по кнопке vector.renderer.destroy(); - работает

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

function clear_data() {
// vector.destroyFeatures();
vector.renderer.destroy(); 
}. . .
<li><a href="javascript:clear_data();">Clear vector</a></li>
Вы писали:
обрабочик map.events.register("moveend", null, Moved)
А можно ссылку на пример, или кусочек кода…
Меня по прежнему волнует на мой взгляд нерешенность двух самых главных проблем с вектором в OL.
1. Скорость работы вектора
2. Способ хранения и передачи вектора на сервер.

Вариант с Geoserver-ом понятен – он на себя берет эту функцию (редактирование и запись).

Но не ужели нельзя взять OpenLayers.Protocol.SQL.Gears переписать его с Java скрипт на PHP и сделать, например OpenLayers.Protocol.SQL.MySQL

За полгода OL подрос на 200 К, а дописать поддержку SQL, около 15 килобайт никак…
Mavka может Вы, как координатор раздела Веб-картография, подтолкнете в бок разработчиков OL?
Я считаю Ol это должен уметь делать сам, без GeoServera.
Это бы подняло функциональность OL, в сборке с другими альтернативными GeoServerу WMS серверами.
А в каких то случах вообще обойтись без WMS преобразований: TMS - протокол с готовыми тайлами + вектор OL напрямую работающий с SQL через свой OpenLayers.Protocol.SQL
Последний раз редактировалось bim2010 24 сен 2009, 10:39, всего редактировалось 1 раз.

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers : Стиль векторной графики.

Сообщение Mavka » 24 сен 2009, 10:29

Как в OpenLayers на крупных масштабах убрать векторные слои?
minScale и maxScale в свойствах любого слоя.

Это слой появится только при масштабе 2000 и крупнее (1000, 500 и т.д.)

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

var layer = new OpenLayers.Layer.WFS('vector',
    'http://localhost:8080/geoserver/wfs',
    {typename: 'vector'},
    {minScale: 2000}
); 
У вас, соответственно, будет maxScale.

Еще, к вариант, использовать maxScaleDenominator в свойствах стиля.
лангольеры под окном жрали время ом-ном-ном

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: OpenLayers : Стиль векторной графики.

Сообщение bim2010 » 24 сен 2009, 10:50

Как это делать для WFS или WMS понятно. Вы уже раньше отвечали на подобный вопрос.
Я про другое

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

           vector = new OpenLayers.Layer.Vector("Слои", {
У меня для этого типа не работает... minScale

Аватара пользователя
wmk
Активный участник
Сообщения: 102
Зарегистрирован: 11 янв 2009, 17:38
Репутация: 0
Откуда: Казань
Контактная информация:

Re: OpenLayers : Стиль векторной графики.

Сообщение wmk » 24 сен 2009, 11:12

Как в OpenLayers на крупных масштабах убрать векторные слои?
Вот это надо добавить в ф-ию Init() ... которая выплоняет создание карты. Она выполнятся будет при любом движении карты и зуме. Соответственно при зуме > 2000 будет удалять слой

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

map.events.register("moveend", null, My);
                
function My() 
   {
   if ( map.getScale() > 2000 )
       {
       vector.renderer.destroy();
       }
   }
Но не ужели нельзя взять OpenLayers.Protocol.SQL.Gears переписать его с Java скрипт на PHP и сделать, например OpenLayers.Protocol.SQL.MySQL
Ну такие вещи пишутся ручками ручками ... для этого есть Ajax , я использую JsHttpRequest. У меня по сути все векторы и информация об объектах в MySql базе хранится :)
А в каких то случах вообще обойтись без WMS преобразований: TMS - протокол с готовыми тайлами + вектор OL напрямую работающий с SQL через свой OpenLayers.Protocol.SQL
Почитайте про JsHttpRequest ... там все это есть. А WMS на MapServer я например вообще использую только для определения попадания, вся карта города (5 зумов) в виде картинок лежик ... правда 100 метров весит, но это мелочи :) ... зато подгрузка моментальная.
OurGuns.ru - пневматическое оружие России и мира
Пневматическое оружие , Страйкбольное оружие , Пейнтбольное оружие

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers : Стиль векторной графики.

Сообщение Mavka » 24 сен 2009, 11:19

Cвойства определены в базовом классе Layers, от которого наследуется Vector (а WFS производный от Vector), механизм должен работать везде.

Взял пример из демо - Drawing Simple Vector Features Example. Добавил в свойства слоя maxScale:

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

var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry",
    {style: layer_style, maxScale: 5000000}
); 
При переходе с 1:7М к 1:3М весь вектор отключается.
лангольеры под окном жрали время ом-ном-ном

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: OpenLayers : Стиль векторной графики.

Сообщение bim2010 » 24 сен 2009, 11:20

Значит все таки
vector.renderer.destroy();

Спасибо!

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers : Стиль векторной графики.

Сообщение Mavka » 24 сен 2009, 11:25

А в каких то случах вообще обойтись без WMS преобразований...
Мне кажется, что принцип RESTful - каждый делает свою маленькую работу, клиент получает информацию в готовом виде.
лангольеры под окном жрали время ом-ном-ном

Ответить

Вернуться в «Веб-картография»

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

Сейчас этот форум просматривают: Bing [Bot] и 1 гость