Клуб API Карт

Определение региона в котором лежит точка, без отображения регионов

Пост в архиве.

Здравствуйте. Передо мной стоит задача определять регион по координатам точки.

1. Нашел инструкцию о том, как определить, в каком регионе находится точка:

http://clubs.ya.ru/mapsapi/replies.xml?item_no=40598 

Но эта инструкция мне не подходит, так как в ней регионы добавляются на карту, что мне вовсе не нужно. Я пробовал экспериментировать, но регионы отказываются проверять принадлежит ли им точка, если они не добавлены на карту. Ругаются...

2. Пытаясь решить эту проблему, я нашел вот такой метод добавления полигонов на карту в виде геометрии: http://clubs.ya.ru/mapsapi/replies.xml?item_no=40825

Но я не могу понять как воспользоваться этим методом в отношении регионов, ведь регион состоит из нескольких полигонов, часть из которых внешние, а часть - внутренние, причем для регионов эти термины - "внутренние" и "внешние" вообще непонятно что обозначают. Например, я пробовал выдернуть из полигонов все их ГЕО-точки, и построить полигоны по ним с помощью скрипта. Получался очень странный результат. Часть регионов ограничены только внешними полигонами, а часть - только внутренними. То есть, не получается представить Регион в виде простого полигона, по которому можно было бы проверить, принадлежит ли ему точка. Изначально я хотел сделать примерно как в этой статье: 

http://www.pvsm.ru/gps/6855

То есть просто скачать себе все координаты границ регионов и проверять какому региону принадлежит точка на сервере - не нагружая ни браузер клиента, ни сервер яндекса дополнительной работой, но именно непонятная природа геометрии региона поставила крест на этой задумке.

Хотел бы попросить о помощи:

1) Было бы здорово, если кто-нибудь сможет подсказать как, без особых танцев с бубном, по полученному с помощью функции regions.load списку регионов определять к какому из них принадлежит точка, НЕ добавляя их на карту визуально (то есть, если можно их добавить на карту так чтобы с ними нельзя было взаимодействовать и видеть их - было бы идеально)

2) Еще лучше и интереснее было бы узнать о таинственной природе геометрии регионов. Если вы мне не верите на счёт абсолютной непонятности того как конструируются регионы из полигонов, я постараюсь найти в дебрях моей машины скрипт который я написал для экспериментов и который рисовал картинку с изображением этих полигонов в большом разрешении, при чем "внутренние" полигоны рисовались только красным цветом, а внешние - только синим, в результате, часть регионов нарисована только красными линиями, а часть - только синими. Если же отключить рисование какого-то вида полигонов, то большАя часть регионов становится прорисованной только с одной стороны, либо не прорисованной вообще.

3) Если у кого-то есть решение или идеи по поводу того как организовать определение региона на сервере а не в браузере - я был бы очень благодарен. На мой взгляд, в браузере точное определение расположения точки будет довольно тормозным, и серверный вариант был бы намного лучше...

 

Спасибо за то, что попытались думать в направлении моего вопроса :)

15 комментариев

регионы приходят в коллекции,

переберите эту коллекцию, сохраняя ссылки на геометрии полигонов в отдельном объекте/массиве и проставляя им карту и родительские опции (как по той ссылке что вы привели)

Затем перебирая ваше хранилище проверяйте попадание точки в геометрию полигона с помощью метода геометрии contains

Извиняюсь, сначала ответил не от того аккаунта а потом не сразу понял что можно удалять ответы :)

 

Спасибо за ответ :) Правильно ли я понимаю, что "геометрия" сама поймет как ей разрулить ситуацию со сложной конструкцией из "внешних" и "внутренних" полигонов составляющих Регион, и просто даст ответ на вопрос "лежит ли внутри точка"?

Заодно хотел спросить: насколько быстрой или медленной будет такая реализация поиска в браузере? Ведь если загрузить регионы с максимальным качеством, то там местами десятки тысяч точек. 

 

да, сама поймет.

не знаю, попробуйте, должно быть приемлемо.

Может Вам лучше геокодер использовать, обратное геокодирование с kind=locality?

Сколько точек нужно проверять?

 

Точек не много, пользователь ставит точку, или передвигает её - и должен вычисляться её регион и отправляться на сервер. А у меня и так уже при передвижении точки - запрос на сервер чтобы передвинуть точку, запрос к Яндексу - геокодирование чтобы узнать адрес, запрос к Яндексу на построение маршрута, запрос на сервер с передачей ему длины маршрута и выясненного адреса - уже 4 запроса на одно перемещение, я надеялся что хотя-бы с определением области не придется еще один запрос делать :)

Да, и вроде kind=locality мне даже при экспериментах с тыканьем мышкой давал не всегда подходящие результаты, а мне надо именно регион определить, так как город я уже и так на сервере определяю по географическим координатам ограничивающего прямоугольника 

Кстати на сервере можно попробовать использовать это

Спасибо, судя по описанию неплохая библиотека географических вычислений. Чуть позже наверняка понадобится, а пока же я делаю простые топорные вычисления типа "принадлежит ли точка прямоугольнику ограничивающему город" или "принадлежит ли точка региону"

Ваш вариант полностью подошел, спасибо :)

Удалось реализовать поиск региона в браузере. Не подскажите, как сюда запостить кусок кода для потомков, чтобы он более-менее по-человечески выглядел? Желательно чтобы он был свёрнут, а при нажатии разворачивался, как здесь: http://clubs.ya.ru/mapsapi/replies.xml?item_no=40825 

в визивиге есть кнопка "вставить врезку"

вообще лучше на гитхаб выкладывать и постить ссылку

Ок, выложил на гитхабе, вот ссылка на пример: http://mihanentalpo.github.io/ymaps-experiments/getRegionByCoords/region.html

Добавь  в HEAD

А то сейчас все русские буквы - кракозябрами

Точно, совсем забыл про кодировку, спасибо :)

Обновил.

Еще один вопрос на ту же тему. Можно ли с уверенностью утверждать, что если точка не была найдена ни в одном из регионов - значит она не находится в России? (Ну или другой стране, для которой загружены регионы). Есть ли способ по координатам точки определить страну в которой она находится? геокодер с kind=locality не всегда работает, я находил в России места, где он вообще ничего не возвращает. При этом, если я открою обычную яндекс-карту и кликну в этом месте - ответ="Россия"

Наверное теоретически можно попасть в стык между регионами.

Кстати, в твоем примере при первом клике всегда получаю:

"Вы кликнули на регионе:Неизвестный, его osmId=0"

Все последующие клики работают нормально.

Странно... Я проверял в разных браузерах, у меня все работает сразу. Видимо если кликнуть до того как регионы загрузятся - так и происходит. Добавил надпись - прелоадер, если кликнуть пока она гласит "Идет загрузка" - то и правда выдаёт "Неизвестный osmId=0".

http://mihanentalpo.github.io/ymaps-experiments/getRegionByCoords/region.html

А на счёт определения страны по координатам я нашел решение - брать из геокодера description точки и отрезать от него всё что до первой запятой написано. Работает почти всегда.

Огромное спасибо за этот пример! Прям выручили, не знал уже что и делать с этими osmid....