web-dev-qa-db-ja.com

球体上の3D座標から緯度と経度

次の情報があります。

Origin(0,0,0)とradius Rの球体が存在します。光線と球体の交差を行った後、球体上の3D空間のポイント(XYZ)がわかります(線が貫通する3D空間の正確な位置)球体)。

私のプログラムでは、球体上のXYZポイントの緯度と経度を計算したいと思いますが、これを簡単に行う方法(またはGoogle)を考えることはできません。

要するに、私が書き込もうとしている関数は次のとおりです。

public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
    return Latitude and Longitude
}

誰もこれを行う方法を知っていますか?参考として、このWiki SVGファイルが役立つ場合があります。

Geographic coordinates

更新:

すべての有用な答えをありがとう、最終的に私はこのコードで行った:

 public static LatLon FromVector3(Vector3 position, float sphereRadius)
    {
        float lat = (float)Math.Acos(position.Y / sphereRadius); //theta
        float lon = (float)Math.Atan(position.X / position.Z); //phi
        return new LatLon(lat, lon);
    }

今、私はどの答えが私を最も受け入れるのに役立ったかを考えなければなりません:P。

36
Roy T.

X、y、z(3d座標系)から球面極座標を見つけるのは難しくないはずです。

  1. rは、表面上にある場合は常に一定です。

    enter image description here

  2. (90-θ緯度(負の場合は最下部にあります)として上から測定されます

    enter image description here

  3. φは経度です。 (ただし、経度システムについてはよくわかりません)

    enter image description here

wikipedia からこの図も確認してください。

enter image description here

32
Santosh Linkha
_lat=atan2(z,sqrt(x*x+y*y))
lng=atan2(y,x)
_

atan2()で数式を使用する方が便利です。 pi/2を加算/減算したり、異なる象限やゼロ除算の符号の問題を気にする必要はありません。

latは北半球では> 0になります
latは南半球では<0
lngは、東半球では> 0になります
lngは、西半球では<0

9
Curd

これは、Javascript/THREE.jsの使用に役立ちました。

var lat = 90 - (Math.acos(y / RADIUS_SPHERE)) * 180 / Math.PI;
var lon = ((270 + (Math.atan2(x , z)) * 180 / Math.PI) % 360) -180;
7
Torsten Becker
r=sqrt(x^2+y^2+z^2)  
phi = arccos(sqrt(x^2+y^2)/r)*sign(y)  
lambda = arccos(x/sqrt(x^2+y^2))  
latitude = 180/pi * phi  
longitude = 180/pi * lambda 

あなたは少し兆候をいじる必要があるかもしれません

0
titus

これは封筒の裏作業ですが、次のとおりです。

Lat = arctan(z/(sqrt(x^2+y^2)))

Long = arccos(sqrt(x^2+y^2)/x)
0
medivh

Lat/lngを使用して球体にオブジェクトを配置するための簡単なソリューションを取得した後、three.jsを使用してそれを実行できる単純なクラスを思い付きました。

var earth = new THREE.GeoSpatialMap(geometry, material);
earth.setTexturesEdgeLongitude(-180.806168);

for (i = 0; i < continentData.length; i += step) {

    var lat = continentData[i];
    var lng = continentData[i + 1];

    var light = new THREE.PointLight(0x0099ff);
    var plant = new org.good.ecology.Plant();
    plant.scale.x = plant.scale.y = plant.scale.z = Math.random() * 3;

    console.log("Adding symbol at: " + lat + " : " + lng);
    earth.addGeoSymbol(
        new THREE.GeoSpatialMap.GeoSymbol(plant, {
            phi: lat,
            lambda: lng
        })
    );


    plant.lookAt(earth.position);

}

https://github.com/scottbyrns/Three.js-Geospatial-Mapping

0
user1976945

編集-私の答えを再読してもらえるとは限りませんが、参考のために残しておきます。

結果をどのような目的に使用するかがどれだけ正確かによって異なります。単一の緯度と経度のシステムはありません。たとえば、WGS84(USA GPS)またはETRS89(ヨーロッパGPS)はわずかに異なり、大西洋が広がるにつれて分岐しています。

http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guide5.html

http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guide6.html

最後に、これはあなたの質問に直接対処する必要があります。

http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guideb.html

または

http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/convertingcoordinates3D.pdf

0
Jaydee