У меня действительно есть большая проблема, которую я пока не могу решить. Вот моя проблема. На самом деле у меня есть карта, на которой я показываю маркеры (WMSGetFeatureInfo) в зависимости от некоторых категорий, которые я хочу показать или скрыть.OpenLayers: всплывающее окно с несколькими слоями
Но вот что я на самом деле получаю эти маркеры как файл * .map, который на самом деле является файлом PNG, содержащим все маркеры.
Когда я нажимаю на маркер, я получаю позицию щелчка, а затем добавляю всплывающее окно. Но чем больше слоев у меня отображается на карте, тем больше всплывающее окно указывает далеко от соответствующего маркера.
Вот некоторый код:
var layer = new OpenLayers.Layer.WMS(
category.label,
"/mapserv?Map=" + category.url,
{
layers : category.layer,
format : 'image/png',
version : '1.3.0',
srs : 'ESPG:3163'
},
{
isBaseLayer : false,
singleTile : true,
visibility : visibility,
}
);
var info = new OpenLayers.Control.WMSGetFeatureInfo({
title : 'get details by clicking',
layers : [ layer ],
infoFormat : "text/plain",
queryVisible : true,
eventListeners : {
getfeatureinfo : function(event){
document.body.style.cursor = 'auto';
var getId = function(text) {
result = context.settings.pattern.exec(text);
if(result == null) return;
return result[1];
}
var id = getId(event.text);
request = jQuery.ajax({
url : "/cartoweb/FicheTheme",
type : "get",
data : "idGeoEad="+id,
success : function(response, textStatus, jqXHR){
if (response == null || response['data'] == null) {
return;
}
context.generateAndShowPopup(event.xy, response['data']['metaData']);
}
});
},
beforegetfeatureinfo : function(event){
document.body.style.cursor = 'wait';
},
nogetfeatureinfo : function(event){
document.body.style.cursor = 'auto';
}
}
});
this.map.addControl(info);
info.activate();
generateAndShowPopup : function(latlong, text) {
var lonlatfrompx = this.map.getLonLatFromViewPortPx(latlong);
var anchor = {
'size' : new OpenLayers.Size(0,0),
'offset' : new OpenLayers.Pixel(-36, 6),
'keepInMap' : true
};
// Hide by default popup actually open
if(this.popup !== undefined) {
this.popup.hide();
}
// Create a new popup
this.popup = new OpenLayers.Popup.Anchored(
"chicken",
lonlatfrompx,
new OpenLayers.Size(2000, 2000),
'<div class="popupTail"></div><div class="popupContent">' + text + '</div>',
anchor,
false,
function(){}
);
// Popup settings
this.popup.setBackgroundColor('transparent');
this.popup.panMapIfOutOfView = true;
this.popup.calculateRelativePosition = function() { return 'tr'; }
// Add it on the map
this.map.addPopup(this.popup);
var that = this;
setTimeout(function(){
that.popup.updateSize();
}, 50);
this.map.setCenter(lonlatfrompx);
}
Не уверен, что, если я делаю что-то неправильно, но если кто-то уже сталкивался с такой же вопрос, что будет очень полезно знать, где я сделал что-то неправильно.
Большое спасибо
EDIT
Ok поэтому я попытался перепроецировать в LatLong на слое, но он по-прежнему не работает. Тем не менее, я делаю прогресс:
// Layer is the layer associated to each WMSGetFeatureInfo
// this.layer is the base layer used to display the map
lonlatfrompx.transform(layer.projection, this.layer.projection);
this.map.setCenter(lonlatfrompx);
EDIT 1
Ok, так что я делаю успехи. Думаю, я знаю, откуда эта проблема, но я все еще не вижу/не знаю, как я ее разрешу (пока).
При запуске переменной info
я делаю вызов ajax, внутри которого будет отображаться всплывающее окно при нажатии. Дело в том, что чем больше я добавляю слой, тем больше этот запрос ajax пытается получить информацию.
Скажем, я показываю на карте 5 разных слоев (ИТ, дизайн, запуск, компьютер и рабочий стол). Затем, когда я нажимаю маркеры (WMSGetFeatureInfo), на самом деле пытаюсь сделать ajax request * [number of layers visible]
, а затем изменить в какой-то момент (иногда) значение позиции.
Чтобы решить эту проблему, мне нужно будет избежать этого запроса ajax для выполнения более одного раза. Есть идеи?
Спасибо за ваш андерсер. Это интересно. Однако, поскольку я новичок в Openlayer, что я могу сделать? Я отредактировал мой пост после того, как попробовал другие вещи, но все равно не успел :(Спасибо – lkartono
plz см. Мое обновление – JSC
Привет, спасибо за обновление. Я использую ajax, потому что URL-адрес отличается от сервера WMS '/ cartoweb/FicheTheme? IdGeoEad = '. Фактическая система не основана на сервере для получения данных, поэтому мне нужно запросить конкретный URL-адрес, содержащий идентификатор, чтобы вернуть информацию, связанную с маркером. Странное поведение, которое я заметил, заключается в том, что если есть, например, 3 слоя на карте, 'eventListeners: getfeatureinfo' выполняется 3 раза и иногда возвращает значения mulitple. В этот момент, похоже, ломается. Я пытаюсь использовать' drillDown', но все еще не работает :(Мысли? – lkartono