Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Критик Member Откуда: Москва / Калуга Сообщений: 34760 Блог |
Semyglass, алгоритмы по "Задача о принадлежности точки многоугольнику" - ищется в вики на раз-два из запроса попробуйте убрать LIMIT 50, или приведите сообщение об ошибке |
12 дек 13, 15:07 [15283033] Ответить | Цитировать Сообщить модератору |
wizli Member Откуда: Minsk Сообщений: 270 |
MsSQL его не воспринимает, потому что это не синтаксис t-sql. Уберите limit 50 и поставьте в начале запросе select top (50) id, x_coord, y_coord FROM point WHEREи т.д. И если честно я не до конца понял значение этой фразы
|
||||
12 дек 13, 15:07 [15283038] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вы собрались складывать между собой BETWEEN-ы ? |
||
12 дек 13, 15:22 [15283165] Ответить | Цитировать Сообщить модератору |
Semyglass Member Откуда: Санкт-Петербург Сообщений: 407 |
Собственно в этом и вопрос. Что имелось в виду в первоисточнике? Там именно складываются BETWEEN-ы, но этот запрос для MySQL. Мой вопрос, как этот запрос преобразовать для MSSQL? |
||||
12 дек 13, 15:27 [15283216] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Спросите автора ? Или почитать документацию MySQL ?
Наш вопрос - а что должен делать это запрос Сообщение было отредактировано: 12 дек 13, 15:29 |
||||
12 дек 13, 15:29 [15283226] Ответить | Цитировать Сообщить модератору |
Semyglass Member Откуда: Санкт-Петербург Сообщений: 407 |
Запрос должен выбирать строки из таблицы ObjectWeb координаты которых попадают в заданный многоугольник |
||||||
12 дек 13, 15:49 [15283389] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume п.4 и п.6 |
||
12 дек 13, 15:52 [15283410] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
Semyglass, если версия MSSQL позволяет, используйте тип GEOGRAPHY и функции для работы с этим типом. Ваша задача решается одним SELECTом, причём для эллипсоидальной модели поверхности Земли, то есть с большой точностью. |
12 дек 13, 17:06 [15283815] Ответить | Цитировать Сообщить модератору |
Semyglass Member Откуда: Санкт-Петербург Сообщений: 407 |
iap, Спасибо! все получилось! |
12 дек 13, 17:26 [15283941] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |