从纬度转换,经度X,Y(convert from latitude, longitude to x,

2019-09-01 07:18发布

我想GPS位置(经度,纬度)转换成x,y坐标。 我发现有关此主题的许多环节和应用,但它并没有给我正确的答案!

我下面这些步骤来测试答案:(1)首先,我拿两个位置和使用地图计算出它们之间的距离。 (2)然后在两个位置转换成x,y坐标。 (3)然后再次计算两个点之间的距离在x,y坐标,看看它是否给我在点(1)或不相同的结果。

该解决方案的一个我发现下面的,但它并没有给我正确的答案!

latitude = Math.PI * latitude / 180;
longitude = Math.PI * longitude / 180;

// adjust position by radians
latitude -= 1.570795765134; // subtract 90 degrees (in radians)

// and switch z and y 
xPos = (app.radius) * Math.sin(latitude) * Math.cos(longitude);
zPos = (app.radius) * Math.sin(latitude) * Math.sin(longitude);
yPos = (app.radius) * Math.cos(latitude);

同时我想这链接 ,但仍无法与我工作得很好!

任何帮助,如何从(纬度,经度)转换为(X,Y)?

谢谢,

Answer 1:

没有确切的解决方案存在

有从球面到平面中没有轴测图。 当您转换/纬度从平面X / Y坐标球坐标,你不能指望所有的长度将由该操作被保留。 你必须接受某种变形。 许多不同的地图投影确实存在,它可以实现的长度,角度和面积保留地之间不同的妥协。 对于地球表面的短小部分, 横轴墨卡托是相当普遍的。 你可能听说过UTM 。 但也有更多的 。

你的报价计算X / Y / Z的公式,即在三维空间中的一个点。 但是,即使存在,你就不会自动得到正确的距离。 球体表面上两点之间的最短距离将经历这一领域,而在地球上距离表面以下主要测长度。 因此,他们会更长。

逼近的小面积

如果您要绘制地球表面的部分比较少,那么你可以使用一个非常简单的近似。 可以简单地使用所述水平轴x表示经度λ,上述铅垂轴Y表示纬度φ。 这些之间的比例不应该是1:1,虽然。 相反,你应该使用COS(φ0)的长宽比,其中φ0表示接近你的地图的中心纬度。 此外,为了从角度(以弧度为单位),以长度转换,就由地球(在本模型被假定为球形)的半径相乘。

  • X = RķCOS(PHI 0)
  • Y = R z

这是简单的方形投影 。 在大多数情况下,你就可以计算COS(φ0)只有一次,这使得大量的点真的很便宜的后续计算。



Answer 2:

由于该页面显示在谷歌的顶部,而我搜索了这个同样的问题,我想提供一个更实际的答案。 通过MVG答案是正确的,但相当theoratical。

我已经做了轨道在JavaScript中fitbit离子绘图应用程序。 下面的代码是怎么解决这个问题。

//LOCATION PROVIDER
index.js
var gpsFix = false;
var circumferenceAtLat = 0;
function locationSuccess(pos){
  if(!gpsFix){
    gpsFix = true;
    circumferenceAtLat = Math.cos(pos.coords.latitude*0.01745329251)*111305;
  }
  pos.x:Math.round(pos.coords.longitude*circumferenceAtLat),
  pos.y:Math.round(pos.coords.latitude*110919), 
  plotTrack(pos);
}

plotting.js

plotTrack(position){

let x = Math.round((this.segments[i].start.x - this.bounds.minX)*this.scale);
let y = Math.round(this.bounds.maxY - this.segments[i].start.y)*this.scale; //heights needs to be inverted

//redraw?
let redraw = false;

//x or y bounds?
 if(position.x>this.bounds.maxX){
   this.bounds.maxX = (position.x-this.bounds.minX)*1.1+this.bounds.minX; //increase by 10%
   redraw = true;
 }
 if(position.x<this.bounds.minX){
   this.bounds.minX = this.bounds.maxX-(this.bounds.maxX-position.x)*1.1;
    redraw = true;
 };
 if(position.y>this.bounds.maxY){
   this.bounds.maxY = (position.y-this.bounds.minY)*1.1+this.bounds.minY; //increase by 10%
    redraw = true;
 }
 if(position.y<this.bounds.minY){
   this.bounds.minY = this.bounds.maxY-(this.bounds.maxY-position.y)*1.1;
    redraw = true;
 }
 if(redraw){
   reDraw();
 }
}


function reDraw(){

let xScale = device.screen.width / (this.bounds.maxX-this.bounds.minX);
let yScale = device.screen.height / (this.bounds.maxY-this.bounds.minY); 
if(xScale<yScale) this.scale = xScale; 
else this.scale = yScale;

//Loop trough your object to redraw all of them
}


Answer 3:

我想与大家分享我如何管理的问题。 我用就跟@MvG说,方形投影,但此方法对有关地球(或整个地图)X和Y位置,这意味着你的全球地位。 就我而言,我想坐标转换在小范围内(500米左右的正方形),所以我相关的投影点再得2分,得到了全球的位置,并与当地的(屏幕)的位置,就像这样:

首先,我选择2点(左上和右下)左右,我想项目,就像这张照片上的区域:

有一次,我在纬度和经度的全球参考区域,我做屏幕位置相同。 包含此数据的对象如下所示。

//top-left reference point
var p0 = {
    scrX: 23.69,        // Minimum X position on screen
    scrY: -0.5,         // Minimum Y position on screen
    lat: -22.814895,    // Latitude
    lng: -47.072892     // Longitude
}
//bottom-right reference point
var p1 = {
    scrX: 276,          // Maximum X position on screen
    scrY: 178.9,        // Maximum Y position on screen
    lat: -22.816419,    // Latitude
    lng: -47.070563     // Longitude
}
var radius = 6.371;     //Earth Radius in Km

//## Now I can calculate the global X and Y for each reference point ##\\

// This function converts lat and lng coordinates to GLOBAL X and Y positions
function latlngToGlobalXY(lat, lng){
    //Calculates x based on cos of average of the latitudes
    let x = radius*lng*Math.cos((p0.lat + p1.lat)/2);
    //Calculates y based on latitude
    let y = radius*lat;
    return {x: x, y: y}
}
// Calculate global X and Y for top-left reference point
p0.pos = latlngToGlobalXY(p0.lat, p0.lng);
// Calculate global X and Y for bottom-right reference point
p1.pos = latlngToGlobalXY(p1.lat, p1.lng);

/*
* This gives me the X and Y in relation to map for the 2 reference points.
* Now we have the global AND screen areas and then we can relate both for the projection point.
*/

// This function converts lat and lng coordinates to SCREEN X and Y positions
function latlngToScreenXY(lat, lng){
    //Calculate global X and Y for projection point
    let pos = latlngToGlobalXY(lat, lng);
    //Calculate the percentage of Global X position in relation to total global width
    pos.perX = ((pos.x-p0.pos.x)/(p1.pos.x - p0.pos.x));
    //Calculate the percentage of Global Y position in relation to total global height
    pos.perY = ((pos.y-p0.pos.y)/(p1.pos.y - p0.pos.y));

    //Returns the screen position based on reference points
    return {
        x: p0.scrX + (p1.scrX - p0.scrX)*pos.perX,
        y: p0.scrY + (p1.scrY - p0.scrY)*pos.perY
    }
}

//# The usage is like this #\\

var pos = latlngToScreenXY(-22.815319, -47.071718);
$point = $("#point-to-project");
$point.css("left", pos.x+"em");
$point.css("top", pos.y+"em");

正如你所看到的,我在javascript做这一点,但计算可以翻译成任何语言。

PS:我是应用转换位置到HTML元素的ID为“点到的项目”。 为了使用这段代码对你的项目,你必须创建这个元素(如风格绝对位置),或改变“使用”块。



Answer 4:

它能够更好地转换为UTM坐标,并将其视为x和y。

import utm
u = utm.from_latlon(12.917091, 77.573586)

其结果将是(779260.623156606,1429369.8665238516,43,“P”)的前两个可以被视为x,y坐标,将43P是UTM区,其可以为小区域(宽度高达668公里)被忽略。



文章来源: convert from latitude, longitude to x,y