Отображение подписей объектов
-
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 май 2009, 09:27
- Репутация: 0
Отображение подписей объектов
Здравствуйте! Как в OpenLayers для wfs-слоя сделать так, чтобы подписи объектов отображались только при определенном масштабе, т. е. чтобы, например, номера домов не загромождали изображение, когда виден весь город?
- Mavka
- Гуру
- Сообщения: 2060
- Зарегистрирован: 14 мар 2008, 17:36
- Репутация: 9
Re: Отображение подписей объектов
Для этого нужно задавать 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
});
- Создали стиль
- Создали правило
- Добавили его к стилю
- Создали карту стилей
лангольеры под окном жрали время ом-ном-ном
-
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 май 2009, 09:27
- Репутация: 0
Re: Отображение подписей объектов
Спасибо огромное, снова выручил, прям ангел
-
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 май 2009, 09:27
- Репутация: 0
Re: Отображение подписей объектов
У меня это свойство не работает, в 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: Отображение подписей объектов
Может быть устаревший OL? Попробуйте ночную сборку. Над масштабами сейчас активно работают.
Чтобы точно узнать строку в OL, нужно подключать библиотеку для разработчиков. Если скачивали полный дистрибутив, то это в папке lib (в ней еще Firebug, Gears, OpenLayers и Rico). Вот целиком эту папку и скопировать на сервер.
Чтобы точно узнать строку в OL, нужно подключать библиотеку для разработчиков. Если скачивали полный дистрибутив, то это в папке lib (в ней еще Firebug, Gears, OpenLayers и Rico). Вот целиком эту папку и скопировать на сервер.
лангольеры под окном жрали время ом-ном-ном
-
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 май 2009, 09:27
- Репутация: 0
Re: Отображение подписей объектов
И ночная сборка (что это кстати такое? ), и последняя версия (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: Отображение подписей объектов
В WGS84 ед. измерения - градусы, иначе может не правильно расчитывать масштаб:
Кстати, сам масштаб выводится на карту так:
Код: Выделить всё
units: 'dd'
Код: Выделить всё
map.addControl(new OpenLayers.Control.Scale());
лангольеры под окном жрали время ом-ном-ном
-
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 май 2009, 09:27
- Репутация: 0
Re: Отображение подписей объектов
Первоначальный масштаб получается такой: если единицы измерения 'm' - 1:6307, если 'dd' - 1:701M... Меняю значения max/minScaleDenominator, ошибка не исчезает. Может быть косяк где-то в самом featureType? Не зря же он пишет feature.layer is Null.
-
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 май 2009, 09:27
- Репутация: 0
Re: Отображение подписей объектов
Путем проб и ошибок, выяснила, что выше названная ошибка появляется из-за контрола для карты: редактирование слоя:
А вот чем конкретно он мешает - непонятно.
Код: Выделить всё
new OpenLayers.Control.ModifyFeature(buildings)
- dobeer
- Активный участник
- Сообщения: 199
- Зарегистрирован: 25 дек 2009, 21:54
- Репутация: 1
- Откуда: Чита
- Контактная информация:
Re: Отображение подписей объектов
Возможно ли данный механизм (отображения подписей) использовать для WMS слоя?
-
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 май 2009, 09:27
- Репутация: 0
Re: Отображение подписей объектов
Да, можно. Я так делаю для домов, когда масштаб мелкий, номера не видно, а при приближении они отображаются.
- dobeer
- Активный участник
- Сообщения: 199
- Зарегистрирован: 25 дек 2009, 21:54
- Репутация: 1
- Откуда: Чита
- Контактная информация:
- dobeer
- Активный участник
- Сообщения: 199
- Зарегистрирован: 25 дек 2009, 21:54
- Репутация: 1
- Откуда: Чита
- Контактная информация:
Re: Отображение подписей объектов
Сделал у себя так:
.......
но надписи отображаются при любом масштабе...что я не так делаю?
поясните пожалуйста строку ......я написал , т.к. подумал, что Label это имя поля в dbf таблице, которое содержит надписи объектов, а что такое "lm" непонял, помогите плиз
....
Код: Выделить всё
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}"
-
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 май 2009, 09:27
- Репутация: 0
Re: Отображение подписей объектов
Нужно не min, a maxScaleDenominator.
Да, label - это имя поля в БД, свойство labelAlign отвечает за расположение надписи (lm - left middle, слева посередине), fontColor - цвет шрифта.
Да, label - это имя поля в БД, свойство labelAlign отвечает за расположение надписи (lm - left middle, слева посередине), fontColor - цвет шрифта.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя