#javascript #maps #leaflet #coordinates #wms
#javascript #Карты #листовка #координаты #wms
Вопрос:
Я разрабатываю приложение, используя Ionic framework с AngularJS и библиотеку LeafletJS.
Когда я загружаю карту в первый раз, она отображается правильно по центру.
Но, когда я переключаюсь на другой вид приложения и возвращаюсь к виду карты, слой плитки WMS отображается смещенным от центра, видна лишь небольшая его часть в верхнем левом углу карты.
Вот фрагмент кода, который создает карту и загружает слой плитки WMS:
function crearPlano($scope, $http, infoService, sharedProperties, poisService, createModal) {
var building = localStorage.building,
floor = localStorage.planta,
floor_id = building floor,
building_id = floor_id.replace(/./g,"_").toLowerCase();
var parameters =
[
'proyecto/ows',
'service=WFS',
'version=1.0.0',
'request=GetFeature',
'typeName=proyecto:' building_id,
'srsName=epsg:4326',
'outputFormat=application/json'
]
var url = APP_CONSTANTS.URI_Geoserver_1 'proyecto/ows?' parameters.join('amp;');
$.ajax({
url : url,
type: 'GET',
dataType : 'json',
crossDomain: true,
headers: { 'Access-Control-Allow-Origin': '*' },
success: function(data) {
handleJson(data, sharedProperties, poisService, createModal, function(map){
sharedProperties.setMap(map);
});
}
});
function handleJson(data, floor_id, sharedProperties, poisService, createModal, callback) {
console.log("handleJson", data, floor_id);
var map = sharedProperties.getMap(),
coordinates = data.features[0].geometry.coordinates[0][0][0],
floorCoordinates = new L.latLng(coordinates[1], coordinates[0]);
//Remove previous plan layers
if(!(typeof map == 'undefined')) { map.remove(); }
var imageLayer = new L.tileLayer.wms(APP_CONSTANTS.URI_Geoserver_2 "sigeuz/wms",
{
layers: 'sigeuz:vista_plantas',
maxZoom: 25,
zIndex: 5,
viewparams : 'PLANTA:' floor_id,
format: 'image/png', transparent: true, attribution: floor_id
});
console.log("Before create map --> Center", JSON.stringify(floorCoordinates));
console.log("Before create map --> MaxBounds", JSON.stringify(L.geoJson(data).getBounds()));
map= new L.map('plan'
,{
crs: L.CRS.EPSG3857,
layers: [imageLayer]
}
).setView(floorCoordinates, 20);
console.log("After create map --> Center", JSON.stringify(plano.getCenter()));
console.log("After create map --> Bounds", JSON.stringify(plano.getBounds()));
callback(map);
}
}
Почему загрузка карты центрируется только в первый раз, но смещается после?
Я добавил в код несколько консольных журналов для отладки данных, переданных в качестве параметров при создании карты, и данных карты после ее создания. Таким образом, я могу сравнить, изменилось ли что-то в обеих ситуациях, описанных ранее. Это результат:
Before create map --> Center {"lat":41.64063807836347,"lng":-0.90146666131869}
Before create map --> MaxBounds {"_southWest":{"lat":41.64061302810611,"lng":-0.9015017606364195},"_northEast":{"lat":41.64079735418267,"lng":-0.9012732012812255}}
After create map --> Center {"lat":41.6406381751715,"lng":-0.9014656782889374}
After create map --> Bounds {"_southWest":{"lat":41.64032848115259,"lng":-0.9017432869219788},"_northEast":{"lat":41.640947867702096,"lng":-0.9011880696558963}}
Before create map --> Center {"lat":41.64063807836347,"lng":-0.90146666131869}
Before create map --> MaxBounds {"_southWest":{"lat":41.64061302810611,"lng":-0.9015017606364195},"_northEast":{"lat":41.64079735418267,"lng":-0.9012732012812255}}
After create map --> Center {"lat":41.64063807836347,"lng":-0.90146666131869}
After create map --> Bounds {"_southWest":{"lat":41.640637639043334,"lng":-0.9014663100242616},"_northEast":{"lat":41.640637639043334,"lng":-0.9014663100242616}}
Как можно видеть, данные, переданные в качестве центральной точки и максимальных границ для создания карты, одинаковы в обоих случаях, но после создания карты координаты центра карты и границы немного отличаются от первой ситуации ко второй.
Я не совсем понимаю, почему это меняется.
Ответ №1:
Запускайте invalidateSize()
каждый раз, когда контейнер карты потенциально изменяет размер. Это включает в себя скрытие / отображение его с помощью jquery, ionic и тому подобного.
Комментарии:
1. Похоже, это не работает, слой плитки WMS по-прежнему не центрирован