Всем привет.
Помогите понять, в чем проблема - очень много времени потратил - в итогерешение етсь, но все же не то, что нужно.
Есть две точки в формате nmea, которые пришли с GPS-устройства:
// 1.
[x] => 4644.15310
[x_direct] => N
[y] => 3322.23860
[y_direct] => E
// 2.
[x] => 4644.15830
[x_direct] => N
[y] => 3322.29570
[y_direct] => E
Путем нехитрых рассчетов, получил представление в нормальном формате - рассчеты ниже:
Точка1:
X: 46 + ( 44,1531 / 60 ) =
46.735885
Y: 33 + ( 22,2386 / 60 ) =
33.370643333
Точка2:
X: 46 + ( 44,1583 / 60 ) =
46.735971667
Y: 33 + ( 22,2957 / 60 ) =
33.371595
Итого получилось две точки, которые я могу вывести в Google и посмотреть расстояние между ними - 73 м.
Отлично. В десктопной реализации моего проекта используется следующая функция:
CREATE OR REPLACE FUNCTION calcdistance(x1 double precision, x2 double precision, y1 double precision, y2 double precision)
RETURNS double precision AS
$BODY$
DECLARE
fPhimean DOUBLE PRECISION;
fdLambda DOUBLE PRECISION;
fdPhi DOUBLE PRECISION;
fAlpha DOUBLE PRECISION;
fRho DOUBLE PRECISION;
fNu DOUBLE PRECISION;
fR DOUBLE PRECISION;
fz DOUBLE PRECISION;
fTemp DOUBLE PRECISION;
Distance DOUBLE PRECISION;
d2r DOUBLE PRECISION;
a DOUBLE PRECISION;
e2 DOUBLE PRECISION;
BEGIN
d2r = 0.017453;
a = 6378137;
e2 = 0.006739496742337;
IF ((x1=x2) and (y1=y2)) then return(0);
END IF;
fdLambda = (y1 - y2) * d2r;
fdPhi = (x1 - x2) * d2r;
fPhimean = ((x1 + x2) / 2) * d2r;
fTemp = 1 - e2 * (Pow(Sin(fPhimean), 2));
fRho = (a * (1 - e2)) / Pow(fTemp, 1.5);
fNu = a / (Sqrt(1 - e2 * (Sin(fPhimean) * Sin(fPhimean))));
fz = Sqrt(Pow(Sin(fdPhi / 2), 2) + Cos(x2 * d2r) * Cos(x1 * d2r) *Pow(Sin(fdLambda / 2), 2));
fz = 2 * Asin(fz);
fAlpha = Cos(x2 * d2r) * Sin(fdLambda) * 1 / Sin(fz);
fAlpha =Asin(fAlpha);
fR = (fRho * fNu) / ((fRho * Pow(Sin(fAlpha), 2)) + (fNu * Pow(Cos(fAlpha), 2)));
Distance = (fz * fR);
return(Distance);
END;
Она считает расстояние между двумя точками. Результат ее работы верен, если верить Google - 73 м.
Но также у меня настроен PostGIS и мне хотелось бы решать вопросы расстояния и т.д. при его помощи.
Пробовал разные варианты, например, вот так:
SELECT ROUND(
CAST(
ST_Distance_Sphere(
ST_GeomFromText('POINT(46.735885 33.370643333)',4326),
ST_GeomFromText('POINT(46.735971667 33.371595)',4326)
) As numeric
), 2) as distance;
Но результат не 73 метра, а 106 м.
Подскажите, в чем дело, куда копнуть - крайне хочется использовать именно расчеты PostGIS - т.к. их будет много.