Jad*_*ias 33 javascript google-maps projection google-maps-api-3
我知道该方法存在并记录在案,但我不知道如何获取MapCanvasProjection对象.
TMS*_*TMS 32
var overlay = new google.maps.OverlayView();
overlay.draw = function() {};
overlay.setMap(map);
var point = overlay.getProjection().fromLatLngToDivPixel(latLng);
Run Code Online (Sandbox Code Playgroud)
确实丑陋.在v2中更容易 - 谷歌api v3的另一个缺陷!
Tib*_*org 29
我认为最简单的方法是忽略谷歌的愿望,即通过删除和隐藏有用的功能而不是添加新的功能来让我们的生活更加艰难,并且只是编写自己的方法来做同样的事情.
这是某个人在其他地方发布的功能版本(我现在找不到它),这对我有用:
fromLatLngToPixel: function (position) {
var scale = Math.pow(2, Map.getZoom());
var proj = Map.getProjection();
var bounds = Map.getBounds();
var nw = proj.fromLatLngToPoint(
new google.maps.LatLng(
bounds.getNorthEast().lat(),
bounds.getSouthWest().lng()
));
var point = proj.fromLatLngToPoint(position);
return new google.maps.Point(
Math.floor((point.x - nw.x) * scale),
Math.floor((point.y - nw.y) * scale));
},
Run Code Online (Sandbox Code Playgroud)
现在,您可以随时随地拨打电话.我特别需要自定义上下文菜单,它完美地完成了它的工作.
编辑:我还写了一个反向函数,fromPixelToLatLng完全相反.它只是基于第一个,应用了一些数学:
fromPixelToLatLng: function (pixel) {
var scale = Math.pow(2, Map.getZoom());
var proj = Map.getProjection();
var bounds = Map.getBounds();
var nw = proj.fromLatLngToPoint(
new google.maps.LatLng(
bounds.getNorthEast().lat(),
bounds.getSouthWest().lng()
));
var point = new google.maps.Point();
point.x = pixel.x / scale + nw.x;
point.y = pixel.y / scale + nw.y;
return proj.fromPointToLatLng(point);
}
Run Code Online (Sandbox Code Playgroud)
pix*_*eak 21
我对这里的答案不满意.所以我做了一些实验,发现了"最简单"的工作解决方案,这与拉尔夫的答案很接近,但希望更容易理解.(我希望Google能够更方便地使用此功能!)
首先你声明一个OverlayView像这样的子类:
function CanvasProjectionOverlay() {}
CanvasProjectionOverlay.prototype = new google.maps.OverlayView();
CanvasProjectionOverlay.prototype.constructor = CanvasProjectionOverlay;
CanvasProjectionOverlay.prototype.onAdd = function(){};
CanvasProjectionOverlay.prototype.draw = function(){};
CanvasProjectionOverlay.prototype.onRemove = function(){};
Run Code Online (Sandbox Code Playgroud)
然后在你的代码中你实例化地图的其他地方,你也实例化这个OverlayView并设置它的地图,如下所示:
var map = new google.maps.Map(document.getElementById('google-map'), mapOptions);
// Add canvas projection overlay so we can use the LatLng to pixel converter
var canvasProjectionOverlay = new CanvasProjectionOverlay();
canvasProjectionOverlay.setMap(map);
Run Code Online (Sandbox Code Playgroud)
然后,无论何时需要使用fromLatLngToContainerPixel,您只需执行以下操作:
canvasProjectionOverlay.getProjection().fromLatLngToContainerPixel(myLatLng);
Run Code Online (Sandbox Code Playgroud)
请注意,因为MapCanvasProjection对象只有在draw()调用一次之前才可用idle,我建议创建一个布尔"mapInitialized"标志,在第一个地图idle回调时将其设置为true .然后在那之后做你需要做的事情.
ste*_*ian 13
var map;
// Create your map
MyOverlay.prototype = new google.maps.OverlayView();
MyOverlay.prototype.onAdd = function() { }
MyOverlay.prototype.onRemove = function() { }
MyOverlay.prototype.draw = function() { }
function MyOverlay(map) { this.setMap(map); }
var overlay = new MyOverlay(map);
var projection = overlay.getProjection();
Run Code Online (Sandbox Code Playgroud)
要获取MapCanvasProjection,您可以从OverlayView派生一个类并调用getProjection()方法,该方法返回一个MapCanvasProjection类型
必须实现onAdd(),draw()和onRemove()才能从OverlayView派生.
function MyOverlay(options) {
this.setValues(options);
var div = this.div_= document.createElement('div');
div.className = "overlay";
};
// MyOverlay is derived from google.maps.OverlayView
MyOverlay.prototype = new google.maps.OverlayView;
MyOverlay.prototype.onAdd = function() {
var pane = this.getPanes().overlayLayer;
pane.appendChild(this.div_);
}
MyOverlay.prototype.onRemove = function() {
this.div_.parentNode.removeChild(this.div_);
}
MyOverlay.prototype.draw = function() {
var projection = this.getProjection();
var position = projection.fromLatLngToDivPixel(this.getMap().getCenter());
var div = this.div_;
div.style.left = position.x + 'px';
div.style.top = position.y + 'px';
div.style.display = 'block';
};
Run Code Online (Sandbox Code Playgroud)
然后当你创建地图时
var OverLayMap = new MyOverlay( { map: map } );
Run Code Online (Sandbox Code Playgroud)
对于V2, 您应该能够从GMap2实例调用fromLatLngToDivPixel
var centerPoint = map.fromLatLngToDivPixel(map.getCenter());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40737 次 |
| 最近记录: |