На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Как реализовать обратный геокодинг

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Как реализовать обратный геокодинг
 
Как можно сделать обратный геокодинг средствами "Панорамы", т.е. чтобы по заданным геокоординатам возвращался адрес (город, улица, дом, ...) ближайшего объекта.
 
на каком языке программирования ?
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
c#
 
Для того, чтобы получить адрес в точке карты, необходимо иметь в этой точке на карте объект. У этого объекта должна быть информация об адресе.
Ваша задача сводится к тому, чтобы в заданной точке найти объект и считать из него адресную информацию.
Скорее всего, адресная информация будет содержаться в семантических характеристиках объекта.

подробно и обо всех API-функциях работы с картографией "Панорама" тут - http://help.gisinfo.ru/

Вызов API описывается стандартно для C# - через
Код
[DllImport("GISACCESS.DLL", CharSet = CharSet.Ansi)]


Пример для С#, где есть модуль с описанием вызова многих API-функций, а также с описанием большинства используемых структур, можно скачать тут - http://gistoolkit.ru/download/mapview2005.zip

Для поиска объекта в точке и перебора найденных в этой точке объектов советую использовать функцию
Код
 // Поиск объектов в окрестности точки, заданной прямоугольной рамкой,
 // удовлетворяющих условиям поиска
 // hMap - идентификатор открытой карты.
 // info - идентификатор объекта в памяти,
 //        предварительно созданного функцией mapCreateObject()
 //        или mapCreateSiteObject(),
 //        в котором будет размещен результат поиска.
 // Поиск выполнется среди тех объектов,которые
 // соответствуют условиям HSELECT !
 // select- контекст условий выбора объектов,
 // place - система координат,
 // frame - прямоугольная область поиска объекта в системе координат,
 //         заданной переменной place (PP_PLANE,PP_GEO, ...)
 // flag  - порядок поиска объектов (WO_FIRST, WO_NEXT...)
 // Выбор объекта в "точке" лучше начинать с последнего, то
 // есть того, что нарисован поверх остальных (это чуть медленнее
 // прямого поиска).
 // При поиске с флажками WO_NEXT,WO_BACK параметр info должен
 // содержать результат предыдущего поиска.
 // Если объект не найден - возвращает ноль,
 // иначе - возвращает значение info !

_MAPIMP HOBJ _MAPAPI mapWhatObjectBySelect(HMAP hMap,HOBJ info,
MAPDFRAME * frame,
HSELECT select,
long int flag, long int place);


Обращаю Ваше внимание на то, что при описании вызова API-функций для переменных, являющихся в ГИС-ядре указателями на соответсвующие классы, следует использовать тип данных C# - IntPtr.
Это все переменные, обозначенные как (H)-HANDLE - HMAP, HSITE, HOBJ, HSELECT... Это позволит избежать разногласий при работе на 32 и 64 разрядных ОС.

Алгоритм:
1.открыть карту - mapOpenData - получим hMap
2.создать пустой объект - mapCreateObject - получаем hObj
3.создать контекст условий для поиска и, при необходимости, его заполнить (например искать только среди объектов определнного слоя и локализации) - mapCreateMapSelectContext - получим hSelect
4.определям габариты рамки для поиска объекта (в данном случае точка + дельта) - заполняем MAPDFRAME
5.в цикле перебираем найденные объекты в заданной точке, пока не найдем нужный или они не кончатся - вызов фунции mapWhatObjectBySelect, куда передаем все нажитое непосиьным трудом в пунктах 1-4, указываем при этом флаги WO_FIRST - для первой итерации и далее WO_NEXT, а также формат координат, в котором представлен район поиска (метры, радианы, пикселы...).
6.у найденного объекта (он будет помещен в hObj) считываем необходимые семантические характеристики - mapSemanticValue (или mapSemanticValueUn - для юникода).
7.освобождаем память (ибо сборщики мусора тут бессильны - это неуправляемый АПИ) - mapFreeObject и т.д. - для всего что насоздавали.
Изменено: Денис Вицко - 27.05.2010 19:47:46
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности