Расчет подшипника по UTM (широта, долгота)
Я хочу рассчитать относительную ориентацию между двумя точками гео-координат. Я пошел вперед и преобразовал координаты в UTM, но мне нужна помощь в определении фактического значения. Я знаю, что UTM достаточно хорош только для расчетов в одной зоне, что хорошо, так как вычисления будут выполняться на очень малых расстояниях.
Скажите, что point1 - это мое местоположение, 44.4N,-97.7W, а point2 - это то место, где я хотел бы получить относительную привязку: 44.4N, -103.3W.
Поскольку точка 2 находится непосредственно слева от точки 1, я бы интерпретировал это как 270 градусов (север - 0 или 360 градусов).
Я нашел эту формулу: arctan((y1-y2)/(x1-x2)), но для меня это не имеет смысла, когда я строю точки и измеряю углы.
3 ответа
К вашему сведению, сейчас я использую пространственные типы данных SQL Server 2008, пространственные функции и некоторые функции T-SQL, которые я обнаружил в Интернете.
ALTER FUNCTION dbo.GeographyBearing (
@Point1 geography,
@Point2 geography )
RETURNS FLOAT
AS
BEGIN
DECLARE @Bearing DECIMAL(18,15)
DECLARE @Lat1 FLOAT = RADIANS(@Point1.Lat)
DECLARE @Lat2 FLOAT = RADIANS(@Point2.Lat)
DECLARE @dLon FLOAT = RADIANS(@Point2.Long - @Point1.Long)
IF (@Point1.STEquals(@Point2) = 1)
SET @Bearing = NULL
ELSE
SET @Bearing = ATN2(
SIN(@dLon)*COS(@Lat2),
(COS(@Lat1)*SIN(@Lat2)) - (SIN(@Lat1)*COS(@Lat2)*COS(@dLon))
)
SET @Bearing = (DEGREES(@Bearing) + 360) % 360
RETURN ISNULL(@Bearing,0);
END
GO
DECLARE @Vienna geography = geography::Point(16.37, 48.21, 4326)
DECLARE @Moscow geography = geography::Point(37.60, 55.75, 4326)
SELECT dbo.GeographyBearing(@Vienna,@Moscow)
Пожалуйста, найдите здесь мой ответ, связанный с конвертером координат с открытым исходным кодом. Это может быть полезно для вас, учитывая ваши потребности.
Мой ответ в Javascript http://jsfiddle.net/efwjames/NVhg6/
//stop location - the radii end point
var x1 = 44.9631;
var y1 = -93.2492;
//bus location from the southeast - the circle center
var x2 = 44.95517;
var y2 = -93.2427;
var radians = getAtan2((y1 - y2), (x1 - x2));
function getAtan2(y, x) {
return Math.atan2(y, x);
};
$("#output").text(radians);
var newdeg = radians * (180 / Math.PI);
$("#deg").append(newdeg);
var coordNames = ["N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"];
var directionid = Math.round(newdeg / 45);
if (directionid < 0) {
directionid = directionid + 8
};
$("#dir").append("The vehicle is moving " + coordNames[directionid]);