Współrzędne 3D na kuli do szerokości i długości geograficznej
Mam następujące informacje:
Istnieje kula o pochodzeniu (0,0,0) i promieniu R. Po wykonaniu przecięcia promień-kula znam punkt (XYZ) w przestrzeni 3D, który znajduje się na kuli (dokładna pozycja w przestrzeni 3D, gdzie linia przebija kadłub kuli).
W moim programie chciałbym obliczyć szerokość i długość geograficzną punktu XYZ na kuli, ale nie mogę wymyślić (lub wygooglować) sposobu, aby to zrobić łatwo.
Krótko mówiąc, funkcja, którą próbuję napisz to:
public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
return Latitude and Longitude
}
Czy ktoś wie jak to zrobić? Jako odniesienie ten plik Wiki SVG może być pomocny:
Aktualizacja:
Dzięki za wszystkie pomocne odpowiedzi, więc w końcu poszedłem z tym kodem:
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);
}
Teraz muszę pomyśleć, która odpowiedź pomogła mi najbardziej zaakceptować: p.
7 answers
Myślę, że nie powinno być trudno znaleźć sferyczne współrzędne biegunowe z X, y ,z (układ współrzędnych 3D).
-
r
jest zawsze stała, jeśli jest na powierzchni. -
(90 - θ) twoja szerokość geograficzna (ujemna oznacza, że jest na dole), ponieważ jest mierzona od góry.
-
φ to twoja Długość geograficzna. (ale nie do końca pewne co do długości system)
Sprawdź również ten diagram z Wikipedii .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-05 13:02:06
lat=atan2(z,sqrt(x*x+y*y))
lng=atan2(y,x)
Używanie formuł z {[1] } jest wygodniejsze. Nie musisz dodawać/odejmować pi / 2 ani przejmować się problemami ze znakiem w różnych ćwiartkach lub dzieleniu przez zero.
lat
będzie >0 na półkuli północnejlat
będzie lng
będzie >0 na półkuli wschodniejlng
będzie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-15 08:59:34
To pomogło przy użyciu 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;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-01 16:25:39
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
Być może będziesz musiał trochę majstrować przy znakach
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-15 08:40:37
Edit-po ponownym przeczytaniu kwestionujesz moja odpowiedź nie musi mieć zastosowania, ale zostawię ją dla odniesienia.
To zależy jak dokładne wan być dwhat cel masz zamiar użyć wynik dla. Nie ma jednego systemu szerokości i logitude, NP WGS84 (USA GPS) lub ETRS89 (Europejski GPS) różnią się nieznacznie i różnią się od Oceanu Atlantyckiego poszerza.
Wreszcie to powinno odpowiedzieć na twoje pytanie bezpośrednio.
LUB
Http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/convertingcoordinates3D.pdf
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-15 08:48:51
Po pracy nad prostym rozwiązaniem umieszczania obiektów na kuli za pomocą lat/lng, wymyśliłem prostą klasę, która pozwoli Ci zrobić to za pomocą trzech.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);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-11 00:43:10
To jest praca z kopertami, ale:
Lat = arctan(z/(sqrt(x^2+y^2)))
Long = arccos(sqrt(x^2+y^2)/x)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-11 00:44:35