| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Попадание точки в многоугольник |
| Автор: Vardoulacha 20.4.2015, 14:58 |
| Добрый день, уважаемые. Помогите советом, ищу решение. Есть точка с координатами (на карте), есть некая область, область замкнутая, задана координатами своих вершин, область может быть любой не только выпуклой. Нужно все лишь понять находится ли точка внутри области. При этом точка не может быть на краю области, она обязательно или внутри или снаружи, иного не дано. Может есть какой сервис. который принимает на себя точку и координаты многоугольника и выдает ответ, в Яндекс картах есть такой модуль, но он работает только через JS (( Перерыл множество алгоритмов, но они все мне возвращают 0 (т.е. моя точка находится вне области, хотя я данные взял) |
| Автор: sQu1rr 20.4.2015, 15:31 |
| http://en.wikipedia.org/wiki/Point_in_polygon |
| Автор: Vardoulacha 20.4.2015, 16:41 |
| Спасибо, почитаю, а так я кажется понял почему те решения что я нашел не работали, оказывается API Яндекс.Карты работают очень забавно, координаты которые они возвращают через функцию геокодирования никак не подписаны и непонятно где широта, а где долгота, в мануале черт ногу сломит, теперь надо по полочкам разобрать те скрипты, которые нашел и понять где там широта и долгота, похоже в этом причина Смогу это сделать только в среду, надеюсь прокатит ) Отпишу потом здесь решение |
| Автор: ksnk 21.4.2015, 12:30 | ||||
Для исходных координат, обычно, где широта где долгота - известно. Так что не просто повернуто, но и еще смещено непонятно куда C Яндексом смешно. В своих примера он, например, по запросу `http://geocode-maps.yandex.ru/1.x/?&geocode=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0,+%D0%A2%D0%B2%D0%B5%D1%80%D1%81%D0%BA%D0%B0%D1%8F+%D1%83%D0%BB%D0%B8%D1%86%D0%B0,+%D0%B4%D0%BE%D0%BC+7` выдает координатный прямоугольник
Смех начинается, когда вводишь эту пару в сами yandex.карты в окне параметров. Попадаем в кудато в Иране:crazy |
| Автор: sQu1rr 21.4.2015, 16:25 | ||||
Ввел верхнюю координату в гугл мапс, попал в иран, ввел поменяв широту и долготу попал в москву, около арбатской, близко
Не понял, втупился, можно поподробнее? |
| Автор: ksnk 21.4.2015, 17:04 | ||
Это я про то, что и сам yandex порядок своих координат путает... Или это фича такая, но выглядит забавно. ;) Да, действительно, в условиях задачи все кооринаты уже сразу заданы, так что севису яндекса, в этом случае, действительно порядок не должен помешать. Вот если бы из geoip бызы выковыривать координаты, был бы шанс... |
| Автор: Vardoulacha 22.4.2015, 05:47 |
| Дак да я как раз с этим и столкнулся, меняем местами координаты и яндекс отображает правильно, сейчас разбираюсь в каком порядке где что находится UPDATE Ну вот, разобрался Инструмент яндекса где методом перетаскивания карты можно найти координаты центра карты http://dimik.github.io/ymaps/examples/location-tool/ порядок координат: широта, долгота 58.00752223, 56.23485616 Геокодер по адресу http://geocode-maps.yandex.ru/1.x/?geocode=... порядок координат: долгота, широта 56.235202, 58.007308 Функция установки точки ymaps.GeoObject() порядок координат: широта, долгота Функция получения координат области myPolygon.geometry.getCoordinates() порядок координат: широта, долгота Ну вот, все сложилось 1. я в редакторе строю область, получаю по ней координаты всех вершин в формате: широта, долгота 2. сервисом геокодера по адресу нахожу точку и получаю координаты в формате: долгота, широта 3. алгоритмом пытаюсь определить входит точка в область или нет Конечно же не входит и никогда не войдет )) Получается надо всего лишь у точки координаты местами поменять и все прокатит )) ушел проверять. UPDATE2 В мануале по геокодеру написано следующее "Независимо от значения этого параметра в ответе геокодера координаты всегда будут возвращаться в последовательности «долгота широта»." и написано это в параметре sco (только для обратного геокодирования) в разделе "Необязательные параметры" Во первых это необязательный параметр, во вторых это для обратного геокодирования нужно, а у меня прямое, вот я и не прочитал полностью описание этого пункта, а кто писал мануал могли бы и написать в результирующих данных. Вот API карт и метрики прям земля и небо, в метрике все подробно расписано разжевано, а тут тяп ляп на коленке собрано ) |
| Автор: Vardoulacha 27.4.2015, 05:58 | ||||||||||||||||||
| Уважаемые модераторы, можно немножко нарушу правила и сделаю два поста подряд, а то длинная портянка будет и по логике они разные. Итак, все три найденных функции успешно справились с задачей после того как я поменял координаты точки местами. Приведу здесь все три функции и примеры их работы, вдруг кому пригодится да и есть из чего выбрать, но они все рабочие и выдают один и тот же результат. Начнем с исходных данных Есть массив в котором адреса привязаны к почтовым индексам
Есть массив областей данного почтового индекса, индекс разделен на несколько областей, в данном случае на две, необходимо определить какой адрес в какую область попадает
Здесь представлю код который делает перебор и поиск данных, словом ФУНКЦИЯ представлен код примера определенной функции, смотреть ниже
Теперь перейдем к функциям поиска в областях Функция №1
Пример использования функции №1 Самая простая и удобная в использовании
Функция №2
Пример использования функции №2 Эта функция какая-то слишком замудреная
Функция №3
Пример использования функции №3
Результат работы всех трех функций приведу одним примером, все функции возвращают одно и то же 614065 = Пермский край, город Пермь, шоссе Космонавтов, д. 166 = |0||1| 614065 = Пермский край, город Пермь, ул. Мира, д. 115 = |1||0| Как видно первый адрес попал во вторую область, а второй адрес в первую, все верно, так и должно быть |