Выполнил эту же программу под ГИС Карта 2008. Запуск из меню Задачи\Запуск приложений в виде задачи mapexam.dll.
Центром области выбрал точечный объект и расширил область поиска.
Найдено два площадных объекта.
Текст программы ниже.
/****** MAPEXAM.CPP ************ Belenkov O.V. ****** 21/12/08 ***
* *
* Copyright © PANORAMA Group 1991-2008 *
* All Rights Reserved *
* *
********************************************************************
* *
* FOR WINDOWS95 & WINDOWS NT *
* *
********************************************************************
* *
* ПРИМЕР ТЕСТОВОЙ ПРОГРАММЫ,ЗАПУСКАЕМОЙ ИЗ "ПАНОРАМЫ" *
* *
*******************************************************************/
// Эта программа демонстрирует способ разработки задач
// конвертирования, сбора статистики, анализа данных,
// построения матриц, подготовки отчетов и т.п.
// Подобная программа может быть подготовлена в Borland C++,
// Builder C++, Visual C++, Delphi и других средах программирования
// Для отладки такой программы ее необходимо оттранслировать
// "под debugger" и переименовать в "MAPEXAM.DLL"
// Эта DLL будет доступна для отладки сразу после запуска
// системы "ПАНОРАМА"
// Подробнее о написании приложения смотрите MAPAPI.DOC
#include "mapapi.h" // В Delphi ппрототипы функций описываются отдельно
#include "logapi.h"
// --------------------------------------------------------------
// Обязательная подпрограмма
// --------------------------------------------------------------
extern "C"
{
long int _export WINAPI GetInterfaceVersion()
{
// return MAPACCESSVERSION; // Для программ,использующих классы
// библиотеки MAPACCES.DLL
return 0; // Если используется только "MAPAPI"
// интерфейс
}
}
// typedef struct TASKPARM // ПАРАМЕТРЫ ПРИКЛАДНОЙ ЗАДАЧИ
// {
// long int Language; // Код языка диалогов (1 - ENGLISH,
// // 2 - RUSSIAN, ...)
// HINSTANCE Resource; // Модуль ресурсов для Panorama.exe
// const char* HelpName; // Полное имя файла ".hlp" для Panorama.exe
// const char* IniName; // Полное имя файла ".ini" для Panorama.exe
// const char* PathShell; // Каталог приложения (exe,dll,...)
// const char* ApplicationName; // Имя приложения ("Panorama")
// HWND Handle; // Идентификатор главного окна приложения
// }
// TASKPARM;
int CallApplication(HMAP hmap, HWND handle);
// --------------------------------------------------------------
// Точка входа в задачу
// --------------------------------------------------------------
extern "C"
{
long int _export WINAPI CallMapFunctionEx(long int hmap, TASKPARMEX * parm)
{
if ((hmap == 0) || (parm == 0)) return 0;
return CallApplication((HMAP)hmap, parm->Handle);
}
}
// --------------------------------------------------------------
// Собственно задача
// --------------------------------------------------------------
int CallApplication(HMAP hMap, HWND handle)
{
::MessageBox(0, "Начнем проверку !", "Тест mapWhatObjectBySelect на Подольске", MB_OK);
HSELECT hselect = mapCreateMapSelectContext( hMap );
mapSelectLocal(hselect,-1,0); /* выключение всех объектов */
mapSelectLocal(hselect,1,1); /* включение только площадных */
//создание объекта для поиска
HOBJ info2 = mapCreateObject( hMap, 1, 0x7FFC7FFC, 0 );
// задание поиска в первой точки (прокалывание карты на поиск объектов)
DFRAME MAPDFRAME;
// Расширим область поиска, чтоб больше лишнего захватить
// Координаты объекта 16799922 (точечный) на карте Подольск
MAPDFRAME.X1 = 6153486.571 - 300;
MAPDFRAME.Y1 = 7435548.520 - 300;
MAPDFRAME.X2 = 6153486.571 + 300;
MAPDFRAME.Y2 = 7435548.520 + 300;
int count = 0;
int flagend = 0;
do
{
if( count == 0 )
{
// поиск первого объекта в прямоугольной области
flagend = mapWhatObjectBySelect( hMap, info2, &MAPDFRAME, hselect, WO_FIRST, PP_PLANE );
}
else
{
// поиск последующих обьектов в прямоугольной области
flagend = mapWhatObjectBySelect( hMap, info2, &MAPDFRAME, hselect, WO_NEXT, PP_PLANE );
}
count = count + 1;
if( flagend != 0 )
{
int kod_info2 = mapObjectExcode( info2 );
int kod_local = mapObjectLocal( info2 );
char message[300];
char local[80];
switch(kod_local)
{
case LOCAL_SQUARE :
strcpy(local, "ПЛОЩАДНОЙ");
break;
case LOCAL_LINE :
strcpy(local, "ЛИНЕЙНЫЙ");
break;
case LOCAL_POINT :
strcpy(local, "ТОЧЕЧНЫЙ");
break;
default:
strcpy(local, "ВСЕ РАВНО НЕ ТО!");
break;
}
sprintf(message, "Найден объект, код = %i, локализация = %s", kod_info2, local);
::MessageBox(0, message, "Тест mapWhatObjectBySelect на Подольске", MB_OK);
}
else
{
::MessageBox(0, "Нет тут ничего !", "Тест mapWhatObjectBySelect на Подольске", MB_OK);
}
}
while( flagend != 0 );
//Удаление контекста выбора слоев
mapClearSelectContext( hselect );
//Удаление объектов поиска
mapFreeObject( info2 );
return 0;
}