代码之家  ›  专栏  ›  技术社区  ›  Jorge

在带有校准点的地图上将经纬度转换为X Y

  •  24
  • Jorge  · 技术社区  · 16 年前

    如果我有一个大小为sizeX,sizeY的jpeg地图

    以及地图上的一些校准点(X,Y,Lon,Lat)

    7 回复  |  直到 16 年前
        1
  •  19
  •   Gubatron    15 年前

    这是对我有用的,没有那么多废话。

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

    lat,lon坐标是Android设备给我的。因此,它们应该与所有Google Earth/Map产品使用的标准相同。

        2
  •  11
  •   Anthony Master    16 年前

    如果使用 Equidistant Cylindrical Projection type map ,下面是您需要做的:


    1. http://lifehacker.com/267361/how-to-find-latitude-and-longitude
    2. 将该信息输入以下公式:
      x=(图像总宽度,像素)*(180+纬度)/360
      y=(图像总高度,像素)*(90-经度)/180

      注:使用负经度纬度时,请确保加上或减去负数,即+92或-35,实际为-92和+35

    3. 你现在有你的X和Y来绘制你的图像


      http://www.progonos.com/furuti/MapProj/Dither/CartHow/HowER_W12/howER_W12.html#DeductionEquirectangular
        3
  •  8
  •   Mayo    16 年前

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

    然后可以计算点到左上角的水平和垂直距离。

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

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

    编辑:当你进一步研究这个问题的时候,你会注意到一些解决方案会比其他解决方案给出更精确的结果,因为你是在一个球面上的两点之间的距离的近似值,并且映射到一个平面上。精度随着距离的增加而降低。最好的建议是先试试看是否能满足你的需要。

        4
  •  7
  •   josliber Martin Ballet    8 年前

    这是相当直接和简单的。。让我解释一下这是怎么可能的。

    纬度和经度是在地球上绘制的假想线,这样你就可以精确地定位世界上的任何位置。简单地说,它们是飞机的X和Y坐标。

    另一方面,经度是一条由东向南的水平线,西至-180度,东至180度。

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

    公式-经度-像素

    (givenLng*widthOfContainerElement)/360
    

    其中360是总经度(度)

    公式-纬度-像素

    (givenLat*heightOfContainerElement)/180
    

    //Height is calculated from the bottom
    

    你可以在这里找到这个公式的工作实现, 在我的网站上

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

    如果你还需要澄清,请告诉我。

        5
  •  5
  •   Eric J.    16 年前

    有许多不同的地图投影方案。你得知道你的地图用的是哪一个。

    this link . 它提供了一些常见投影的公式。

        6
  •  2
  •   Savchenko Dmitry    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

        7
  •  1
  •   Omer    10 年前

    <!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>