WMS как одно изображение в Google Maps v3
Я следую коду на http://www.gisdoctor.com/v3/mapserver.html чтобы наложить WMS как изображение в Картах Google с помощью API v3. Код JS по ссылке выше выглядит следующим образом
"WMSGetTileUrl" : function(tile, zoom) {
var projection = map.getProjection();
var zpow = Math.pow(2, zoom);
var ul = new google.maps.Point(
tile.x * 256.0 / zpow,
(tile.y + 1) * 256.0 / zpow
);
var lr = new google.maps.Point(
(tile.x + 1) * 256.0 / zpow,
tile.y * 256.0 / zpow
);
var ulw = projection.fromPointToLatLng(ul);
var lrw = projection.fromPointToLatLng(lr);
var bbox = ulw.lng() + "," + ulw.lat() + "," + lrw.lng() + "," + lrw.lat();
return url = "http://url/to/mapserver?" +
"version=1.1.1&" +
"request=GetMap&" +
"Styles=default&" +
"SRS=EPSG:4326&" +
"Layers=wmsLayers&" +
"BBOX=" + bbox + "&" +
"width=256&" +
"height=256&" +
"format=image/png&" +
"TRANSPARENT=TRUE";
},
"addWmsLayer" : function() {
/*
Creating the WMS layer options. This code creates the Google
imagemaptype options for each wms layer. In the options the function
that calls the individual wms layer is set
*/
var wmsOptions = {
alt: "MapServer Layers",
getTileUrl: WMSGetTileUrl,
isPng: false,
maxZoom: 17,
minZoom: 1,
name: "MapServer Layer",
tileSize: new google.maps.Size(256, 256)
};
/*
Creating the object to create the ImageMapType that will call the WMS
Layer Options.
*/
wmsMapType = new google.maps.ImageMapType(wmsOptions);
map.overlayMapTypes.insertAt(0, wmsMapType);
},
Все работает нормально, но, конечно, WMS возвращается в виде 256 х 256 плиток. Никаких сюрпризов, потому что это то, что я просил. Однако после обсуждения на http://groups.google.com/group/google-maps-js-api-v3/browse_thread/thread/c22837333f9a1812/d410a2a453025b38 может показаться, что мне лучше запросить несвязанное (одно) изображение с картсервера. Это будет облагать налогом мой сервер меньше. В любом случае, я хотел бы поэкспериментировать с одним изображением, но я не могу правильно составить запрос для него.
В частности, я изменил размер плитки на что-то большое; например, я пробовал 1024 x 1024 плитки. Я получил меньше плиток, но возвращенные изображения не соответствовали границам базового слоя Карт Google.
Я бы не хотел указывать размер плитки вообще. Вместо этого я должен динамически определить размер плитки, скажем, на 256 пикселей больше, чем текущий размер карты. Таким образом, будет возвращено одно изображение, независимо от размера карты. Кроме того, бесшовная панорама будет реализована с помощью дополнительных 256 пикселей по краям карты.
Предложения?
2 ответа
Посмотрите на тот же вопрос, на который я только что ответил для кого-то другого. Вероятно, это будет ваша проекция. EPSG:4326 - это неправильная проекция для Карт Google. Изменение проекции означает, что вам нужно изменить способ вычисления координат и ссылки на них.
1) у меня работает - с 512 и 1024 тоже. Вам просто нужно внести изменения во всех соответствующих местах (вычисление угловых координат, настройка tileSize, настройка ширины и высоты параметров WMS). Любая настройка плитки должна быть возможной, если вы просто обрабатываете ее правильно во всех местах кода.
2) Я думаю, что вы пытаетесь оптимизировать в неправильном месте. Плитки 256x256 были созданы по причине. Помните, что Google кэширует тайлы, поэтому при использовании больших тайлов решение может быть намного медленнее. Также карта будет загружаться быстрее для пользователя.
3) Концепция плитки является правильной вещью и должна быть сохранена. Такие вещи, как получение всей карты, не сработают - представьте себе панорамирование карты. НЕ пытайтесь изобретать велосипед и придерживаться текущей концепции плитки Google - она оптимизирована для этого типа приложений. Если вам нужно получить карту в виде одного изображения, вы можете использовать статические API Google Maps.