首页 文章

使用校准点在 Map 上将经度和纬度转换为X Y.

提问于
浏览
22

如果我有一个尺寸为sizeX,sizeY的jpeg Map

和 Map 上的一些校准点(X,Y,Lon,Lat)

使用给定的经度/纬度对计算 Map 中相应XY点的算法是什么?

7 回答

  • 5

    这对我有用,没有那么多bs .

    int x =  (int) ((MAP_WIDTH/360.0) * (180 + lon));
    int y =  (int) ((MAP_HEIGHT/180.0) * (90 - lat));
    

    Android设备向我提供了lat,lon坐标 . 所以它们应该与所有Google Earth / Map产品使用的标准相同 .

  • 8

    如果使用Equidistant Cylindrical Projection type map,您需要执行以下操作:

    注意:当使用负经度纬度时,请务必加上或减去负数,即(-92)或 - ( - 35),实际上是-92和35

    • 现在,您可以在图像上绘制X和Y.

    有关此公式和 Map 类型的更多信息,请访问:
    http://www.progonos.com/furuti/MapProj/Dither/CartHow/HowER_W12/howER_W12.html#DeductionEquirectangular

  • 18

    互联网上有大量关于计算两对纬度和经度之间距离的信息 . 我们在我们的公共网站上使用这些计算,并且他们理解/讨论并不容易(所以我不会试图在这里介绍它们) . 也就是说,它们很容易实现 .

    一旦你有一个返回距离的函数,你应该能够根据角之间的距离来计算 Map 的宽度和高度 .

    然后,您可以从左上角计算点的水平和垂直距离 .

    现在,您可以找出左侧与点之间的距离表示 Map 宽度的比率,将该比率应用于像素宽度,并确定左侧与点之间的像素数 . 重复y轴 .

    (左侧像素)=(总像素宽度)*((左侧和您的点之间的地理编码距离)/(左侧和右侧之间的地理编码距离))

    (顶部像素)=(总像素高度)*((顶部和点之间的地理编码距离)/(顶部和底部之间的地理编码距离))

    编辑:当你进一步研究时,你会注意到一些解决方案将提供比其他解决方案更准确的结果,因为你接近球面上两点之间的距离并将其映射到平面上 . 随着距离的增加,精度会降低 . 对您提出的最佳建议是先尝试一下,看看它是否符合您的需求 .

  • 1

    这是相当直接和简单的..让我解释它是如何可能的 .

    纬度和经度是在地球上绘制的虚线,以便您可以准确地精确定位世界上的任何位置 . 简单地说它们是飞机的X和Y坐标 . 纬度是一条从北向南延伸的垂直线,北极为90度,南极为90度 .

    另一方面,经度是从东到南的水平线,西面为-180度,东面为180度 .

    您可以将latLng转换为像素坐标,因为假设html容器的宽度是世界的宽度,同样适用于高度 .

    Formula - Longitude - pixel

    (givenLng*widthOfContainerElement)/360
    

    其中360是以度为单位的总经度

    Formula -Latitude - pixel

    (givenLat*heightOfContainerElement)/180
    

    其中180是度数的总纬度

    //Height is calculated from the bottom
    

    你可以在这里找到这个公式的工作实现, on my website (它只使用JavaScript)

    http://www.learntby.me/javascript/latLngconversion.php

    如果您仍需要任何澄清,请告诉我 .

  • 7

    有许多不同的 Map 投影方案 . 您必须知道 Map 使用了哪一个 .

    有关 Map 投影算法和正向/反向映射的详细信息,请查看this link . 它提供了许多常见预测的公式 .

  • 10

    只需这样(对于墨卡托投影图):

    extension UIView
    {
        func addLocation(coordinate: CLLocationCoordinate2D)
        {
            // max MKMapPoint values
            let maxY = Double(267995781)
            let maxX = Double(268435456)
    
            let mapPoint = MKMapPointForCoordinate(coordinate)
    
            let normalizatePointX = CGFloat(mapPoint.x / maxX)
            let normalizatePointY = CGFloat(mapPoint.y / maxY)
    
            let pointView = UIView(frame: CGRectMake(0, 0, 5, 5))
            pointView.center = CGPointMake(normalizatePointX * frame.width, normalizatePointY * frame.height)
    
            pointView.backgroundColor = UIColor.blueColor()
    
            addSubview(pointView)
        }
    }
    

    我在UIView上添加坐标的简单项目:https://github.com/Glechik/MapCoordinateDrawer

  • 1
    <!DOCTYPE html>
    <html>
    <head>
    <style>
    #point{font-face:Arial; font-size:18px; color:#FFFF00; width:12px; height:12px;text-shadow: 2px 2px #000000}
    #canvas {position: absolute; top: 0px; left: 0px; z-index: -2}
            html,
            body,
            #canvas {
                width: 100%;
                height: 100%;
                overflow: hidden;
                margin: 0
            }
    </style>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
    <script>
    $(window).on("load resize",function(e){
    
    var w = $("#canvas").width();
    var h = $("#canvas").height();
    // New York, NY (https://maps.googleapis.com/maps/api/geocode/json?address=New%20York,%20NY)
                   var lat = 40.91525559999999;
                   var long = -73.70027209999999;
    
    
    var x =  ((w/360) * (180 + long)) - 9;
    var y =  ((h/180) * (90 - lat)) - 18;
    
    $("#text").text('X:'+x+', Y:'+y);
    $("#point").offset({ top: y, left: x });
    
    });
    </script>
    </head>
    <body>
    <div id="text"></div>
    <div id="point">▼</div>
    <img id="canvas" border="0" src="http://friday.westnet.com/~crywalt/dymaxion_2003/earthmap10k.reduced.jpg">
    
    </body>
    </html>
    

相关问题