当前位置: 首页 > 知识库问答 >
问题:

在google map墨卡托投影上将纬度值转换为y

竺捷
2023-03-14

关于这个话题有很多问题,也有很多答案,但似乎没有一个对我的代码起作用,不确定是不是转换公式或其他东西在整个代码上有问题。经度值似乎如预期的那样起作用,但我未能将纬度转换为地图上的y值。我将添加一个jsfiddle和代码,以及我尝试过的公式的一些链接。我所读到的谷歌地图是一种墨卡托投影,它使用了投影的双重版本(椭球和球面),通用公式在这种情况下不会那么精确,但我没有20km的差异,而是点在地图中的任何位置。我将感谢任何帮助与这个特定的情况,请尝试提供一些代码,不要指出我的链接,除非您测试它与我做的工作,因为我可能已经测试,但没有工作,或我不确定如何实现它,谢谢提前。

http://jsfidle.net/ve94p/

var mapReach = {
    init: function(mapId, canvasId) {
        // Some Google map configurations here....

        this.map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

        this.nodes = [];
        this.$mapCanvas = $('#'+ mapId);
        this.canvas = document.getElementById(canvasId);

    },

    /**
     * Gets the current boundaries of the google map view-port in latitude and longitude
     * @return {} top-rigth & bottom-left lat,lon values.
     */

    getCurrentBounds: function(){
        var lng0 = this.map.getBounds().getNorthEast().lng(); // top-right x
        var lat0 = this.map.getBounds().getNorthEast().lat(); // top-right y
        var lng1 = this.map.getBounds().getSouthWest().lng(); // bottom-left x
        var lat1 = this.map.getBounds().getSouthWest().lat(); // bottom-left y

        return {topRight: {lat: lat0, lon: lng0}, bottomLeft: {lat: lat1, lon: lng1}};
    },

    /**
     * Adds nodes to be drawn on the canvas that overlays the map
     * @param {number} lat the latitude (y) geoposition of the node
     * @param {number} lon the longitude (x) geoposition of the node
     * @return {} top-rigth & bottom-left lat,lon values.
     */

    add: function(lat, lon){ // lat y , lon x
        this.nodes.push({lat:lat, lon:lon});
    },

    canvasSetUp: function(){
        if(!this.isCanvasSetted){
            this.width = this.canvas.width =  this.$mapCanvas.width();
            this.height = this.canvas.height = this.$mapCanvas.height();
            this.isCanvasSetted = true;
                    if(LOGGING){
                console.log('width:' + this.width );
                console.log('height:' + this.height );
                    }
        }
    },

    /**
     * Draws the nodes in place
     * @return void
     */

    draw: function() {
        var ctx  = this.canvas.getContext('2d');
        var currentBounds = this.getCurrentBounds();
        var yMin = currentBounds.bottomLeft.lat;
        var yMax = currentBounds.topRight.lat;
        var tempMinY = (yMin < 0) ?  Math.abs(yMin) : -yMin;
        yMax = (yMax > 0) ?  Math.abs(yMax) : yMax;
        var yRange = yMax + tempMinY;

        var xMin = currentBounds.bottomLeft.lon;
        var xMax = currentBounds.topRight.lon;
        var tempMinX = (xMin < 0) ?  Math.abs(xMin) : xMin;
        xMax = (xMax > 0) ?  Math.abs(xMax) : xMax;
        var xRange  = xMax + tempMinX;

        var mapLatBottomDegree = yMin * Math.PI / 180;

        if(LOGGING){
            console.log(currentBounds);
            console.log('x-range:' + xRange + ', y-range:' + yRange);
        }

        ctx.clearRect(0, 0, this.width, this.height);

        for (var i in this.nodes) {
            ctx.save();

            ctx.fillStyle = '#ffff00';

            // Translates lon to x value
            var x = (this.nodes[i].lon - xMin) * (this.width / xRange);

            var latRad = this.nodes[i].lat * Math.PI / 180;
            var mercN = Math.log( Math.tan( (Math.PI/4) + (latRad / 2) ) );
            var y = (this.height/2) - ( this.width * mercN / (2*Math.PI) );

            if(LOGGING){
                //console.log('x-delta:' + xDelta );
                console.log('lat:' + this.nodes[i].lat + ', lon:' + this.nodes[i].lon);
                console.log('y:' + y + ', x:' + x);
            }

            ctx.beginPath();
            ctx.arc(x, y, 4, 0, Math.PI*2, true);
            ctx.fill();
            ctx.closePath();

            ctx.restore();

        }


    },

    placeNodes: function() {
        // Lat, Lon Values for the following cities
        this.add(5, -74.226523);          // Bogota/Colombia
        this.add(48.944151, 2.263183);    // Paris/France
        this.add(-33.907758, 18.391732);  // Cape Town/South Africa
        this.add(49.254814, -123.087512); // Vancouver/Canada
        this.add(25.792680, -80.232110);  // Miami/Florida
        this.add(35.693089, 139.704742);  // Tokyo/Japan
        this.add(30.034134, 31.218933);   // Cairo/Egypt
        this.draw();
    }

};

var LOGGING = false;

$(document).ready(function(){
    mapReach.init('map-canvas', 'activity-reach');
    google.maps.event.addListener(mapReach.map, 'bounds_changed',
            function() {
                mapReach.canvasSetUp();
                mapReach.placeNodes();
            });
});

这是我研究过的一些公式,但没有成功,可能是我用错误的方法实现了这些公式,或者它们实际上不能用这个公式。

暗纬度/经度指向墨卡托投影上的像素(x,y)

http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/

墨卡托经度和纬度计算在(英国的)裁剪地图上的x和y

谢谢你花时间看书,帮我解决问题。

共有1个答案

凌意
2023-03-14

你还需要从地图的顶部和底部的墨卡托投影,还需要一个因子。然后可以做一个线性变换:将lat/lon转换为像素坐标?。

 类似资料:
  • 我已经看到了不同的实现方法,还有一些关于堆栈溢出的问题--我已经试用了不同的代码片段,虽然我得到了像素的正确经度,但纬度总是偏离的--似乎变得更合理了。 我需要公式,以考虑图像大小,宽度等。 我试过这段代码: 当使用原始代码时,如果纬度值为正,则返回一个负点,所以我稍微修改了它,并用极端纬度进行测试--应该是0点和766点,它工作得很好。然而,当我尝试一个不同的纬度值,例如:58.07(正好在英国

  • 我正在使用sharpmap将MSSQL中的边界(几何体)渲染为PNG图像。这一切都很好,除了国家在平面图像格式上看起来太“宽”。 据我所知,我需要创建到EPSG:3857投影的转换,但我不知道如何做。 这是我的密码 WKT可以在这里找到https://pastebin.com/PEbpAdxT 感谢您的帮助。 编辑2 我也尝试了以下转换,但这会呈现空白的png(没有红色的十字线)

  • 我理解为什么墨卡托投影的纬度是有限制的,但是根据我假设的理论,经度是[-180,180]呢。 然而,从几个地图应用程序的源代码中我看到了。他们试图将经度限制在[-177177]之间。 这是什么原因?

  • 基于这种后转换LAT/LON到像素坐标?,这与真正的墨卡托投影很好地工作。 我面临一个问题的svg地图从openstreet map使用“谷歌墨卡托投影与简化网格(1000)”。 我试着在我的法国地图上画一些城市,所有的点都在这里,但不是它们应该在的地方 svg是基于openmapstreet的pdf在Inkscape中创建的,代码有点长,我在这个fiddle中复制粘贴iti(因为我没有附上Rap

  • 问题内容: 我具有纽约市纽约市的纬度/经度值;40.7560540,-73.9869510和地球的平面图像,即1000px×446px。 我希望能够使用Javascript将纬度/经度转换为X,Y坐标,该点将反映该位置。 因此,图像左上角的X,Y坐标将是;289、111 注意事项: 不用担心要使用哪种投影的问题,可以自己做假设,也可以按照自己知道的可行的方法进行操作 X,Y可以形成图像的任意一角

  • 问题内容: 我正在尝试将经纬度对转换为像素坐标。我发现了这种墨卡托投影,但我不理解代码。x_adj,y_adj变量是什么因素?当我在没有这些常量的情况下运行代码时,我的经/纬对就不在地图上,并且x和y像素坐标也不是我想要的。 问题答案: 这些变量从何而来 选择这些变量以使计算出的坐标与地图的背景图像匹配。如果知道地图的投影参数,则可以计算它们。但是我相信,它们很可能是通过反复试验而获得的。 如何计