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

Откуда: Санкт-Петербург
Сообщений: 407
Здравствуйте!
Есть необходимость решения задачи соответствия точки заданной области в запросе.
Есть таблица с объектами у каждого есть координаты на карте. Есть произвольная область на карте обозначенная координатами вершин многоугольника.
Задача выбрать строки из таблицы координаты которых попадают в область.

Я нашел решение данной задачи в виде алгоритма генерирующего запрос к серверу : http://freehabr.ru/blog/database/11006.html

но результирующий запрос не воспринимается MSSQL-сервером. Может MySQL как-то по другому его интерпретирует?

запрос имеет следующий вид:
SELECT id, x_coord, y_coord FROM point WHERE y_coord BETWEEN 30.3740 AND 30.3845 AND x_coord BETWEEN 60.0436 AND 60.0469 AND ((y_coord BETWEEN 30.3757 AND 30.3766 AND x_coord < (y_coord-30.3757)*1.1111111111067+60.0450)+(y_coord BETWEEN 30.3766 AND 30.3776 AND x_coord < (y_coord-30.3766)*0.59999999999787+60.0460)+(y_coord BETWEEN 30.3776 AND 30.3787 AND x_coord < (y_coord-30.3776)*0.18181818181818+60.0466)+(y_coord BETWEEN 30.3787 AND 30.3800 AND x_coord < (y_coord-30.3787)*0.0769230769256+60.0468)+(y_coord BETWEEN 30.3800 AND 30.3818 AND x_coord < (y_coord-30.3800)*-0.2777777777792+60.0469)+(y_coord BETWEEN 30.3818 AND 30.3833 AND x_coord < (y_coord-30.3818)*-0.39999999999905+60.0464)+(y_coord BETWEEN 30.3833 AND 30.3842 AND x_coord < (y_coord-30.3833)*-0.77777777777865+60.0458)+(y_coord BETWEEN 30.3842 AND 30.3845 AND x_coord < (y_coord-30.3842)*-1.6666666666548+60.0451)+(y_coord BETWEEN 30.3845 AND 30.3845 AND x_coord<=60.0446)+(y_coord BETWEEN 30.3840 AND 30.3845 AND x_coord < (y_coord-30.3845)*1.0000000000071+60.0443)+(y_coord BETWEEN 30.3833 AND 30.3840 AND x_coord < (y_coord-30.3840)*0.28571428571284+60.0438)+(y_coord BETWEEN 30.3788 AND 30.3833 AND x_coord < (y_coord-30.3833)*-0+60.0436)+(y_coord BETWEEN 30.3755 AND 30.3788 AND x_coord < (y_coord-30.3788)*-0.06060606060593+60.0436)+(y_coord BETWEEN 30.3745 AND 30.3755 AND x_coord < (y_coord-30.3755)*-0.2+60.0438)+(y_coord BETWEEN 30.3740 AND 30.3745 AND x_coord < (y_coord-30.3745)*-1+60.0440)+(y_coord BETWEEN 30.3740 AND 30.3740 AND x_coord<=60.0449)+(y_coord BETWEEN 30.3740 AND 30.3748 AND x_coord < (y_coord-30.3740)*0.37500000000278+60.0449)+(y_coord BETWEEN 30.3748 AND 30.3757 AND x_coord < (y_coord-30.3748)*-0.22222222222222+60.0452)) % 2 = 1 ORDER BY id LIMIT 50

объясните мне что должны делать "+" между частями запроса и как мне заставить его работать в MSSQL?

Или если у кого-то есть аналогичное решение проблемы, буду очень благодарен!
12 дек 13, 14:49    [15282872]     Ответить | Цитировать Сообщить модератору
 Re: Попадает ли точка в заданную область  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34760
Блог
Semyglass,

алгоритмы по "Задача о принадлежности точки многоугольнику" - ищется в вики на раз-два

из запроса попробуйте убрать LIMIT 50, или приведите сообщение об ошибке
12 дек 13, 15:07    [15283033]     Ответить | Цитировать Сообщить модератору
 Re: Попадает ли точка в заданную область  [new]
wizli
Member

Откуда: Minsk
Сообщений: 270
Semyglass
Здравствуйте!
Есть необходимость решения задачи соответствия точки заданной области в запросе.
Есть таблица с объектами у каждого есть координаты на карте. Есть произвольная область на карте обозначенная координатами вершин многоугольника.
Задача выбрать строки из таблицы координаты которых попадают в область.

Я нашел решение данной задачи в виде алгоритма генерирующего запрос к серверу : http://freehabr.ru/blog/database/11006.html

но результирующий запрос не воспринимается MSSQL-сервером. Может MySQL как-то по другому его интерпретирует?

запрос имеет следующий вид:
SELECT id, x_coord, y_coord FROM point WHERE y_coord BETWEEN 30.3740 AND 30.3845 AND x_coord BETWEEN 60.0436 AND 60.0469 AND ((y_coord BETWEEN 30.3757 AND 30.3766 AND x_coord < (y_coord-30.3757)*1.1111111111067+60.0450)+(y_coord BETWEEN 30.3766 AND 30.3776 AND x_coord < (y_coord-30.3766)*0.59999999999787+60.0460)+(y_coord BETWEEN 30.3776 AND 30.3787 AND x_coord < (y_coord-30.3776)*0.18181818181818+60.0466)+(y_coord BETWEEN 30.3787 AND 30.3800 AND x_coord < (y_coord-30.3787)*0.0769230769256+60.0468)+(y_coord BETWEEN 30.3800 AND 30.3818 AND x_coord < (y_coord-30.3800)*-0.2777777777792+60.0469)+(y_coord BETWEEN 30.3818 AND 30.3833 AND x_coord < (y_coord-30.3818)*-0.39999999999905+60.0464)+(y_coord BETWEEN 30.3833 AND 30.3842 AND x_coord < (y_coord-30.3833)*-0.77777777777865+60.0458)+(y_coord BETWEEN 30.3842 AND 30.3845 AND x_coord < (y_coord-30.3842)*-1.6666666666548+60.0451)+(y_coord BETWEEN 30.3845 AND 30.3845 AND x_coord<=60.0446)+(y_coord BETWEEN 30.3840 AND 30.3845 AND x_coord < (y_coord-30.3845)*1.0000000000071+60.0443)+(y_coord BETWEEN 30.3833 AND 30.3840 AND x_coord < (y_coord-30.3840)*0.28571428571284+60.0438)+(y_coord BETWEEN 30.3788 AND 30.3833 AND x_coord < (y_coord-30.3833)*-0+60.0436)+(y_coord BETWEEN 30.3755 AND 30.3788 AND x_coord < (y_coord-30.3788)*-0.06060606060593+60.0436)+(y_coord BETWEEN 30.3745 AND 30.3755 AND x_coord < (y_coord-30.3755)*-0.2+60.0438)+(y_coord BETWEEN 30.3740 AND 30.3745 AND x_coord < (y_coord-30.3745)*-1+60.0440)+(y_coord BETWEEN 30.3740 AND 30.3740 AND x_coord<=60.0449)+(y_coord BETWEEN 30.3740 AND 30.3748 AND x_coord < (y_coord-30.3740)*0.37500000000278+60.0449)+(y_coord BETWEEN 30.3748 AND 30.3757 AND x_coord < (y_coord-30.3748)*-0.22222222222222+60.0452)) % 2 = 1 ORDER BY id LIMIT 50

объясните мне что должны делать "+" между частями запроса и как мне заставить его работать в MSSQL?

Или если у кого-то есть аналогичное решение проблемы, буду очень благодарен!


MsSQL его не воспринимает, потому что это не синтаксис t-sql.
Уберите limit 50 и поставьте в начале запросе
 select top (50) id, x_coord, y_coord FROM point WHERE
и т.д.

И если честно я не до конца понял значение этой фразы
Semyglass
но результирующий запрос не воспринимается MSSQL-сервером. Может MySQL как-то по другому его интерпретирует?
12 дек 13, 15:07    [15283038]     Ответить | Цитировать Сообщить модератору
 Re: Попадает ли точка в заданную область  [new]
Semyglass
Member

Откуда: Санкт-Петербург
Сообщений: 407
Виноват, не корректно объяснил суть возникшей проблемы.
Приведенный запрос - это выдержка из статьи на которую я дал ссылку. В моем случае запрос получился такой:
SELECT Id FROM [ObjectWeb]
  WHERE (AddressLong BETWEEN 30.3190898895264 AND 30.3201198577881 AND AddressLat < (AddressLong-30.3201198577881)*2.41922786513137 + 59.9661815400359)
   + (AddressLong BETWEEN 30.3190898895264 AND 30.3249263763428 AND AddressLat < (AddressLong-30.3190898895264)*0.220826025375354 + 59.963689812117) 
   + (AddressLong BETWEEN 30.3201198577881 AND 30.3249263763428 AND AddressLat < (AddressLong-30.3249263763428)*-0.250260083143792 + 59.9649786603028) 
     OR ((AddressLong BETWEEN 30.3190898895264 AND 30.3201198577881 AND AddressLat < (AddressLong-30.3201198577881)*2.41922786513137 + 59.9661815400359) 
   + (AddressLong BETWEEN 30.3190898895264 AND 30.3249263763428 AND AddressLat < (AddressLong-30.3190898895264)*0.220826025375354 + 59.963689812117) 
   + (AddressLong BETWEEN 30.3201198577881 AND 30.3249263763428 AND AddressLat < (AddressLong-30.3249263763428)*-0.250260083143792 + 59.9649786603028) ) % 2 = 1


ругается на плюсы между скобками: Incorrect syntax near '+'
12 дек 13, 15:12    [15283077]     Ответить | Цитировать Сообщить модератору
 Re: Попадает ли точка в заданную область  [new]
Glory
Member

Откуда:
Сообщений: 104751
Semyglass
ругается на плюсы между скобками: Incorrect syntax near '+'

Вы собрались складывать между собой BETWEEN-ы ?
12 дек 13, 15:22    [15283165]     Ответить | Цитировать Сообщить модератору
 Re: Попадает ли точка в заданную область  [new]
Semyglass
Member

Откуда: Санкт-Петербург
Сообщений: 407
Glory
Semyglass
ругается на плюсы между скобками: Incorrect syntax near '+'

Вы собрались складывать между собой BETWEEN-ы ?

Собственно в этом и вопрос. Что имелось в виду в первоисточнике? Там именно складываются BETWEEN-ы, но этот запрос для MySQL.

Мой вопрос, как этот запрос преобразовать для MSSQL?
12 дек 13, 15:27    [15283216]     Ответить | Цитировать Сообщить модератору
 Re: Попадает ли точка в заданную область  [new]
Glory
Member

Откуда:
Сообщений: 104751
Semyglass
Что имелось в виду в первоисточнике?

Спросите автора ? Или почитать документацию MySQL ?

Semyglass
Мой вопрос, как этот запрос преобразовать для MSSQL?

Наш вопрос - а что должен делать это запрос

Сообщение было отредактировано: 12 дек 13, 15:29
12 дек 13, 15:29    [15283226]     Ответить | Цитировать Сообщить модератору
 Re: Попадает ли точка в заданную область  [new]
Semyglass
Member

Откуда: Санкт-Петербург
Сообщений: 407
Glory
Semyglass
Что имелось в виду в первоисточнике?

Спросите автора ? Или почитать документацию MySQL ?

Semyglass
Мой вопрос, как этот запрос преобразовать для MSSQL?

Наш вопрос - а что должен делать это запрос


Запрос должен выбирать строки из таблицы ObjectWeb координаты которых попадают в заданный многоугольник
12 дек 13, 15:49    [15283389]     Ответить | Цитировать Сообщить модератору
 Re: Попадает ли точка в заданную область  [new]
Glory
Member

Откуда:
Сообщений: 104751
Semyglass
Запрос должен выбирать строки из таблицы ObjectWeb координаты которых попадают в заданный многоугольник

https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume п.4 и п.6
12 дек 13, 15:52    [15283410]     Ответить | Цитировать Сообщить модератору
 Re: Попадает ли точка в заданную область  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
в MySQL допускаются операции над операторами сравнения, т.к. результатом проверки условия являются либо 1 либо 0.
Т.е. (A>0)+(B<10) => (case when A>0 then 1 else 0 end)+(case when B<10 then 1 else 0 end)
12 дек 13, 16:56    [15283765]     Ответить | Цитировать Сообщить модератору
 Re: Попадает ли точка в заданную область  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Semyglass,

если версия MSSQL позволяет, используйте тип GEOGRAPHY и функции для работы с этим типом.
Ваша задача решается одним SELECTом, причём для эллипсоидальной модели поверхности Земли,
то есть с большой точностью.
12 дек 13, 17:06    [15283815]     Ответить | Цитировать Сообщить модератору
 Re: Попадает ли точка в заданную область  [new]
Semyglass
Member

Откуда: Санкт-Петербург
Сообщений: 407
iap,

Спасибо! все получилось!
12 дек 13, 17:26    [15283941]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить