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

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

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

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

Добавлено: 25 авг 2009, 14:21
Mavka
Для этого нужно задавать 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. Создали карту стилей

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

Добавлено: 25 авг 2009, 16:03
churilova
Спасибо огромное, снова выручил, прям ангел :oops:

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

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

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

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

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

Добавлено: 07 сен 2009, 09:04
Mavka
Может быть устаревший OL? Попробуйте ночную сборку. Над масштабами сейчас активно работают.

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

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

Добавлено: 07 сен 2009, 09:50
churilova
И ночная сборка (что это кстати такое? :)), и последняя версия (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
все работает, только соответственно, номера домов отображаются всегда...

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

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

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

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

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

map.addControl(new OpenLayers.Control.Scale()); 

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

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

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

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

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

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

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

Добавлено: 23 янв 2010, 13:23
dobeer
Возможно ли данный механизм (отображения подписей) использовать для WMS слоя?

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

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

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

Добавлено: 23 янв 2010, 17:09
dobeer
Спасибо, попробую

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

Добавлено: 24 янв 2010, 22:35
dobeer
Сделал у себя так:
....

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

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" непонял, помогите плиз

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

Добавлено: 04 фев 2010, 05:42
churilova
Нужно не min, a maxScaleDenominator.

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