supervaleha
@supervaleha
Web-development

В каком формате передать данные при рассчете расстояния PostGIS?

Всем привет.

Помогите понять, в чем проблема - очень много времени потратил - в итогерешение етсь, но все же не то, что нужно.

Есть две точки в формате 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 - т.к. их будет много.
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
supervaleha
@supervaleha Автор вопроса
Web-development
В примере выше перепутаны X и Y. Разность форматов.(((

Пример правильного рассчета:

SELECT ROUND(
  CAST(
    ST_Length_Spheroid(
      ST_GeomFromText('LINESTRING(33.370643333 46.735885, 33.371595 46.735971667)',4326),
      'SPHEROID["GRS_1980",6378137,298.257222101]' 
    ) As numeric
  ), 2) as distance;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы