如何转换 Google 地图中的自定义叠加层以考虑投影?

发布于 2024-09-12 13:09:48 字数 1179 浏览 2 评论 0原文

我正在开发一个使用 Google Maps API v3 的应用程序。我想制作每边正好 1000km 的正方形的自定义叠加层(每个叠加层实际上是一个 1000x1000 透明 png,每个像素代表 1 平方公里)。我当前的实现是这样的:

function PngOverlay(map,loc) {
    this._png = null;
    this._location = loc; //lat,lng of the square's center
    this.setMap(map);
}

PngOverlay.prototype = new google.maps.OverlayView();

PngOverlay.prototype.onAdd = function() {
    this._png = new Element('image',{ //using mootools
    'src': pngForLoc(this._location),
    'styles': {
        'width': 1000,
        'height': 1000,         
        'position': 'absolute'
    }
});

var panes = this.getPanes();
    panes.overlayLayer.appendChild(this._png);
}

PngOverlay.prototype.onRemove = function() {
    this._png.parentNode.removeChild(this._png);
    this._png = null;
}

PngOverlay.prototype.draw = function() {
    var dp = this.getProjection().fromLatLngToDivPixel(this._location);     
    var ps = this._png.getSize();

    var t = dp.y - (ps.y / 2);
    this._png.setStyle('top',t);

    var l = dp.x - (ps.x / 2);
    this._png.setStyle('left',l);
}

我的问题是:我需要做什么(如果有的话)来解释 Google 地图的投影?我对墨卡托的有限理解是它保留水平距离但不保留垂直距离。我怎样才能适当地transform()我的png来解决这个问题?

I'm developing an application that uses Google Maps API v3. I want to make custom overlays that are squares exactly 1000km on each side (each overlay is actually a 1000x1000 transparent png, with each pixel representing 1 square km). My current implementation is this:

function PngOverlay(map,loc) {
    this._png = null;
    this._location = loc; //lat,lng of the square's center
    this.setMap(map);
}

PngOverlay.prototype = new google.maps.OverlayView();

PngOverlay.prototype.onAdd = function() {
    this._png = new Element('image',{ //using mootools
    'src': pngForLoc(this._location),
    'styles': {
        'width': 1000,
        'height': 1000,         
        'position': 'absolute'
    }
});

var panes = this.getPanes();
    panes.overlayLayer.appendChild(this._png);
}

PngOverlay.prototype.onRemove = function() {
    this._png.parentNode.removeChild(this._png);
    this._png = null;
}

PngOverlay.prototype.draw = function() {
    var dp = this.getProjection().fromLatLngToDivPixel(this._location);     
    var ps = this._png.getSize();

    var t = dp.y - (ps.y / 2);
    this._png.setStyle('top',t);

    var l = dp.x - (ps.x / 2);
    this._png.setStyle('left',l);
}

My question is this: what, if anything, do I need to do to account for Google Maps' projection? My limited understanding of Mercator is that it preserves horizontal distance but not vertical. How can I appropriately transform() my png to account for that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

灰色世界里的红玫瑰 2024-09-19 13:09:48

确实没有足够的信息,但您可能会发现开源 proj4js 库很有用,因为它可以执行各种投影转换,例如。谷歌的球形墨卡托投影系统。

There isn't really enough information, but you might find the open source proj4js library useful as this can perform various projection transformations, eg. To Google's Spherical Mercator projection system.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文