Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Учет направления при вычислении STDistance между POINT и LINESTRING  [new]
design21
Member

Откуда: Minsk
Сообщений: 59
Разрабатываю систему для поиска попутчиков.
Есть таблица котрая хранит маршруты поездок:
RouteLine - линия маршрута
StartPoint - точка начала маршрута
FinishPoint - точка окончания маршрута

IF OBJECT_ID('dbo.tbRoutes') IS NOT NULL
drop table dbo.tbRoutes;

CREATE TABLE dbo.tbRoutes ( 
    RouteId INT IDENTITY PRIMARY KEY,
    RouteName VARCHAR(64),
    RouteLine GEOGRAPHY,
    StartPoint GEOGRAPHY,
    FinishPoint GEOGRAPHY
  );


Положим в нее для примера 2 маршрута, прямой и обратный. Здесь для простоты маршруты состят из двух точек, но в общем случае точек может быть много.

  INSERT INTO tbRoutes (RouteName,RouteLine,StartPoint, FinishPoint)
  VALUES ('minsk_dzerzhinsk'
  , GEOGRAPHY::STGeomFromText('LINESTRING(27.562717 53.902745, 27.136024 53.690201)',4326)
  , GEOGRAPHY::STGeomFromText('POINT(27.562717 53.902745)',4326)
  , GEOGRAPHY::STGeomFromText('POINT(27.136024 53.690201)',4326));


  INSERT INTO tbRoutes (RouteName,RouteLine,StartPoint, FinishPoint)
  VALUES ('dzerzhinsk_minsk'
  , GEOGRAPHY::STGeomFromText('LINESTRING(27.136024 53.690201, 27.562717 53.902745)',4326)
  , GEOGRAPHY::STGeomFromText('POINT(27.136024 53.690201)',4326)
  , GEOGRAPHY::STGeomFromText('POINT(27.562717 53.902745)',4326));


Пользователь вводит точки начала и конца своей поездки @Start, @Finish, и хочет найти себе попутчика, маршрут которого проходит в пределах 10 км от его точек. Кроме того его интересует толко маршруты в правильном направлении, а не обратные.
Вопрос в том как лучше опредлить что маршруты имеют "примерно" одинаковое направление.
"примерно" потому, что маршруты могут иметь различную конфигурацию и не совпадать, просто необходимо чтобы они проходили вблизи точкек @Start, @Finish в правильной последовательности: сначала мимо старта, потом мимо финиша.

я придумал добавить 2 условия:
расстояние от точки StartPoint маршрута до @Start меньше чем расстояние от FinishPoint маршрута до @Start
и расстояние от точки FinishPoint маршрута до @Finish меньше чем расстояние от FinishPoint маршрута до @Start

SELECT * FROM tbRoutes r
WHERE RouteLine.STDistance(@Start) < 10000  -- Route within start point  
AND RouteLine.STDistance(@Finish) < 10000 -- Route within finish point

AND StartPoint.STDistance(@Start) < FinishPoint.STDistance(@Start)
AND FinishPoint.STDistance(@Finish) < FinishPoint.STDistance(@Start) -- correct direction


но решение мне кажется довольно кривым. Посоветуйсте что-нибудь еще пожалуйста.
23 окт 12, 16:23    [13363796]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить