Проверили Вашу карту на примере, входящем в GIS ToolKit Active 12 (пример FindObj). Объекты, в том числе, графические отображаются без проблем.
Для того, чтобы визуализация соответствовала отображению карты в Панорама Мини, требуется установить такой же режим отображения карты (в Панорама Мини по умолчанию это принтерный растровый вид).
Пример показывает карту в векторном виде. Для установки принтерного растрового вида надо будет добавить такую строчку:
Без установки режима будет по умолчанию применен векторный вид, и выглядит Ваша карта с таким режимом вот так:
Приложенный архив карты не имеет классификатора. Пришлось подложить другой, переименовав его в требуемый "classifier.rsc". Также в составе нет файла семантики. Однако это не должно влиять на отображение.
Валерий Валериевич написал: Может быть что вы на более новой версии работаете?
Не могу ответить на этот вопрос, так как Вы не указали свою версию. Мы всегда рекомендуем нашим пользователям следить за обновлениями на нашем сайте. Инсталляция GIS ToolKit Active обновляется периодически, но не так часто как сборки ГИС-ядра. И то, и другое Вы можете свободно скачивать с нашего сайта. Отличие есть только для версии Free - библиотеки для нее Вы можете также свободно скачивать с сайта, а инсталляцию необходимо запрашивать в службе техподдержки.
При обнаружении каких-либо проблем рекомендуется сначала обновиться до крайней версии с сайта, и, если проблема остается на новой версии GIS ToolKit Active и библиотек ГИС-ядра, тогда обращаться за помощью на форум, так как мы всегда проверяем проблему на крайних версиях продукта и можем не получить тех же результатов, что у Вас.
Библиотеки ГИС-ядра для GIS ToolKit 12, GIS ToolKit Free 12, GIS ToolKit Active 12, GIS ToolKit Free Active 12 (всегда самая свежая версия тут):
Валерий Валериевич написал: Может что-то после mapRegisterDrawObject еще надо добавить?
Для проверки мы использовали Вашу карту. Да и у Вас в Панорама Мини она отображается с графическими объектами. Соответственно, все объекты зарегистрированы корректно.
Может в компоненте как-то объединять набор слоев? Чтобы -1 корректно работал.. а сейчас такое ощущение что он просто для каждого слоя применяет критерии отбора по номеру слоя, не зависимо есть он у сита или нет.
Валерий Валериевич написал: Может в компоненте как-то объединять набор слоев? Чтобы -1 корректно работал.. а сейчас такое ощущение что он просто для каждого слоя применяет критерии отбора по номеру слоя, не зависимо есть он у сита или нет.
Не совсем понял суть замечания.
Метод aiMapSelect.SetViewSelect выполняет установку настроенных в нем условий отображения объектов для карты с заданным номером, если он равен -1, то устанавливаются условия для всех открытых в axcMapView карт. То, что у какой-то из карт, какое-то условие не выполняется в силу отсутствия в ней того, к чему эти условия можно применить, никак не должно влиять на логику работы. Иными словами, если Вы задали таким образом условия для axcMapView в целом, чтобы отображался, например, только слой гидрографии, то отображаться будет только слой гидрографии. Не смотря на то, что в составе есть карты, в которых этой гидрографии и в помине нет, а есть, скажем, растительность, они будут также подчиняться общему правилу - не отображать ничего, кроме гидрографии.
Помогите, пожалуйста, разобраться с поиском объектов не из классификатора на сите. Вот этот код находит только точечный объект (он из классификатора), а остальные объекты не находятся. Если точечных объектов несколько - то находятся все они, но только они.
А так же ткните носом, пожалуйста, в функцию аналогичную mapSeekSiteSelectObject но чтобы найти все объекты в точке.. я нашел mapSeekSelectNearestObject но там вроде как флаги WO_NEXT не работают.. или может как-то hSel добавить условие поиска вокруг какой-то точки... суть задачи найти все объекты на сите в радиусе 3-5 метров (пикселей)
Валерий Валериевич написал: Помогите, пожалуйста, разобраться с поиском объектов не из классификатора на сите. Вот этот код находит только точечный объект (он из классификатора), а остальные объекты не находятся. Если точечных объектов несколько - то находятся все они, но только они.
В контексте поиска должен быть установлен соответствующий флаг для поиска графических объектов:
Цитата
// Установить признак отбора графических объектов по обобщенным условиям поиска // hselect - условия поиска/отображения // flag = 0 - отбор по "общему" фильтру, // 1 - отобрать только графические объекты, // 2 - не отбирать графические объекты.
Валерий Валериевич написал: А так же ткните носом, пожалуйста, в функцию аналогичную mapSeekSiteSelectObject но чтобы найти все объекты в точке.. я нашел mapSeekSelectNearestObject но там вроде как флаги WO_NEXT не работают.. или может как-то hSel добавить условие поиска вокруг какой-то точки... суть задачи найти все объекты на сите в радиусе 3-5 метров (пикселей)
В контекст поиска можно добавить условие поиска по прямоугольной области. Если речь идет про точку клика по карте, то это по сути +/- пиксел во все стороны от клика.
Цитата
// Установить в контексте параметры поиска объектов по прямоугольной // области. // hselect - контекст поиска объектов // dframe - габариты области поиска в метрах // distance - расстояние поиска в метрах // флажки,описывающие критерии поиска : // filter - учитывать/не учитывать(1/0) фильтр объектов // (параметры фильтра должны быть установлены заранее // в контексте поиска) // inside - границы поиска объектов по области : // 1 - внутри области, 2 - целиком внутри области, // 0 - по расстоянию. // visible - с учетом/без учета(1/0) видимости объектов на карте // action - порядок поиска объектов : // 0 - последовательный поиск по мере запроса объектов, // 1 - предварительный отбор всех объектов (главному // окну приложения посылается WM_PROGRESSBAR - maptype.h), // ускоряет многократный запрос отобранных объектов; // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapSelectSeekAreaFrame(HSELECT hselect, DFRAME *dframe, double distance = 0.0, long int filter = 0, long int inside = 1, long int visible = 0, long int action = 0);
Если нет необходимости добавлять ограничение по области непосредственно в контекст поиска, а просто перебрать их в точке с учетом условий поиска, то можно воспользоваться функцией
Цитата
// Поиск объектов в окрестности точки, заданной прямоугольной рамкой, // удовлетворяющих условиям поиска // Поиск выполнется среди тех объектов,которые // соответствуют условиям, заданным в HSELECT // hMap - идентификатор открытой карты. // info - идентификатор объекта в памяти, // предварительно созданного функцией mapCreateObject() // или mapCreateSiteObject(), // в котором будет размещен результат поиска. // frame - прямоугольная область поиска объекта в системе координат, // заданной переменной place (PP_PLANE,PP_GEO, ...) // select- контекст условий выбора объектов, // flag - порядок поиска объектов (WO_FIRST, WO_NEXT...) // Выбор объекта в "точке" лучше начинать с последнего, то // есть того, что нарисован поверх остальных (это чуть медленнее // прямого поиска). При поиске с флажками WO_NEXT,WO_BACK параметр // info должен содержать результат предыдущего поиска. // place - система координат, // Если объект не найден - возвращает ноль _MAPIMP HOBJ _MAPAPI mapWhatObjectBySelect(HMAP hMap,HOBJ info, MAPDFRAME * frame, HSELECT select, long int flag , long int place);
Если требуется обработать только точечные объекты, то можно использовать функцию поиска точечных объектов на заданном удалении от заданной точки (не учитывает условия поиска):
Цитата
// Найти точечный объект на заданной карте в окрестности заданной // точки // hMap - идентификатор открытого документа (карты), // hSite - идентификатор открытой в документе пользовательской карты, // info - идентификатор существующего объекта, // в котором будет размещен результат поиска; // point - координаты точки в метрах в системе координат документа, // distance - радиус области поиска в метрах (от 1 мкм до метров) // visible - флаг поиска только среди видимых на карте объектов // При ошибке возвращает 0
_MAPIMP long int _MAPAPI mapSeekPointObjectByDistance(HMAP hmap, HSITE hsite, HOBJ info, DOUBLEPOINT *point, double distance, long int visible = 0);
Если на карте только точечные объекты то все ищет отлично. Единственное не на всех масштабах находит. Если есть эти мои уже излюбленные квадратики(их тыщи полторы на сите).. то зависает на mapSeekSiteSelectObject не выдав ни одного каута в консоль. Так же зависает на запросе количества найденных объектов mapSeekSiteSelectCount( mapHandle(), hsite, hSel ) Подскажите, пожалуйста, чего не хватает?
И по масштабу (в примере +-50).. у меня PointX, PointY в прямоугольной системе (PP_PICTURE)... Как габариты области поиска устанавливать правильно в зависимости от масштаба?
Валерий Валериевич написал: Если на карте только точечные объекты то все ищет отлично. Единственное не на всех масштабах находит.
Поиск может осуществляться как с учетом видимости, так и без. Если у Вас объекты имеют определенный масштабный ряд отображения, а искать надо на всех масштабах или наоборот - только на тех, где объекты видны, то надо корректно установить значение visible - с учетом/без учета(1/0) видимости объектов на карте при вызове mapSelectSeekAreaFrame.
Также влияет корректность установки "рамки" поиска в mapSelectSeekAreaFrame.
Цитата
// Установить в контексте параметры поиска объектов по прямоугольной // области. // hselect - контекст поиска объектов // dframe - габариты области поиска в метрах // distance - расстояние поиска в метрах // флажки,описывающие критерии поиска : // filter - учитывать/не учитывать(1/0) фильтр объектов // (параметры фильтра должны быть установлены заранее // в контексте поиска) // inside - границы поиска объектов по области : // 1 - внутри области, 2 - целиком внутри области, // 0 - по расстоянию. // visible - с учетом/без учета(1/0) видимости объектов на карте // action - порядок поиска объектов : // 0 - последовательный поиск по мере запроса объектов, // 1 - предварительный отбор всех объектов (главному // окну приложения посылается WM_PROGRESSBAR - maptype.h), // ускоряет многократный запрос отобранных объектов; // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapSelectSeekAreaFrame(HSELECT hselect, DFRAME *dframe, double distance = 0.0, long int filter = 0, long int inside = 1, long int visible = 0, long int action = 0);
"Рамка" задается в метрах, поэтому никаких дополнительных обработок для текущего масштаба не требуется.
Вот так делать не стоит:
Цитата
hObj = mapSeekSiteSelectObject
Вам надо контролировать возвращаемой значение от функции, но не устанавливать его в переменную, в которую Вы записали указатель выделенного в памяти объекта mapCreateSiteObject. В противном случае, дойдя поиском до конца, Вы получите в этой переменной NULL. Выделенную память в mapCreateSiteObject необходимо освобождать по окончании работы с ней - mapFreeObject.