Страница 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
});
То есть:
- Создали стиль
- Создали правило
- Добавили его к стилю
- Создали карту стилей
Re: Отображение подписей объектов
Добавлено: 25 авг 2009, 16:03
churilova
Спасибо огромное, снова выручил, прям ангел

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
});
Без строки:
все работает, только соответственно, номера домов отображаются всегда...
Re: Отображение подписей объектов
Добавлено: 08 сен 2009, 08:54
Mavka
В WGS84 ед. измерения - градусы, иначе может не правильно расчитывать масштаб:
Кстати, сам масштаб выводится на карту так:
Код: Выделить всё
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 это имя поля в dbf таблице, которое содержит надписи объектов, а что такое "lm" непонял, помогите плиз
Re: Отображение подписей объектов
Добавлено: 04 фев 2010, 05:42
churilova
Нужно не min, a maxScaleDenominator.
Да, label - это имя поля в БД, свойство labelAlign отвечает за расположение надписи (lm - left middle, слева посередине), fontColor - цвет шрифта.