我希望有人能指出我正确的方向。
我有一个Google地图,可以从XML文件加载标记,以及其他各种地图元素,效果很好。但是我现在需要将PNG图像叠加到地图上。
我已经尝试了几个小时来正确地将PNG对准网站的顶部,但却找不到我需要的两个坐标(西南和东北)。有没有这样做的工具?理想情况下上传图像并拖动角落以适应,它会输出您需要的两个坐标(lat / lng)?
我尝试过使用此工具:http://overlay-tiler.googlecode.com/svn/trunk/upload.html - 但它有三个联系点。
我也尝试过使用这个工具:http://www.birdtheme.org/useful/customoverlay.html - 但是一旦上传到地图后你就无法调整图像大小,而且你有机会点击西南标记!
我也可以使用Google地球完美地对齐PNG,但我无法看到输出lat / lng点的方法。
非常感谢任何建议。
答案 0 :(得分:22)
这是AndréDion解释的一个实例。
var overlay;
DebugOverlay.prototype = new google.maps.OverlayView();
function initialize() {
var mapOptions = {
zoom: 15,
center: new google.maps.LatLng(40.743388,-74.007592)
};
var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
var swBound = new google.maps.LatLng(40.73660837340877, -74.01852328);
var neBound = new google.maps.LatLng(40.75214181, -73.99661518216243);
var bounds = new google.maps.LatLngBounds(swBound, neBound);
console.log(map);
var srcImage = 'http://robincwillis.com/top/splash/04.jpg';
overlay = new DebugOverlay(bounds, srcImage, map);
var markerA = new google.maps.Marker({
position: swBound,
map: map,
draggable:true
});
var markerB = new google.maps.Marker({
position: neBound,
map: map,
draggable:true
});
google.maps.event.addListener(markerA,'drag',function(){
var newPointA = markerA.getPosition();
var newPointB = markerB.getPosition();
var newBounds = new google.maps.LatLngBounds(newPointA, newPointB);
overlay.updateBounds(newBounds);
});
google.maps.event.addListener(markerB,'drag',function(){
var newPointA = markerA.getPosition();
var newPointB = markerB.getPosition();
var newBounds = new google.maps.LatLngBounds(newPointA, newPointB);
overlay.updateBounds(newBounds);
});
google.maps.event.addListener(markerA, 'dragend', function () {
var newPointA = markerA.getPosition();
var newPointB = markerB.getPosition();
console.log("point1"+ newPointA);
console.log("point2"+ newPointB);
});
google.maps.event.addListener(markerB, 'dragend', function () {
var newPointA = markerA.getPosition();
var newPointB = markerB.getPosition();
console.log("point1"+ newPointA);
console.log("point2"+ newPointB);
});
}
function DebugOverlay(bounds, image, map) {
this.bounds_ = bounds;
this.image_ = image;
this.map_ = map;
this.div_ = null;
this.setMap(map);
}
DebugOverlay.prototype.onAdd = function() {
var div = document.createElement('div');
div.style.borderStyle = 'none';
div.style.borderWidth = '0px';
div.style.position = 'absolute';
var img = document.createElement('img');
img.src = this.image_;
img.style.width = '100%';
img.style.height = '100%';
img.style.opacity = '0.5';
img.style.position = 'absolute';
div.appendChild(img);
this.div_ = div;
var panes = this.getPanes();
panes.overlayLayer.appendChild(div);
};
DebugOverlay.prototype.draw = function() {
var overlayProjection = this.getProjection();
var sw = overlayProjection.fromLatLngToDivPixel(this.bounds_.getSouthWest());
var ne = overlayProjection.fromLatLngToDivPixel(this.bounds_.getNorthEast());
var div = this.div_;
div.style.left = sw.x + 'px';
div.style.top = ne.y + 'px';
div.style.width = (ne.x - sw.x) + 'px';
div.style.height = (sw.y - ne.y) + 'px';
};
DebugOverlay.prototype.updateBounds = function(bounds){
this.bounds_ = bounds;
this.draw();
};
DebugOverlay.prototype.onRemove = function() {
this.div_.parentNode.removeChild(this.div_);
this.div_ = null;
};
initialize();
答案 1 :(得分:9)
我不得不在不久前为客户解决这个问题。我的解决方案是简单地创建两个标记;每个LatLng
一个用于叠加层的LatLngBounds
,在移动时,会更新叠加层并将LatLndBounds
记录到console
供我参考。我还添加了在拖动标记时显示的标线(垂直和水平线),以便更容易在视觉上定位叠加层。
我无法与您分享解决方案中的代码,但它涉及使用OverlayView
,以便通过MapCanvasProjection
将LatLng
坐标转换为像素。
与您一样,我们不需要为最终用户提供此功能,因此我添加了一个“创作模式”,通过向解决方案的查询字符串提供debug
参数来切换。
答案 2 :(得分:2)
试试这个工具。只需双击第一个点上的地图即可。将出现一个可调整大小的直肠框。将其跨越到终点并获得所需的LatLngBounds。
jsfiddle.net/yV6xv/16/embedded/result/
答案 3 :(得分:2)
我喜欢使用位于此处的那个:
http://googlemapsapi.blogspot.com/2007/05/v280-making-image-overlays-easy-with.html
它远非理想,它会生成Google Maps版本2 API代码,但您仍然可以使用逻辑/纬度坐标。