方向地图没有正确定心/缩放
Directions map not centering/zooming properly
UPDATE:我现在有一个静态解决方案,但我仍然想看看它是否可以改进。除了用于切换视图的on click事件外,所有代码都是相同的。
$(document).on('click', '.mobile-toggle a', function (e) {
e.preventDefault();
if (!$(this).hasClass("active")) {
var target = $(this).attr("data-target");
$("#results > div, .mobile-toggle a").removeClass("active");
$(this).addClass("active");
$("#" + target).addClass("active");
}
var center = dmap.getCenter();
google.maps.event.trigger(dmap, 'resize');
dmap.setCenter(center);
dmap.setZoom(12);
});
这使地图正确居中,这很好。缩放效果也不错,但并不总是适合路线。有时路线太大而不适合,有时地图可能应该再放大一点。是否有任何方法来确定缩放值,应该基于路由使用?我很确定这通常应该是自己发生的,但这次似乎不是这样。
原文如下
我已经读了一堆问题/答案关于这个,但没有提供的答案似乎做什么我正在寻找。我将尽我所能解释清楚。
我正在编写一个商店定位器。在桌面上,一切看起来都很好。移动设备是我遇到困难的地方,因为一些变化的视图(显示/隐藏div)。从我所读到的,它看起来像很多人遇到了一个问题,地图是在一个隐藏的div中创建的,然后它被错误地显示(例如,地图只占用容器的左上角区域),当div显示。
商店定位器的布局如下-在搜索位置之后,您将看到所有结果的列表视图。当你点击顶部的"地图视图"标签时,你会看到一个谷歌地图视图,上面有附近所有的商店。这很好。如果你选择一个商店并点击列表视图中的"获取路线",你会看到一个到该商店的路线的列表视图。同样地,如果你选择一个商店并在地图视图中点击"获取方向",你会看到一个方向地图。这在两种情况下都很好。
问题是当我在列表视图中,点击获取方向,然后从方向列表视图切换到地图视图。地图会用正确的路线绘制,并像它应该的那样填充div——然而,路线位于地图的左上角,而地图本身被放大了。例如,如果路线在费城地区,地图就会缩小,其中心通常在百慕大附近。而且每次都是在百慕大的同一个地方。
下面是列表视图和地图视图之间按下按钮的相关代码。
$(document).on('click', '.mobile-toggle a', function (e) {
e.preventDefault();
if (!(this).hasClass("active")) {
var target = $(this).attr("data-target");
$("#results > div, .mobile-toggle a").removeClass("active");
$(this).addClass("active");
$("#" + target).addClass("active");
}
google.maps.event.trigger(dmap, 'resize');
}
dmap
是一个包含方向映射的全局变量,并且该映射本身在创建时分配了这两个侦听器。
google.maps.event.addListener(dmap, 'idle', function () {
google.maps.event.trigger(dmap, 'resize');
dmapCenter = dmap.getCenter();
});
google.maps.event.addDomListener(window, 'resize', function () {
dmap.setCenter(dmapCenter);
});
这重新绘制地图,并确保中心保持不变,而窗口是调整大小,但地图本身仍然不集中在路线从位置A到位置b。我觉得解决方案不能太远离我已经尝试过的(基于我所读到的),但我似乎不能得到这个工作。
抱歉,文字太多了。如果您认为有任何其他代码可能有助于回答这个问题,请告诉我。谢谢!
编辑:按要求,这是绘制地图的完整代码。
function calcRoute(start, dest) {
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
directionsDisplay = new google.maps.DirectionsRenderer();
var mapOptions = {
zoom: 12,
center: new google.maps.LatLng(lat, lng)
};
var map = new google.maps.Map(document.getElementById('directions-map'), mapOptions);
directionsDisplay.setMap(map);
directionsDisplay.setPanel(document.getElementById('directions'));
var request = {
origin: start,
destination: dest,
travelMode: google.maps.TravelMode.DRIVING
};
directionsService.route(request, function (response, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsDisplay.setDirections(response);
}
});
dmap = map;
dmapCenter = map.getCenter();
google.maps.event.addListener(map, 'idle', function () {
google.maps.event.trigger(map, 'resize');
dmapCenter = map.getCenter();
});
google.maps.event.addDomListener(window, 'resize', function () {
map.setCenter(dmapCenter);
});
}
lat
和lng
为全局变量,具有搜索位置的经纬度。
你正在使用的工作流(IMHO)似乎有点奇怪,我(IMHO),主要是你选择初始化一个地图实例,每次你计算方向。
我不知道这会有多大帮助,因为我还没有能够在移动设备上测试它,但下面的代码是制作谷歌地图,渲染两点之间的方向,并在地图调整大小后保持地图中心(通过在整个页面上运行代码片段来测试调整大小,而不是调整浏览器窗口)。
var DMAP,
DMAP_RENDERER,
DIRECTIONS_SERVICE;
/*
Run only once when your page loads to ready global components
for any future direction calls.
*/
function initializeDirectionsFeature(){
//set up directions map
var dmapOptions = {
zoom: 4,
center: new google.maps.LatLng(38.8282, -98.5795) //USA center
};
DMAP = new google.maps.Map( $("#map").get(0), dmapOptions);
//set up renderer for directions map
var rendererOptions = {
map: DMAP,
panel: $("#directions").get(0)
};
DMAP_RENDERER = new google.maps.DirectionsRenderer(rendererOptions);
//Initialize the directions service
DIRECTIONS_SERVICE = new google.maps.DirectionsService();
//Trigger map redraw when dom element is resized
google.maps.event.addDomListener(window, 'resize', function () {
google.maps.event.trigger(DMAP, 'resize');
});
//Preserve map perspective when after resize
google.maps.event.addListener(DMAP, 'resize', function () {
var center = DMAP.getCenter();
google.maps.event.addListenerOnce(DMAP, 'center_changed', function () {
DMAP.setCenter( center );
});
});
}
/*
Gets and renders the directions between params.
Params 'from' and 'to' can be either LatLng or
a String that will be geocoded. Param 'renderer'
is the `google.maps.DirectionsRenderer` to use.
*/
function calcDirections(from, to, renderer){
var request = {
origin: from,
destination: to,
travelMode: google.maps.TravelMode.DRIVING
};
DIRECTIONS_SERVICE.route(request, function (response, status) {
if (status == google.maps.DirectionsStatus.OK) {
renderer.setDirections(response);
}
});
}
//for Snippet, actuall run google maps initialize function
initializeDirectionsFeature();
//For Snippet example
$("#query").submit(function(e){
e.preventDefault();
calcDirections(e.target.from.value, e.target.to.value, DMAP_RENDERER)
});
/* just for Snippet, gmap element just needs a height */
html, body {
position: relative;
width: 98%;
height: 98%;
min-height: 500px;
}
#map, #directions {
width: 100%;
height: 40%;
}
.inline-block {
display: inline-block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js">
</script>
<form id="query">
<div class="inline-block">
<label for="from">From:</label>
<input id="from" name="from" value="New York, NY"/>
</div>
<div class="inline-block">
<label for="to">To:</label>
<input id="to" name="to" value="Philadelphia, PA"/>
</div>
<button type="submit">Go</button>
</form>
<div id="map"></div>
<div id="directions">Directions:</div>
- 单击超链接时,如何使用Google Maps API v3缩放地图
- 动态设置谷歌地图缩放
- 如何缩放地图框传单中的标记单击事件
- 从结果集中自动设置谷歌地图缩放
- 谷歌地图 v3 缩放特定位置
- 使用缩放javascript触发谷歌地图点击事件
- jquery ui地图设置缩放级别
- 如何重新启用禁用的谷歌地图v3拖放、缩放等
- “打开街道地图”的长线在高缩放级别下消失
- 如何将“厚实”(粗粒度)缩放级别与传单地图一起使用
- 谷歌地图漏洞?显示的标记会根据缩放级别而更改
- 谷歌地图API:当信息窗口关闭时,地图缩放回中心
- D3缩放和平移不适用于整个地图,只适用于投影
- angularjs超过最大缩放后的谷歌地图缩放地图
- 鼠标滚轮缩放地图-DataMaps.js
- 谷歌地图标记双击缩放地图
- 传单缩放地图层
- 我能用&;z&;缩放地图吗?和“;a"在Openlayers3
- 必应地图,如何缩放地图
- 开放图层 3:缩放地图到数组中的坐标