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

Александр Кружков (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Александр Кружков
Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 ... 138 139 140 141 142 143 144 145 146 147 148 След.
создание слоя
 
MapExp->MapView1->MapHandle - это не HRSC
Отображение карты с большим масштабом
 
Для объектов классификатора Topo200t.rsc (входит в стандартную инсталляцию ГИС "Карта 2008") установлены границы видимости от масштаба 1:1 до масштаба 1:1000000. Начиная с масштаба 1:1000001 отображение объектов отключается. Для расшрения диапазона масштабов отображения необходимо установить границы видимости объектов в классификаторе (Задачи - Редактор классификатора - Объекты (встать на объект) - закладка Масштаб - Весь ряд).
создание слоя
 
1. При разработке приложения с использованием GISTOOLKIT подключение H-модулей API-интерфейса недопустимо по причине двойного описания типов (HSITE, HOBJ, HRSC и др.). Указанные типы уже описаны в модуле MapType.pas (GISTOOLKIT).

2. При отсутствии в GISTOOLKIT требуемых функций описываем их в своем CPP- или H-модуле следующим образом (см. исходные тексты рабочего приложения http://www.gisinfo.ru/download/rswmakersrc.zip ):
[CODE]
#define _MAPIMP __declspec(dllexport)

extern "C"
{
 // Запросить число строк блоков растра
 // hMap       - идентификатор открытой векторной карты
 // number     - номер файла в цепочке
 // При ошибке возвращает ноль

_MAPIMP long int WINAPI mapGetRstBlockRow(HMAP hMap,long int number);


 // Запросить число столбцов блоков растра
 // hMap       - идентификатор открытой векторной карты
 // number     - номер файла в цепочке
 // При ошибке возвращает ноль

_MAPIMP long int WINAPI mapGetRstBlockColumn(HMAP hMap,long int number);

 // Запросить ширину неусеченного блока растра в элементах
 // hMap       - идентификатор открытой векторной карты
 // number     - номер файла в цепочке
 // При ошибке возвращает ноль

_MAPIMP long int WINAPI mapGetRstBlockWidth(HMAP hMap,long int number);

 // Запросить высоту неусеченного блока растра в элементах
 // hMap       - идентификатор открытой векторной карты
 // number     - номер файла в цепочке
 // При ошибке возвращает ноль

_MAPIMP long int WINAPI mapGetRstBlockHeight(HMAP hMap,long int number);

// Вывести изображение карты в Image (массив)
// Данная функция реализована только для платформы Windows !
// Выводится фрагмент карты, заданный параметром rect.
// Заполняется палитра в поле palette.
// Изображение строится в текущем масштабе и составе объектов
// Палитра Image только 256 цветов, размер точки 1 байт !
// Если размеры заданного Image меньше размеров фрагмента -
// изображение строится в пределах размеров Image.
//  hmap          - идентификатор открытых данных
//  palette       - адрес палитры (256 RGBQUAD-цветов)
//  lpImage       - адрес первого байта области изображения.
//  width, height - ширина и высота Image.
//  rect          - координаты фрагмента карты (Draw)
//                  в изображении (Picture).
// При ошибке в параметрах возвращает ноль

_MAPIMP long int WINAPI mapPaintToImage(HMAP hmap, RGBQUAD * palette,
                                        char * lpImage,
                                        long int width,long int height,
                                        RECT * rect);

// Запросить габариты района (всех видов карт)
// hmap - идентификатор открытых данных
// dframe - указатель на заполняемую структуру
// place  - запрашиваемая система координат (PP_PLANE, PP_GEO,...)
// При ошибке возвращает ноль

_MAPIMP long int WINAPI mapGetTotalBorder(HMAP hmap, Maptype::TMAPDFRAME* dframe,
                                          long int place);

 // Сохранить текущее описание данных в проекте данных
 // hmap -  идентификатор открытых данных
 // name - имя файла проекта (MPT : структура, как в INI)
 // При ошибке возвращает ноль

_MAPIMP long int WINAPI mapSaveProject(HMAP hMap, const char * name);

 // Запросить значения масштаба нижней и верхней границ видимости карты
 // hMap  - идентификатор открытой карты
 // number - номер пользовательской карты в цепочке(если number == 0, базовая карта)
 // По адресу bottomScale записывается знаменатель масштаба нижней границы видимости карты
 // По адресу topScale записывается знаменатель масштаба верхней границы видимости карты
 // При ошибке возвращает 0

_MAPIMP long int WINAPI mapGetSiteRangeScaleVisible(HMAP hMap,long int number,
                          long int *bottomScale, long int *topScale);  // 09/12/03


 // Установить значения масштаба нижней и верхней границ видимости карты
 // hMap  - идентификатор открытой карты
 // number - номер пользовательской карты в цепочке(если number == 0, базовая карта)
 // bottomScale   - знаменатель масштаба нижней границы видимости карты
 // topScale   - знаменатель масштаба верхней границы видимости карты
 //              bottomScale <= topScale, иначе возвращает 0
 // При ошибке возвращает 0

_MAPIMP long int WINAPI mapSetSiteRangeScaleVisible(HMAP hMap,long int number,
                          long int bottomScale, long int topScale);   // 09/12/03

 // Загрузить библиотеку DLL
 // При поиске DLL проверяется и директория приложения
 //  void (WINAPI * myfunction)(int param);
 // (FARPROC)myfunction = mapLoadLibrary("ABC.DLL",&instance,"MyFunction");
 //  if (myfunction)
 //      { (*myfunction)(123); ::FreeLibrary(*instance); }
 // При ошибке возвращает ноль и выдает сообщение на экран

_MAPIMP FARPROC WINAPI mapLoadLibrary(const char * dllname,
                                      HINSTANCE  * libinst,
                                      const char * funcname);
 // Выгрузить библиотеку DLL

_MAPIMP long int WINAPI mapFreeLibrary(HINSTANCE  libinst);  // 01/02/02

 // Установить интенсивность заливки полигонов для
 // принтерного отображения (от 0 до 100)
 // hmap - идентификатор открытых данных

_MAPIMP long int WINAPI mapSetIntensity(HMAP hmap, long int intensity);

// Установить предельные размеры буфера изображения
// Должна вызываться до открытия данных
// При ошибке возвращает 0

_MAPIMP long int WINAPI mapSetScreenImageSize(long int width, long int height);

} // extern "C"
[/CODE]
Создание RSC и МАР
 
Тестовая программа на С++ (работоспособность не проверял, автор неизвестен). Возможно поможет для заполнения параметров функции mapCreateMap. Примера на паскале не нашел.
[CODE]
long int Function1(long int hmaps, TASKPARMEX * parm)
{
 char FileNameOld[] = "c:\\region\\map.map";
 char FileNameOldNew[] = "c:\\region\\500000\\map.map";

 MAPREGISTEREX mapreg;
 LISTREGISTER sheetreg;
 MAPREGISTER mapreg1;

 memset(&mapreg, 0, sizeof(mapreg));
 memset(&sheetreg, 0, sizeof(sheetreg));
 memset(&mapreg1, 0, sizeof(mapreg1));

 char nom100[32];
 char nom500[32];
 memset(nom100,0,32);
 memset(nom500,0,32);

 HMAP hmap = mapOpenMap(FileNameOld, 0);
 if(!hmap) return 0;

 // Запросить паспортные данные векторной карты
 mapGetMapInfoEx(hmap,1,&mapreg,&sheetreg);

 //Скопировать номенклатуру масштаба 100000
 strncpy(nom100,sheetreg.Nomenclature,sizeof(nom100));

 //Сформировать номенклатуру масштаба 500000
 strncpy(nom500,nom100,7);

 char letter = *(nom500+2);
 char x[4];

 memset(x,0x00,4);
 strncpy(x,nom100+7,3);

 long int dx = atol(x);
 if (dx<72)
   if (letter>'O') strncat(nom500,"1.B",3);
   else
   {
     long int d = (dx-1)%12;
     if (d<6) strncat(nom500,"1.A",3);
         else strncat(nom500,"2.A",3);
   }
 else
   if(letter>'O') strncat(nom500,"3.B",3);
   else
   {
     long int d = (dx-73)%12;
     if (d<6) strncat(nom500,"3.A",3);
         else strncat(nom500,"4.A",3);
   }

 // Получение имени RSC
 char namersc[260];

 //Запросить идентификатор классификатора карты
 HRSC rsc = mapGetRscIdent(hmap,hmap);

 // Запросить имя файла классификатора
 mapGetRscFileName(rsc,namersc,sizeof(namersc));

 // Запросить паспортные данные векторной карты
 mapGetMapInfo(hmap,1,&mapreg1,&sheetreg);

 // Изменить масштаб будущей карты
 mapreg1.Scale=500000L;

 // Скопировать номенклатуру
 strncpy(sheetreg.Nomenclature,(char *)(nom500),sizeof(sheetreg.Nomenclature));

 // Формирование имени файла по номенклатуре (удаляет точки, пробелы, -)
 mapSetFileNameFromNomenclature(sheetreg.FileName, 250, (char *)(nom500));

 // Расчет данных на лист топографической карты
 // Равноугольная проекция Гаусса-Крюгера
 mapCalcTopographicSheet(0,&mapreg1,&sheetreg);

 // Создать новый район (новую векторную карту)
 HMAP hmap_new=mapCreateMap(FileNameOldNew,namersc,&mapreg1,&sheetreg);

 // Запросить координаты района
 double value = mapGetMapX1(hmap_new);

 char message[100];
 sprintf(message, "1. mapGetMapX1 - %f", value);
 ::MessageBox(0, message, "TEST",
             MB_OK | MB_TASKMODAL);

 HOBJ hobj = mapCreateObject(hmap_new,1,IDFLOAT2,0);

 // Создать объект "Рамка листа"
 mapCreateListFrameObject(hmap_new,1,hobj);
 mapFreeObject(hobj);

 //X1_new->Caption = FloatToStr(Mapproc::mapGetMapX1(hmap_new));
 value = mapGetMapX1(hmap_new);
 sprintf(message, "2. mapGetMapX1 - %f", value);
 ::MessageBox(0, message, "TEST",
           MB_OK | MB_TASKMODAL);

 mapCloseMap(hmap);
 mapCloseMap(hmap_new);

 return 1;  // Перерисовать карту
}
[/CODE]
Пример 2:
[CODE]
//-----------------------------------------------------------------
//  Создать карту
//  При unit = 0 создается SITE; при unit = 1 создается MAP
//-----------------------------------------------------------------

int TClass1::CreateMap(char * mapname, char * rscname, int unit)
{
  if (mapname && rscname == 0)  return 0;

  if(unit == 0)
  {
     CREATESITE CreateParm;

     memset(&CreateParm, 0, sizeof(CreateParm));

     CreateParm.Length = sizeof(CreateParm);

     CreateParm.MapType = -1;

     CreateParm.MaterialProjection = -1;

     if(Parm.Scale)
       CreateParm.Scale = Parm.Scale;    //MapScale;
     else
       CreateParm.Scale = 2000;

     strcpy(CreateParm.MapName, SheetName);

     HSITE hsite = 0;

     hsite = ::mapCreateSite(mapname, rscname, &CreateParm);

     if (!hsite)
     {
         Error(IDS_OPEN);

         return 0;
     }

     mapCloseMap(hsite);

     return 1;
  }

  // Создать карту

  MAPREGISTER  MapRegister;

  LISTREGISTER ListRegister;

  memset((char *)&MapRegister,0x00,sizeof(MAPREGISTER));

  memset((char *)&ListRegister,0x00,sizeof(LISTREGISTER));

  if (!InitMapRegister(&MapRegister,&ListRegister)) return 0;

  HMAP hmap;

  if((hmap = mapCreateMap(mapname,rscname,&MapRegister,&ListRegister)) == 0)
    return 0;

  mapCloseMap(hmap);

  return 1;
}

// Установить параметры создания карты
// При ошибке возвращает ноль

int TClass1::InitMapRegister(MAPREGISTER* mapreg, LISTREGISTER* listreg)
{
   if (mapreg && listreg == 0) return 0;

   mapreg->Length = sizeof(MAPREGISTER);

   memset(mapreg->Name,0,sizeof(mapreg->Name));
   strncpy(mapreg->Name,SheetName,sizeof(mapreg->Name));
   strncpy(listreg->Nomenclature,SheetName,sizeof(listreg->Nomenclature));

   if (Parm.Scale)
     mapreg->Scale = Parm.Scale;          // Знаменатель масштаба
   else
     mapreg->Scale = 100000;
   mapreg->ProjectionFlag =
             REGISTERTYPES::ADEQUACY;     // Флаг соответствия проекции
   mapreg->EllipsoideKind =
                            KRASOVSKY42;  // Вид эллипсоида
   mapreg->HeightSystem =
                            BALTIC;       // Система высот
   mapreg->MaterialProjection =
                            MERCATORMAP;  // Проекция исх. материала
   mapreg->CoordinateSystem =
                            CONDITION;    // Система координат
   mapreg->PlaneUnit =
             REGISTERTYPES::METRE;        // Единица измерения в плане
   mapreg->HeightUnit =
             REGISTERTYPES::METRE;        // Единица измерения по высоте
   mapreg->FrameKind =
             REGISTERTYPES::RECTANGULAR;  // Вид рамки
   mapreg->MapType =
                            GEOGRAPHIC;   // Обобщенный тип карты

   mapreg->DeviceCapability = 1;         // Разрешающая способность прибора

   mapreg->DataProjection = 1;            // Наличие данных о проекции

   mapreg->FlagRealPlace = 1;             // Признак реальных координат

   // В радианах
   double radian = M_PI/180.;
   mapreg->FirstMainParallel = 26.14*radian;    // Первая главная параллель
   mapreg->SecondMainParallel = -26.14*radian;  // Вторая главная параллель
   mapreg->AxisMeridian = 0.0;            // Осевой меридиан
   mapreg->MainPointParallel = 0.0;       // Параллель главной точки

   return 1;
}
[/CODE]
Создание RSC и МАР
 
При описании структур допущены ошибки.

LISTREGISTER:
Nomenclature : array[0..31] of char;
ListName : array[0..31] of char;
FileName : array[0..259] of char;

MAPREGISTER:
Name : array[0..31] of char ;

RSCCREATE:
Name : array[0..31] of char ;
TypeRSC : array[0..31] of char ;
Code : array[0..7] of char ;

Кроме того, рекомендую посмотреть таблицу перевода типов, сообщение #5 на странице
http://www.gistoolkit.com/forum/forum2/topic309/message1027/#message1027
Отображение карты с большим масштабом
 
Не понятна суть проблемы. Вопросы:
1. Пропадает отображение некоторых объектов?
2. Пропадает отображение всех объектов?
3. Не помещается весь лист или склейка карт в окно?

Пришлите, пожалуйста, образ экрана в DOC-файле с пояснениями (panorama@gisinfo.ru).
Цикличный перебор объектов, (работа с объектами не-первого листа)
 
Код 1:

1. Отсутствует вызов функции mapAppendPointPlane (ввод метрики подписи - 2 точки).
К сожалению, по приведенным фрагментам кода не понял алгоритма. Поэтому дополню:
2. Если объект считан с карты, отредактирован и записан функцией mapCommitObject, то выполнится обновление объекта карты на том листе, с которого он считан.
3. Если объект создается "с нуля", то можно воспользоваться функцией mapCommitWithPlaceForList или mapCommitWithPlaceAsNew (выбор листа выполняется автоматически). Объект запишется в тот лист района, на который попадает его метрика:
[CODE]
// Создается один раз (на все листы)
HOBJ signatureObj = mapCreateObject( myMap, 1, IDFLOAT2, 1);

for (...)
{
 // Очистить все данные объекта
 mapClearObject(...);

 //-- заполняем подпись:
 mapAppendPointPlane(...);
 mapAppendPointPlane(...);
 mapPutText( signatureObj, text, 0 );
 mapAppendSemantic( signatureObj, semCode, text, MAX_PATH );
 //-- сохраняем в карте:
 mapRegisterObject( signatureObj, __SIGNATURE_EXCODE, LOCAL_TITLE );
 mapCommitObjectWithPlaceAsNew( signatureObj );
}

//-- освобождаем память:
mapFreeObject( signatureObj );
[/CODE]

Код 2:
Похоже на рабочий фрагмент текста. Большинство задач по созданию и редактированию объектов типичны, но как правило, имеют особенности. Не имея полного текста функции, сложно судить о качестве ее работы.
Циклическая работа с матрицами
 
В Вашем случае hmtq имеет тип HMAP, т.е. создается объект такого же типа как hmap с помощью mapOpenMap и удалять из его (из памяти) необходимо той же функцией.

Тип HMAP - это класс (структура), содержащий списки структур-описателей для каждого вида данных, в том числе и для матриц качества. При создании матрицы качества функцией mapOpenMtq автоматически создается экземпляр класса типа HMAP. Матрица качества добавляется первой в список открытых данных.

ОСВОБОДИТЬ ВСЕ РЕСУРСЫ - означает освобождение структуры экземпляра класса типа HMAP. Перед освобождением выполняется закрытие всех видов данных: векторных карт, растров, матриц, TIN-моделей и др.

Для решения проблемы освобождения HOBJ необходимо внимательно (!) посмотреть тексты.
Если проблема не решится - присылайте полный текст функции (на panorama@gisinfo.ru). Посмотрим.
Проблема при работе с несколькими мониторами
 
Попробуйте воспользоваться функцией:

 // Установить предельные размеры буфера изображения      
 // Функция должна вызываться до открытия данных
 // Чтобы оставить ширину или высоту без изменения соответствующий параметр
 // должен быть равен 0
 // При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapSetScreenImageSize(long int width, long int height);
Циклическая работа с матрицами
 
1. Размещение объекта выполняется для переменной "hmtq", а освобождение по "hmap".

2. В описании функции mapCloseMtq (mtrapi.h) написано:

 // Закрыть матрицу качеств
 // hMap - идентификатор открытой основной карты
 // number - номер закрываемой матрицы
 // если number = 0, закрываются все матрицы в окне
 // ЧТОБЫ ОСВОБОДИТЬ ВСЕ РЕСУРСЫ - НУЖНО ВЫЗВАТЬ mapCloseData(hMap)

_MAPIMP void _MAPAPI mapCloseMtq(HMAP hMap, long int number);

Кроме того, при вызове функции mapCloseData вызов mapCloseMtq необязателен.
Именно функция mapCloseData освобождает память объекта HMAP.
Функция mapCloseMtq лишь закрывает матрицу качеств (или все матрицы качеств), но не освобождает более общий объект HMAP.

3. Ситуацию с HOBJ необходимо рассмотреть отдельно. Типичная ошибка: использование функций mapDeleteObject или mapClearObject вместо mapFreeObject (для освобождения памяти).
Страницы: Пред. 1 ... 138 139 140 141 142 143 144 145 146 147 148 След.



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

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