#openlayers #virtual-earth #geoserver #getfeatureinfo
#openlayers #виртуальная земля #геосервер #getfeatureinfo
Вопрос:
Я просто скопировал пример кода из http://openlayers.org/dev/examples/getfeatureinfo-control.html .
Я использовал geoserver для его запуска, и все работает должным образом, как в интернет-версии, теперь я попытался изменить базовый политический уровень с помощью виртуальной карты земли.
Из-за природы виртуальной земли и карты Google я установил для spherical mercator значение true, но после этого функция выделения больше не работает.
Я думаю, я заметил, в чем проблема, существуют разные проекции между вектором, который я создаю, и остальными слоями, и openlayers не знает, как их объединить. Есть ли способ преобразовать мой векторный слой из (я думаю) epsg: 4326 в epsg: 900913 (sherical mercator)?
Ниже мой код:
<script src="http://openlayers.org/api/OpenLayers.js"></script>
<style>
.opmap
{
height:500px;
width:550px;
}
/* The map and the location bar */
#map {
clear: both;
position: relative;
width: 400px;
height: 450px;
border: 1px solid black;
}
.mypopuphtml{
padding-left:5px;
padding-top:0px;
padding-bottom:0px;
padding-right:5px;
font-family:Arial;
font-size:8pt;
background-color:white;
}
</style>
<script defer="defer" type="text/javascript">
var map, infocontrols, water, highlightlayer;
function load() {
var options = {
maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
//maxExtent: new OpenLayers.Bounds(11.1373,46.6196,11.2117,46.6919),
numZoomLevels: 19,
units: 'degrees',
projection: new OpenLayers.Projection("EPSG:4326"),
displayProjection: new OpenLayers.Projection("EPSG:4326")
};
map = new OpenLayers.Map('map', options);
/*
var political = new OpenLayers.Layer.WMS("State Boundaries",
"http://localhost:8080/geoserver/wms",
{'layers': 'topp:tasmania_state_boundaries', transparent: true, format: 'image/gif'},
{isBaseLayer: true}
);
*/
// setup tiled layer
var blConfig = {'sphericalMercator': true};
var ve = new OpenLayers.Layer.VirtualEarth( "Bing", blConfig);
var roads = new OpenLayers.Layer.WMS("Roads",
"http://localhost:8080/geoserver/wms",
{'layers': 'topp:tasmania_roads', transparent: true, format: 'image/gif'},
{isBaseLayer: false}
);
var cities = new OpenLayers.Layer.WMS("Cities",
"http://localhost:8080/geoserver/wms",
{'layers': 'topp:tasmania_cities', transparent: true, format: 'image/gif'},
{isBaseLayer: false}
);
water = new OpenLayers.Layer.WMS("Bodies of Water",
"http://localhost:8080/geoserver/wms",
{'layers': 'topp:tasmania_water_bodies', transparent: true, format: 'image/gif'},
{isBaseLayer: false}
);
highlightLayer = new OpenLayers.Layer.Vector("Highlighted Features", {
isBaseLayer: false,
projection: new OpenLayers.Projection("EPSG:900913")
}
);
infoControls = {
click: new OpenLayers.Control.WMSGetFeatureInfo({
url: 'http://localhost:8080/geoserver/wms',
title: 'Identify features by clicking',
layers: [water],
queryVisible: true
}),
hover: new OpenLayers.Control.WMSGetFeatureInfo({
url: 'http://localhost:8080/geoserver/wms',
title: 'Identify features by clicking',
layers: [water],
hover: true,
// defining a custom format options here
formatOptions: {
typeName: 'water_bodies',
featureNS: 'http://www.openplans.org/topp'
},
queryVisible: true
})
}
//map.addLayers([political, roads, cities, water, highlightLayer]);
map.addLayers([ve, roads, cities, water, highlightLayer]);
for (var i in infoControls) {
infoControls[i].events.register("getfeatureinfo", this, showInfo);
map.addControl(infoControls[i]);
}
map.addControl(new OpenLayers.Control.LayerSwitcher());
infoControls.click.activate();
map.zoomToMaxExtent();
}
function showInfo(evt) {
if (evt.features amp;amp; evt.features.length) {
highlightLayer.destroyFeatures();
highlightLayer.addFeatures(evt.features);
highlightLayer.redraw();
} else {
$('responseText').innerHTML = evt.text;
}
}
function toggleControl(element) {
for (var key in infoControls) {
var control = infoControls[key];
if (element.value == key amp;amp; element.checked) {
control.activate();
} else {
control.deactivate();
}
}
}
function toggleFormat(element) {
for (var key in infoControls) {
var control = infoControls[key];
control.infoFormat = element.value;
}
}
function toggleLayers(element) {
for (var key in infoControls) {
var control = infoControls[key];
if (element.value == 'Specified') {
control.layers = [water];
} else {
control.layers = null;
}
}
}
// function toggle(key
</script>
Комментарии:
1. Почему у вас есть векторный слой в EPSG: 900913, если вы не используете данные Google Maps?
Ответ №1:
Я не уверен, с какой проблемой вы столкнулись.
<script src='http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1'></script>
также
function load() {
var options = {
projection: new OpenLayers.Projection("EPSG:900913"),
displayProjection: new OpenLayers.Projection("EPSG:4326"),
units: "m",
numZoomLevels: 22,
maxResolution: 156543.0339,
maxExtent: new OpenLayers.Bounds(-20037508, -20037508,
20037508, 20037508.34)
};
Затем,
var veroad = new OpenLayers.Layer.VirtualEarth(
"Bing",
{isBaseLayer: true, 'sphericalMercator': true}
);
Эти данные WMS не кажутся правильными, за исключением water, которая нормально отображается на виртуальной карте Земли.
Моя проблема в том, что Прокси сообщает об ошибках, если я запрашиваю FeatureInfo с сервера, отличного от того, который обслуживал страницу.