Gps 转换经度&;带有校准点的地图上X Y的纬度

Gps 转换经度&;带有校准点的地图上X Y的纬度,gps,geocoding,coordinates,latitude-longitude,Gps,Geocoding,Coordinates,Latitude Longitude,如果我有一张大小为sizeX,sizeY的jpeg地图 以及地图上的一些校准点(X、Y、Lon、Lat) 对于给定的经度/纬度对,计算地图中相应XY点的算法是什么?互联网上有大量关于计算两对经度和纬度之间距离的信息。我们在我们的公共网站上使用了这些计算,它们并不容易理解/讨论(因此我不会在这里介绍它们)。也就是说,它们很容易实现 一旦有了一个返回距离的函数,就应该能够根据角之间的距离计算地图的宽度和高度 然后可以计算点从左上角的水平和垂直距离 现在,您可以找出由左侧和点之间的距离表示的贴图宽度的

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

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


对于给定的经度/纬度对,计算地图中相应XY点的算法是什么?

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

一旦有了一个返回距离的函数,就应该能够根据角之间的距离计算地图的宽度和高度

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

现在,您可以找出由左侧和点之间的距离表示的贴图宽度的比率,将该比率应用于像素宽度,就可以得到左侧和点之间的像素数。对y轴重复此操作

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

(从顶部算起的像素)=(总高度(以像素为单位)*((顶部和点之间的地理编码距离)/(顶部和底部之间的地理编码距离))


编辑:当您进一步研究此问题时,您会注意到,由于您正在近似球面上两点之间的距离并映射平面上两点之间的距离,因此某些解决方案将提供比其他解决方案更精确的结果。随着距离的增加,精度降低。对你最好的建议是先尝试一下,看看它是否满足你的需要

有许多不同的地图投影方案。您必须知道地图使用的是哪一个

有关地图投影算法和正向/反向贴图的更多信息,请查看。它提供了许多常用投影的公式。

如果使用,则需要执行以下操作:

  • 在此处查找位置教程的纬度和经度:
  • 将该信息输入以下公式:
    x=(以像素为单位的图像总宽度)*(180+纬度)/360
    y=(以像素为单位的图像总高度)*(90-经度)/180

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

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

    有关此公式和贴图类型的更多信息,请参见此处:

  • 这就是我的工作,没有那么多废话

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

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

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

    纬度和经度是在地球上绘制的假想线,这样你就可以准确地确定世界上的任何位置。简单地说,它们是平面的X坐标和Y坐标。 纬度是一条从北到南的垂直线,北极90度,南极-90度

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

    通过假设html容器的宽度是世界的宽度,高度也是如此,可以将latLng转换为像素坐标

    公式-经度-像素

    (givenLng*widthOfContainerElement)/360
    
    (givenLat*heightOfContainerElement)/180
    
    其中360是以度为单位的总经度

    公式-纬度-像素

    (givenLng*widthOfContainerElement)/360
    
    (givenLat*heightOfContainerElement)/180
    
    其中180是以度为单位的总纬度

    你可以在我的网站上找到这个公式的有效实现(它只使用JavaScript)

    如果您还需要任何澄清,请告诉我。

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

    我在UIView上添加坐标的简单项目:

    
    #点{字体:Arial;字体大小:18px;颜色:#FFFF00;宽度:12px;高度:12px;文本阴影:2px2px#000000}
    #画布{位置:绝对;顶部:0px;左侧:0px;z索引:-2}
    html,
    身体,
    #帆布{
    宽度:100%;
    身高:100%;
    溢出:隐藏;
    保证金:0
    }
    $(窗口)。打开(“加载调整大小”,函数(e){
    var w=$(“#画布”).width();
    var h=$(“#画布”).height();
    //纽约州纽约市(https://maps.googleapis.com/maps/api/geocode/json?address=New%20York,%20NY)
    var lat=40.915255599999;
    var long=-73.700272099999;
    var x=((w/360)*(180+长))-9;
    变量y=((h/180)*(90-lat))-18;
    $(“#text”).text('X:'+X+',Y:'+Y);
    $(“#点”).offset({top:y,left:x});
    });
    ▼
    
    我尝试过这种方法:

    int x =  (int) ((MAP_WIDTH/360.0) * (180 + lon));
    int y =  (int) ((MAP_HEIGHT/180.0) * (90 - lat));
    
    但这个对我来说更好:

    以下是编写上述文章的一部分代码的快捷方式:

    地图将我们的3D投影到2D曲面上。因为不能将正方形完美地包裹到球体上,所以有不同的投影方法来获得近似正确的结果。给定地图上的距离是非线性的,因此您的公式只是一个近似值。近似值适用于大多数距离。但我应该在帖子中澄清一下。是的,地图放大得越多,结果就越准确。对于城市级地图,你应该会看到几乎零的差异,但对于州级或更大的地图,这是显而易见的。我知道这有点陈旧,但这个答案很好,效果非常好。非常感谢。我不需要太多的准确性,所以也许下面的解决方案就足够了。如果不是,转型会是怎样的?那些没有计划的计划是什么?到目前为止,我已经看到:UTM横向墨卡托-墨卡托经度/纬度EBTW。我还编写了在Lat/Lon和UTM之间转换的公式。正在从Lat/Lon转换为UTM并应用