MIN/MAX ZOOM المستوى في OpenLayers
-
27-09-2019 - |
سؤال
أنا أستخدم OpenLayers لعرض خريطة في صفحة ويب. أنا أستخدم البلاط من CloudMade ، لكن نفس المشكلات تحدث مع بلاط Mapnik من OpenStreetMap.
أحاول تقييد الخريطة حتى لا يتمكن المستخدم من التكبير طوال الطريق إلى World View - أريدهم أن يبقوا على مستوى المدينة تقريبًا على الأقل.
لقد حاولت استخدام minZoomLevel
/ maxZoomLevel
/ numZoomLevels
ملكيات؛ فقط maxZoomLevel
و numZoomLevels
يبدو أن الخصائص تعمل ، في حين minZoomLevel
يبدو أن الممتلكات يتم تجاهلها تمامًا.
هل هناك طريقة أخرى لإنجاز هذا؟
المحلول
Minzoomlevel غير مدعوم لطبقات XYZ ، منها OSM فئة فرعية.
شاهد التذاكر التالية لـ الحلول:
- http://trac.osgeo.org/openlayers/ticket/2909 (تطبيق إزاحة التكبير)
- http://trac.osgeo.org/openlayers/ticket/2189 (أضف Minzoomlevel Patch)
نصائح أخرى
يمكنك تجاوز isValidZoomLevel
وظيفة. شيء من هذا القبيل (لم يتم اختباره):
OpenLayers.Map.isValidZoomLevel = function(zoomLevel) {
return ( (zoomLevel != null) &&
(zoomLevel >= 2) && // set min level here, could read from property
(zoomLevel < this.getNumZoomLevels()) );
}
تعديل
أو ستحتاج إلى تجاوز القرارات المتاحة ، انظر المثال هنا: http://dev.openlayers.org/examples/zoomlevels.html
لقد وجدت أبسط طريقة لتقييد مستويات MaxZoom لطبقة XYZ هي تجاوز طريقة GetNumzoomlevels:
map.getNumZoomLevels = function(){
return 10;
};
هذا pevents يتجاوز المستوى 10 ويسحب أيضًا عنصر تحكم Zoombar بشكل صحيح. هذا ومزيج من zoomOffset
يجب أن يسمح لك الخيار بالتحكم بسهولة في تكبير Min/Max دون الحاجة إلى العبث بقرارات أو فئات فرعية.
إجابات أخرى هنا تشير إلى إصدارات OpenLayers قبل الإصدار 3.
مع OpenLayers 3 ، يمكنك استخدام maxZoom
خيار خريطة عند تهيئة الخريطة ، على النحو التالي:
var map = new ol.Map({
target: 'mapcontainer-001',
layers: layers, // Layers need to be initialized previously
view: new ol.View({
center: ol.proj.transform([-5.12345, 42.12345], 'EPSG:4326', 'EPSG:3857'),
zoom: 12,
maxZoom: 19
})
});
يمكن العثور على مزيد من المعلومات في وثائق OpenLayers: http://openlayers.org/en/v3.0.0/doc/tutorials/concepts.html
الآن أستخدم هذا في "العرض":
view: new ol.View({
center: ol.proj.transform([-3.707524, 40.485644], 'EPSG:4326',EPSG:3857'),
zoom: 15,
maxZoom: 17,
minZoom: 6
}),
وهو يعمل بشكل جيد
تحديد القرارات لا يحل المشكلة (حتى في الإصدار 2.1) - لم أجد أي حلول عن هذا ، لذلك صنعت Zoombar الخاص بي في JS - هذا ما أوصي به لأي شخص يواجه مشكلات مع Zoombar باستخدام Custom البلاط.
انتهى بي الأمر بهذا الحل لأنني لم أستطع معرفة كيفية استخدام Zoomoffset في الإعداد الخاص بي.
map.getNumZoomLevels = function(){
return (options.maxzoom-options.minzoom+1);
};
map.isValidZoomLevel = function(zoomLevel) {
var valid = ( (zoomLevel != null) &&
(zoomLevel >= options.minzoom) &&
(zoomLevel <= options.maxzoom) );
if(!valid && map.getZoom() == 0){
map.zoomTo(options.maxzoom - (options.maxzoom - options.minzoom)/2);
}
return valid;
}
جربت شيئًا كهذا وهو يعمل بالنسبة لي:
map.newMoveTo = map.moveTo;
map.moveTo = function(lonlat,zoom,options){
return(zoom>=maxZoom && zoom<=minZoom)?map.newMoveTo(lonlat,zoom,options):false;
};
أفضل إجابة وجدتها (بما في ذلك مثال) كانت في OpenLayers - الحد من عدد مستويات التكبير. أنا لا ألصقها هنا ، يرجى الاطلاع على التعليمات هناك.