Jquery Google Maps API V3 fitbounds()可缩小,但从不缩小
我创建了一个相当复杂的商店定位器。用户输入他们的zip,一个表返回结果和地图上相应的标记。他们可以在结果中翻页,标记会越来越远,而Jquery Google Maps API V3 fitbounds()可缩小,但从不缩小,jquery,google-maps,google-maps-api-3,fitbounds,Jquery,Google Maps,Google Maps Api 3,Fitbounds,我创建了一个相当复杂的商店定位器。用户输入他们的zip,一个表返回结果和地图上相应的标记。他们可以在结果中翻页,标记会越来越远,而fitbounds()函数非常适合缩小到合适的缩放级别以适应标记。问题是,如果您将页面调回较近的位置,fitbounds()不会放大。即使您输入了一个新的搜索,它也不会围绕这些新标记进行放大——它会以它们为中心,但会保持以前的放大级别。我希望这是有道理的。如果有人知道我需要添加什么来放大更接近的结果,请帮助。以下是我在marker Push函数末尾调用的google函
fitbounds()
函数非常适合缩小到合适的缩放级别以适应标记。问题是,如果您将页面调回较近的位置,fitbounds()
不会放大。即使您输入了一个新的搜索,它也不会围绕这些新标记进行放大——它会以它们为中心,但会保持以前的放大级别。我希望这是有道理的。如果有人知道我需要添加什么来放大更接近的结果,请帮助。以下是我在marker Push函数末尾调用的google函数:
map.setCenter(bounds.getCenter());
map.panToBounds(bounds);
map.fitBounds(bounds);
谢谢
map.setZoom(10);
我认为可以接受的范围是1-20。在我的经验中,只有整数和小数打破了地图。没错,
fitBounds
只确保提供的边界是可见的。它没有放大到适当的级别
您可以先调用setZoom(20),然后再调用fitboods。嗯,很有趣。。我使用PHP循环遍历所有(待)标记坐标,并计算西南和东北的值;起源的坐标介于两者之间。如果所有标记坐标彼此非常接近,则fitBounds设置的缩放因子远高于(放大)地图创建时使用的15。这就是我添加最后一行的原因
var map;
function mapInit() {
var origin = new google.maps.LatLng(59.33344615, 18.0678188);
var options = {
zoom: 15,
center: origin,
mapTypeControlOptions: {
mapTypeIds: [google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.HYBRID]
},
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("googlemap"), options);
var southWest = new google.maps.LatLng(59.3308415, 18.0643054);
var northEast = new google.maps.LatLng(59.3360508, 18.0713322);
var bounds = new google.maps.LatLngBounds(southWest, northEast);
map.fitBounds(bounds);
google.maps.event.addListenerOnce(map, "idle", function() {
if (map.getZoom() > 16) map.setZoom(16);
});
因此,要么是谷歌在你发布问题后重新编程了该功能,要么。。我需要更多关于你代码的信息
fitBounds: function(bounds, mapId)
{
//bounds: bounds, id: map id
if (bounds==null) return false;
maps[mapId].fitBounds(bounds);
},
这应该会有帮助,我使用这种方法,效果很好,在MapV2上有点不同。这里不需要什么花哨的东西。首先拟合边界,然后平移到它。这将为您提供适当的缩放并包含整个边界
map.fitBounds(bounds);
map.panToBounds(bounds);
问题是:我们设置了
var bounds = new google.maps.LatLngBounds();
这样我们以后就可以把我们的标记放在地图上一个有边界的区域。GMaps将始终异步缩小到相应的fitBounds(),但不会放大以实现相同的效果(如@broady之前所述)。这对于许多应用程序来说并不理想,因为一旦您在地图上显示了一系列导致地图缩小的标记(可能当您调用
map.getBounds()时
它返回的视口边缘有一点空白。由于此新边界比当前边界大,贴图将始终缩小。我可以通过避免完全使用当前贴图的边界并维护一个单独的LatLngBounds变量来解决此问题。每次我添加一个点时,我调用:
markersBounds.extend(newMarkersLatLng);
map.fitBounds(markersBounds);
map.panToBounds(markersBounds);
要删除点(我一直在添加点),可以使用第一个点创建一个新的LatLngBounds对象,然后扩展每个剩余点以获得新边界:
var markersBounds = new google.maps.LatLngBounds(markers[0].getPosition(),
markers[0].getPosition());
for(var i=1; i<markers.length; i++){
markersBounds.extend(markers[i].getPosition());
}
map.fitBounds(markersBounds);
map.panToBounds(markersBounds);
var markersBounds=new google.maps.LatLngBounds(markers[0].getPosition(),
标记[0]。getPosition());
对于(var i=1;i我在使用新标记的同一地图上第二次调用fitBounds时,也遇到地图缩小的问题。这是对我有效的frankensolution:
// This is a stationary point tho dynamic will work too
var myLat = someLat,
myLng = someLong;
var map = false,
markersArray = [];
function makeOrderMap(lat, lng) { // pass in dynamic point when updating map
var mapOptions = {
center: new google.maps.LatLng(myLat, myLng),
zoom: 16,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
deleteOverlays(); // remove any existing markers..
if(!map) {
map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
}
// Find the mid-point to center the map
midLat = (parseFloat(lat) + parseFloat(myLat)) / 2;
midLng = (parseFloat(lng) + parseFloat(myLng)) / 2;
map.setCenter(new google.maps.LatLng(midLat, midLng));
var newSpot = new google.maps.LatLng(lat, lng);
placeMarker(mapOptions.center);
placeMarker(newSpot);
// determine the distance between points for deciding the zoom level
var dist = distHaversine(mapOptions.center, newSpot);
var zoom = 10;
if(dist < 1.25) {
zoom = 15;
} else if(dist < 2.5) {
zoom = 14;
} else if(dist < 5) {
zoom = 13;
} else if(dist < 10) {
zoom = 12;
} else if(dist < 20) {
zoom = 11;
}
map.setZoom(zoom);
}
rad = function(x) {return x*Math.PI/180;}
distHaversine = function(p1, p2) {
var R = 6371; // earth's mean radius in km
var dLat = rad(p2.lat() - p1.lat());
var dLong = rad(p2.lng() - p1.lng());
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) * Math.sin(dLong/2) * Math.sin(dLong/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return d.toFixed(3);
}
function deleteOverlays() {
if (markersArray) {
for (i in markersArray) {
markersArray[i].setMap(null);
}
markersArray = [];
markersArray.length = 0;
}
}
function placeMarker(location, alt_icon) {
var marker = new google.maps.Marker({
position: location,
map: map
});
// add marker in markers array
markersArray.push(marker);
}
//这是一个静态点,动态也可以工作
var myLat=someLat,
myLng=长一些;
var map=false,
markersArray=[];
函数makeOrderMap(lat,lng){//更新映射时传入动态点
变量映射选项={
中心:新google.maps.LatLng(myLat,myLng),
缩放:16,
mapTypeId:google.maps.mapTypeId.ROADMAP
};
deleteOverlays();//删除所有现有标记。。
如果(!map){
map=new google.maps.map(document.getElementById(“map_canvas”),mapOptions);
}
//找到地图中心的中点
midLat=(parseFloat(lat)+parseFloat(myLat))/2;
midLng=(parseFloat(lng)+parseFloat(myLng))/2;
map.setCenter(新的google.maps.LatLng(midLat,midLng));
var newSpot=newgoogle.maps.LatLng(lat,lng);
placeMarker(mapOptions.center);
地点标记(新闻点);
//确定点之间的距离以确定缩放级别
var dist=distHaversine(mapOptions.center,newSpot);
var=10;
如果(距离<1.25){
缩放=15;
}否则如果(距离<2.5){
缩放=14;
}否则如果(距离<5){
缩放=13;
}否则如果(距离<10){
缩放=12;
}否则,如果(距离<20){
缩放=11;
}
map.setZoom(缩放);
}
rad=函数(x){return x*Math.PI/180;}
Distaversine=功能(p1,p2){
var R=6371;//地球的平均半径,单位为km
var dLat=rad(p2.lat()-p1.lat());
var dLong=rad(p2.lng()-p1.lng());
变量a=Math.sin(dLat/2)*Math.sin(dLat/2)+
Math.cos(rad(p1.lat())*Math.cos(rad(p2.lat())*Math.sin(dLong/2)*Math.sin(dLong/2);
var c=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));
var d=R*c;
返回d.toFixed(3);
}
函数deleteOverlays(){
if(markersArray){
for(markersArray中的i){
markersArray[i].setMap(空);
}
markersArray=[];
markersArray.length=0;
}
}
功能位置标记(位置、alt_图标){
var marker=new google.maps.marker({
位置:位置,,
地图:地图
});
//在标记数组中添加标记
markersArray.push(marker);
}
我今天遇到了这个一般性问题,我想与大家分享一个解决方案。我意识到这与您的“商店定位器”问题略有不同,但它在许多方面都适用。在我的例子中,我在地图上有一组标记,正在添加一组,并希望确保所有标记现在都在视图中。此代码将检查每个现有标记,以确定是否存在标记ee如果它在视图中,并且在整个过程中,构建一个新的边界框,该边界框将包含所有的边界框(如果需要)。最后,如果发现任何边界框不在视图中,则会重置视图,使它们都在视图中
(这使用了Dojo的数组模块,它只是围绕基本数组迭代的一个方便的包装器)
我们可以很容易地修改它,以确保新的
var markersBounds = new google.maps.LatLngBounds(markers[0].getPosition(),
markers[0].getPosition());
for(var i=1; i<markers.length; i++){
markersBounds.extend(markers[i].getPosition());
}
map.fitBounds(markersBounds);
map.panToBounds(markersBounds);
// This is a stationary point tho dynamic will work too
var myLat = someLat,
myLng = someLong;
var map = false,
markersArray = [];
function makeOrderMap(lat, lng) { // pass in dynamic point when updating map
var mapOptions = {
center: new google.maps.LatLng(myLat, myLng),
zoom: 16,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
deleteOverlays(); // remove any existing markers..
if(!map) {
map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
}
// Find the mid-point to center the map
midLat = (parseFloat(lat) + parseFloat(myLat)) / 2;
midLng = (parseFloat(lng) + parseFloat(myLng)) / 2;
map.setCenter(new google.maps.LatLng(midLat, midLng));
var newSpot = new google.maps.LatLng(lat, lng);
placeMarker(mapOptions.center);
placeMarker(newSpot);
// determine the distance between points for deciding the zoom level
var dist = distHaversine(mapOptions.center, newSpot);
var zoom = 10;
if(dist < 1.25) {
zoom = 15;
} else if(dist < 2.5) {
zoom = 14;
} else if(dist < 5) {
zoom = 13;
} else if(dist < 10) {
zoom = 12;
} else if(dist < 20) {
zoom = 11;
}
map.setZoom(zoom);
}
rad = function(x) {return x*Math.PI/180;}
distHaversine = function(p1, p2) {
var R = 6371; // earth's mean radius in km
var dLat = rad(p2.lat() - p1.lat());
var dLong = rad(p2.lng() - p1.lng());
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) * Math.sin(dLong/2) * Math.sin(dLong/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return d.toFixed(3);
}
function deleteOverlays() {
if (markersArray) {
for (i in markersArray) {
markersArray[i].setMap(null);
}
markersArray = [];
markersArray.length = 0;
}
}
function placeMarker(location, alt_icon) {
var marker = new google.maps.Marker({
position: location,
map: map
});
// add marker in markers array
markersArray.push(marker);
}
var origBounds = map.getBounds(),
newBounds = new google.maps.LatLngBounds(null),
anyFailed = false;
array.forEach(markers, function (m) {
newBounds.extend(m.position);
if (!origBounds.contains(m.position)) {
anyFailed = true;
}
});
if (anyFailed) {
map.setCenter(newBounds.getCenter());
map.fitBounds(newBounds);
}
function initMap() {
var mapOptions = {
center: new google.maps.LatLng(0, 0),
zoom: 1,
minZoom: 1
};
map = new google.maps.Map(document.getElementById('officeMap'), mapOptions);
google.maps.event.addListenerOnce(map, 'idle', function() {
//Map is ready
worldViewFit(map);
});
}
function worldViewFit(mapObj) {
var worldBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(70.4043,-143.5291), //Top-left
new google.maps.LatLng(-46.11251, 163.4288) //Bottom-right
);
mapObj.fitBounds(worldBounds, 0);
var actualBounds = mapObj.getBounds();
if(actualBounds.getSouthWest().lng() == -180 && actualBounds.getNorthEast().lng() == 180) {
mapObj.setZoom(mapObj.getZoom()+1);
}
}
.google-map {
width: 100%;
height: 0px;
transition: all 0.5s ease;
}
.google-map.loaded {
height: 400px;
}
map.markers.forEach( (marker) => {
var latlng = new google.maps.LatLng(marker.position.lat(), marker.position.lng())
bounds.extend(latlng)
})
map.markers.forEach( (marker) => {
// check if map marker is in this.markers (to make sure only current)
for (const [key, value] of Object.entries(markers)) {
if (marker == value) {
var latlng = new google.maps.LatLng(marker.position.lat(), marker.position.lng())
bounds.extend(latlng)
}
}
})