Отображение подписей объектов

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
churilova
Интересующийся
Сообщения: 38
Зарегистрирован: 28 май 2009, 09:27
Репутация: 0

Отображение подписей объектов

Сообщение churilova » 25 авг 2009, 10:23

Здравствуйте! Как в OpenLayers для wfs-слоя сделать так, чтобы подписи объектов отображались только при определенном масштабе, т. е. чтобы, например, номера домов не загромождали изображение, когда виден весь город?

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

Re: Отображение подписей объектов

Сообщение Mavka » 25 авг 2009, 14:21

Для этого нужно задавать minScaleDenominator и maxScaleDenominator. Но они работают не в самом стиле, а только в правилах (rules). Вот пример реального кода. Надписи появляются только на масштабах крупнее 2000 (1000, 500 и т.д.):

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

drillholl_style_default = new OpenLayers.Style({
    pointRadius: 3,
    strokeWidth: 1,
    strokeColor: "black",
})

var drillholl_style_labels = new OpenLayers.Rule({
    name: 'labels',
    maxScaleDenominator: 2000,
    symbolizer: {
        label: "${name}", labelAlign: "lm",
        fontWeight: "bold", fontColor: "#2688ff"
    }
});

drillholl_style_default.addRules([drillholl_style_labels]);

var drillholl_style = new OpenLayers.StyleMap({
    'default': drillholl_style_default
}); 
То есть:
  1. Создали стиль
  2. Создали правило
  3. Добавили его к стилю
  4. Создали карту стилей
лангольеры под окном жрали время ом-ном-ном

churilova
Интересующийся
Сообщения: 38
Зарегистрирован: 28 май 2009, 09:27
Репутация: 0

Re: Отображение подписей объектов

Сообщение churilova » 25 авг 2009, 16:03

Спасибо огромное, снова выручил, прям ангел :oops:

churilova
Интересующийся
Сообщения: 38
Зарегистрирован: 28 май 2009, 09:27
Репутация: 0

Re: Отображение подписей объектов

Сообщение churilova » 07 сен 2009, 02:04

У меня это свойство не работает, в FF выдается ошибка: feature.layer is null, указывает на строку 1410 openLayers.js. Ругается, видимо, вот на что:

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

if(this.minScaleDenominator||this.maxScaleDenominator) {
  var scale=feature.layer.map.getScale();
}
Объекты в слое точно есть. Я определяю карту стилей при создании слоя. В чем может быть ошибка?

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

Re: Отображение подписей объектов

Сообщение Mavka » 07 сен 2009, 09:04

Может быть устаревший OL? Попробуйте ночную сборку. Над масштабами сейчас активно работают.

Чтобы точно узнать строку в OL, нужно подключать библиотеку для разработчиков. Если скачивали полный дистрибутив, то это в папке lib (в ней еще Firebug, Gears, OpenLayers и Rico). Вот целиком эту папку и скопировать на сервер.
лангольеры под окном жрали время ом-ном-ном

churilova
Интересующийся
Сообщения: 38
Зарегистрирован: 28 май 2009, 09:27
Репутация: 0

Re: Отображение подписей объектов

Сообщение churilova » 07 сен 2009, 09:50

И ночная сборка (что это кстати такое? :)), и последняя версия (2.8 ), и моя версия (2.7) выдают одно и то же: feature.layer is null и ругаются на одинаковую по содержанию строку :( Видимо, косяк все-таки где-то у меня...
Вот так создаю карту:

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

var bounds = new OpenLayers.Bounds(44632.6900390625, 49657.5798828125, 46045.4466796875, 50628.0333984375);
var options = {
  maxExtent: bounds,
  maxResolution: "auto",
  projection: "EPSG:4326",
  units: 'm'
};
map = new OpenLayers.Map('map', options);
Вот так создаю слой:

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

building_style_default = new OpenLayers.Style({
  pointRadius: 3,
  strokeWidth: 1,
  strokeColor: "black"
})
        
var building_style_labels = new OpenLayers.Rule({
  name: 'labels',
  maxScaleDenominator: 2000,
  symbolizer: {label: "${dom}", labelAlign: "lm", fontColor: "#2688ff"}
});
        
building_style_default.addRules([building_style_labels]);
var buildings = new OpenLayers.Layer.WFS(
  "Здания", 
  "/geoserver/wfs",
  {typename: 'topp:buildings'},
  {
  typename: 'buildings',
  featureNS: 'http://www.openplans.org/topp',
  extractAttributes: true,
  styleMap: new OpenLayers.StyleMap({
  'default': building_style_default }),
  renderers: renderer
});
Без строки:

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

maxScaleDenominator: 2000
все работает, только соответственно, номера домов отображаются всегда...

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

Re: Отображение подписей объектов

Сообщение Mavka » 08 сен 2009, 08:54

В WGS84 ед. измерения - градусы, иначе может не правильно расчитывать масштаб:

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

units: 'dd' 
Кстати, сам масштаб выводится на карту так:

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

map.addControl(new OpenLayers.Control.Scale()); 
лангольеры под окном жрали время ом-ном-ном

churilova
Интересующийся
Сообщения: 38
Зарегистрирован: 28 май 2009, 09:27
Репутация: 0

Re: Отображение подписей объектов

Сообщение churilova » 09 сен 2009, 01:53

Первоначальный масштаб получается такой: если единицы измерения 'm' - 1:6307, если 'dd' - 1:701M... Меняю значения max/minScaleDenominator, ошибка не исчезает. Может быть косяк где-то в самом featureType? Не зря же он пишет feature.layer is Null.

churilova
Интересующийся
Сообщения: 38
Зарегистрирован: 28 май 2009, 09:27
Репутация: 0

Re: Отображение подписей объектов

Сообщение churilova » 18 сен 2009, 03:39

Путем проб и ошибок, выяснила, что выше названная ошибка появляется из-за контрола для карты: редактирование слоя:

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

new OpenLayers.Control.ModifyFeature(buildings)
А вот чем конкретно он мешает - непонятно.

Аватара пользователя
dobeer
Активный участник
Сообщения: 199
Зарегистрирован: 25 дек 2009, 21:54
Репутация: 1
Откуда: Чита
Контактная информация:

Re: Отображение подписей объектов

Сообщение dobeer » 23 янв 2010, 13:23

Возможно ли данный механизм (отображения подписей) использовать для WMS слоя?

churilova
Интересующийся
Сообщения: 38
Зарегистрирован: 28 май 2009, 09:27
Репутация: 0

Re: Отображение подписей объектов

Сообщение churilova » 23 янв 2010, 15:40

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

Аватара пользователя
dobeer
Активный участник
Сообщения: 199
Зарегистрирован: 25 дек 2009, 21:54
Репутация: 1
Откуда: Чита
Контактная информация:

Re: Отображение подписей объектов

Сообщение dobeer » 23 янв 2010, 17:09

Спасибо, попробую

Аватара пользователя
dobeer
Активный участник
Сообщения: 199
Зарегистрирован: 25 дек 2009, 21:54
Репутация: 1
Откуда: Чита
Контактная информация:

Re: Отображение подписей объектов

Сообщение dobeer » 24 янв 2010, 22:35

Сделал у себя так:
....

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

map = new OpenLayers.Map( 'map', options);
            var mappath="/ms4w/Apache/example/okrug.map";
           var mapurl="http://localhost/cgi-bin/mapserv.exe";

building_style_default = new OpenLayers.Style({
  pointRadius: 3,
  strokeWidth: 1,
  strokeColor: "black"
})
        
var building_style_labels = new OpenLayers.Rule({
  name: 'labels',
  minScaleDenominator: 1000//,
  symbolizer: {label: "${Label}", labelAlign: "lm", fontColor: "#2688ff"}
});
        
building_style_default.addRules([building_style_labels]);

var buildings = new OpenLayers.Layer.WMS("Здания",mapurl,{map: mappath,transparent: 'true',layers: 'haus', format: 'png'},{'reproject': true}, {typename: 'topp:buildings'},  {typename: 'buildings', extractAttributes: true,
  styleMap: new OpenLayers.StyleMap({'default': building_style_default })});

map.addLayers([buildings]);
...

но надписи отображаются при любом масштабе...что я не так делаю?

поясните пожалуйста строку ...

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

symbolizer: {label: "${Label}", labelAlign: "lm", fontColor: "#2688ff"}
...я написал

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

${Label}"
, т.к. подумал, что Label это имя поля в dbf таблице, которое содержит надписи объектов, а что такое "lm" непонял, помогите плиз

churilova
Интересующийся
Сообщения: 38
Зарегистрирован: 28 май 2009, 09:27
Репутация: 0

Re: Отображение подписей объектов

Сообщение churilova » 04 фев 2010, 05:42

Нужно не min, a maxScaleDenominator.

Да, label - это имя поля в БД, свойство labelAlign отвечает за расположение надписи (lm - left middle, слева посередине), fontColor - цвет шрифта.

Ответить

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

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

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