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

GisToolFree15 Delphi 10.4.2

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
GisToolFree15 Delphi 10.4.2, Не создается рамка листа
 
Добрый день.

Хочу создать лист масштаба 1:25000 с рамкой.
Расчёт рамки хочу сделать по номенклатуре
Использую следующий вызов процедур, как описано в документации п.п. 4.2.2 Создание новой карты или плана
Столкнулся со следующими проблемами:
1. Функция отсутствует
// Сформировать имена файлов по номенклатуре – "M36001"
mapSetFileNameFromNomenclature(listreg.FileName, sizeof(listreg.FileName),
listreg.Nomenclature);

2. Карту создала, но рамка листа отсутствует

Что не так ?

Используемый код:
var
mapreg : TMAPREGISTEREX;
listreg : TLISTREGISTER;
hmap : maptype.HMAP;
code : integer;
begin
mapreg.Length := sizeof(TMAPREGISTEREX);
listreg.Length := sizeof(TLISTREGISTER);

// Создать топокарту в системе координат ПЗ-90.11 года
code := mapRegisterFromMapType(1, mapreg);
// Хранение координат с максимальной точностью
mapreg.DeviceCapability := -1;
// Знаменатель масштаба 1:100 000
mapreg.Scale := 25000;
// Условное название карты (название населенного пункта или другое)
StrLCopy(mapreg.Name, 'Район работ', sizeof(mapreg.Name));
// Условное название карты (название населенного пункта или другое)
StrLCopy(listreg. ListName, 'Лист M-36-001-1-1', sizeof(listreg. ListName));
// Номенклатура листа для топокарты в соответствии с масштабом
// или условное название листа
StrLCopy(listreg.Nomenclature, '0.M-36-001-1-1', sizeof(listreg.Nomenclature));
// Сформировать имена файлов по номенклатуре – "M3600111"
code := mapSetFileNameFromNomenclatureUn(@listreg.FileName, sizeof(listreg.FileName),
                                         @listreg.Nomenclature);
// Рассчитать прямоугольные и геодезические координаты листа
// и осевой меридиан по номенклатуре
// При добавлении листа к существующей карте – первый параметр hMap
code := mapCalcTopographicSheetEx(0, @mapreg, @listreg);
// Данные о проекции заполнены
mapreg.DataProjection := 1;
// Создать новую карту
hmap := mapCreateMapUn('d:\1\mymap.map', '25t05gopen.rsc',
                       @mapreg, @listreg, 'Район работ', 0, 0);
 
В догонку:
//==========================================================­==
// CreateMapPro - создать карту (MAP, SIT, SITX)
// с возможностью шифрования
// mapname - полное имя файла карты (MAP, SIT, SITX)
// rscname - полное имя файла ресурсов (RSC)
// Возвращает идентификатор открытой векторной карты
// Структуры MAPREGISTEREX и LISTREGISTER описаны в mapcreat.h
// sheetname - условное имя карты
// password  - пароль доступа к данным из которого формируется 256-битный код
//             для шифрования данных (при утрате данные не восстанавливаются)
//             (поддерживается для карт с расширением SITX - хранилище в
//              одном файле) или пустая строка
// Выход = 0 - карта создана; <>0 - карта не создана
//==========================================================­==
function TMapView.CreateMapPro(const mapname, rscname : string;
                              mapreg : TMAPREGISTER; sheet : TLISTREGISTER;
                              const sheetname : string;
                              const password : string = '') : integer;

В описании на вход MAPREGISTEREX, в параметрах указано TMAPREGISTER

В функции вызов
map := mapCreateMapUn(PMapName, PRSCName, @mapreg, @sheet,
                       PSheet, PPassw, Length(password)*sizeof(WCHAR));

где тоже в качестве входных параметров используется PMAPREGISTER

хотя в самой функции мы видим PMAPREGISTEREX
function  mapCreateMapUn(const mapname : PWCHAR;        
                        const rscname : PWCHAR;
                        mapreg : PMAPREGISTEREX;
                        listreg : PLISTREGISTER;
                        const mainname : PWCHAR;    
                        const password : PWCHAR;
                        size: integer):HMap;
 stdcall external sGisAcces;


Всё бы ничего, но я не могу использовать установку флагов DeviceCapability := -1 и FlagRealPlace := -2, т.к.
В типе TMAPREGISTER они описаны как cardinal, а в типе TMAPREGISTEREX описаны как integer


До сих пор, не могу заставить строить карту с рамкой листа(объектом)
 
Цитата
Александр написал:
Всё бы ничего, но я не могу использовать установку флагов DeviceCapability := -1 и FlagRealPlace := -2, т.к.В типе TMAPREGISTER они описаны как cardinal, а в типе TMAPREGISTEREX описаны как integerДо сих пор, не могу заставить строить карту с рамкой листа(объектом)
Добрый день!
На нашем форуме обсуждалась похожая тема https://www.gisweb.ru/forum/messages/forum7/topic10580/message80215/10580-sozdanie-pustykh-listov-ka...
 
Есть такая функция в vecexapi.h

Код
 // Формирование района работ по списку номенклатур
 // handle - идентификатор диалога для приема сообщений WM_PROGRESSBARUN
 // mapfilename - имя файла паспорта MAP создаваемой многолистовой карты
 // rscname - имя файла классификатора RSC
 // sheetlist - адрес массива указателей на список номенклатур стандартной разграфки для топокарт
 // sheetlistcount - число номенклатур в списке
 // parm - параметры создаваемой многолистовой карты
 // При ошибке возвращает ноль

 typedef struct CREATESHEETSPARM
 {
   CREATESHEETSPARM()
   {
     memset(this, 0, sizeof(CREATESHEETSPARM));
   }

   HOBJ     hFrame;          // Координаты области, в пределах которой нужно создавать листы из входного списка номенклатур

   long int SourceMapType;   // Тип карты, по которой выполняется вычисление рамки листа карты (CK_42, CK_95, GCK_2011, UTMWGS84)
   long int EpsgCode;        // Код EPSG создаваемой карты или ноль, если создаем по типу исходной карты
   long int Scale;           // Масштаб создаваемой карты
   long int IsDelimeter;     // Признак сохранения в имени файла листа разделителей (n37-01 вместо n3701)
   long int Error;           // Код ошибки (стандартные коды из maperr.rh или: -N - номер (-1,-2,...) номенклатуры из списка, содержащей ошибку)

   WCHAR MainName[256];      // Имя района работ создаваемой многолистовой карты
   WCHAR Prefix[64];         // Префикс к именам файлов листа, именам листов и номенклатурам
 }
 CREATESHEETSPARM;

 _VECIMP long int _VECAPI vecCreateMapForNomenclatureList(HMESSAGE handle, const WCHAR* mapfilename, const WCHAR* rscname, 
                        const WCHAR** sheetlist, long int sheetlistcount, CREATESHEETSPARM * parm);
 
Цитата
Александр написал:
function TMapView.CreateMapPro

Спасибо за сообщение!

Описание структур исправим, добавим обновленный метод создания многолистовой карты с параметром TMAPREGISTEREX.
Исправления появятся в следующей версии, о выпуске сообщим дополнительно.
 
Спасибо, за ответы
 
Несколько уточнений

Цитата
Александр написал:
1. Функция отсутствует

Функция хотя и считается устаревшей, так как работает с ANSI-кодировкой, но доступна для использования. В Delphi требуется подключить файл mapproc.pas.

Цитата
Александр написал:
Что не так ?

Предполагаю, что имя файла Вы тут не получили:
Цитата
Александр написал:
// Сформировать имена файлов по номенклатуре – "M3600111"
code := mapSetFileNameFromNomenclatureUn(@listreg.FileName, sizeof(listreg.FileName),                                          
                           @listreg.Nomenclature);
Функция ожидает на вход Юникод-строки, а поля listreg - это ANSI.
Используйте функцию mapSetFileNameFromNomenclature.



Цитата
Александр написал:
// Создать топокарту в системе координат ПЗ-90.11 года
code := mapRegisterFromMapType(1, mapreg);

Для ПЗ-90 добавлен отдельный код: 24
Код
// Типы флага "Тип карты" (УСЛОВНОЕ ОБОБЩЕННОЕ ОБОЗНАЧЕНИЕ СИСТЕМЫ КООРДИНАТ И НАЗНАЧЕНИЯ)
typedef enum MAPTYPE
{
// UNDEFINED   = -1,      // Не установлено
   TOPOGRAPHIC  = 1,      // Топографическая (СК42), требует осевой меридиан
   CK_42        = 1,      // Система координат 42 года, требует осевой меридиан (EPSG:28401-28460)
   USERTYPE     = 2,      // Пользовательская произвольная или Обзорно-географическая (тип и эллипсоид зависят от параметров)
   GEOGRAPHIC   = 2,      // Пользовательская произвольная или Обзорно-географическая (тип и эллипсоид зависят от параметров)
   GLOBE        = 3,      // Космонавигационная (ГЛОБУС, цилиндрическая на эллипсоиде Красовского)
   CITYPLAN     = 4,      // Топографический план города (СК42 с произвольными номенклатурами)
   LARGESCALE   = 5,      // Крупномасштабный план местности
   AERONAUTIC   = 6,      // Аэронавигационная
   SEANAUTICOLD = 7,      // Цилиндрическая Меркатора, имеет нестандартные коэффициенты пересчета плоских координат
   AVIATION     = 8,      // Авиационная (Цилиндрическая на эллипсоиде Красовского)
   BLANK        = 9,      // Бланковка (Цилиндрическая на эллипсоиде Красовского)
   UTMNAD27     = 10,     // UTM на North American Datum 1927, требует осевой меридиан
   UTMWGS84     = 11,     // UTM на WGS84, требует осевой меридиан (XXN - EPSG:32601-32660, XXS - EPSG:32701-32760)
   UTMTYPE      = 12,     // UTM, требует осевой меридиан
   CK_63        = 13,     // Система координат 63 года, требует осевой меридиан
   CK_95        = 14,     // Система координат 95 года, требует осевой меридиан (EPSG:20001-20060)
   TOPOLOCAL    = 15,     // Топографическая с произвольной главной точкой, требует осевой меридиан
   MAPSPHERE    = 16,     // Обзорно-географическая Широта/Долгота на "шаре", можно выбрать эллипсоид
   WORLDMAP     = 17,     // Карта Мира (Цилиндрическая Миллера), можно выбрать эллипсоид (EPSG:54003)
   MCK_CK63     = 18,     // Местная система координат на базе СК-63
   MERCATOR     = 19,     // Цилиндрическая Меркатора на шаре "World Mercator" (EPSG:3857, EPSG:3395), (аналог Google), можно выбрать эллипсоид
   SEANAUTIC    = 20,     // Морская навигационная (Mercator_2SP), можно выбрать эллипсоид (Цилиндрическая равноугольная Меркатора на эллипсоиде WGS84)
   GCK_2011     = 21,     // Система координат ГСК-2011, требует осевой меридиан (EPSG:80201101-80201160)
   VN_2000      = 22,     // Система координат VN-2000, требует осевой меридиан (EPSG:3405, EPSG:3406)
   VN_2000_TM3  = 23,     // Система координат VN-2000/TM-3, требует осевой меридиан (EPSG:6956-EPSG:6959)
   Pulkovo2017  = 24,     // Система координат на основе ПЗ-90.11, требует осевой меридиан (EPSG:80011001-80011060)
   MAPTYPELIMIT = 24,     // Крайнее значение типа карты
}
MAPTYPE;


Константы для GIS ToolKit (Delphi) также в ближайшее время обновим.
 
Текст с комментариями скопировал из документации, поэтому некоторые поля в функциях не соответствуют комментариям.
Например здесь:
// Создать топокарту в системе координат ПЗ-90.11 года
code := mapRegisterFromMapType(1, mapreg);

Типы флага "Тип карты" (УСЛОВНОЕ ОБОБЩЕННОЕ ОБОЗНАЧЕНИЕ СИСТЕМЫ КООРДИНАТ И НАЗНАЧЕНИЯ)
Установил для CK_42 (константы взял из mapcreat.h)

Спасибо за пояснения.
 
//==========================================================­==
// CreateMapPro - создать карту (MAP, SIT, SITX)
// с возможностью шифрования
// mapname - полное имя файла карты (MAP, SIT, SITX)
// rscname - полное имя файла ресурсов (RSC)
// Возвращает идентификатор открытой векторной карты
// Структуры MAPREGISTEREX и LISTREGISTER описаны в mapcreat.h
// sheetname - условное имя карты
// password  - пароль доступа к данным из которого формируется 256-битный код
//             для шифрования данных (при утрате данные не восстанавливаются)
//             (поддерживается для карт с расширением SITX - хранилище в
//              одном файле) или пустая строка
// Выход = 0 - карта создана; <>0 - карта не создана
//==========================================================­==
function TMapView.CreateMapPro(const mapname, rscname : string;
                              mapreg : TMAPREGISTER; sheet : TLISTREGISTER;
                              const sheetname : string;
                              const password : string = '') : integer;
var
 map : HMAP;
 PMapName, PRSCName, PSheet, PPassw : PWCHAR;
begin
 Result := 1;
 mapreg.Length := sizeof(TMAPREGISTER);
 sheet.Length := sizeof(TLISTREGISTER);

 PMapName := PWCHAR(mapname);
 PRSCName := PWCHAR(rscname);
 PSheet   := PWCHAR(sheetname);
 if (password <> '')
  then PPassw := PWCHAR(password)
  else PPassw := nil;

 map := mapCreateMapUn(PMapName, PRSCName, @mapreg, @sheet,
                       PSheet, PPassw, Length(password)*sizeof(WCHAR));

if map = 0
  then exit;

mapCloseMap(map);
Result := 0;
end;

Нарушена логика выходного параметра.
Вы в комментариях пишите сначала
                                                             "Возвращает идентификатор открытой векторной карты"
потом ниже
                                                            "Выход = 0 - карта создана; <>0 - карта не создана"
А вызываемая Вами функция
                                                 mapCreateMapUn
При ошибке возвращает 0, т.е. карта будет по ошибке не создана, а Вы скажете что всё хорошо.
Логично возвращать такой же код, что и
                                                mapCreateMapUn
И в данной функции Вы создаёте карту и сразу закрываете, т.е. нет возможности просто создать и работать с "идентификатор открытой векторной карты"
 
Добрый день!

Цитата
Александр написал:
в данной функции Вы создаёте карту и сразу закрываете, т.е. нет возможности просто создать и работать с "идентификатор открытой векторной карты"

Да, так сложилось исторически. Изменить логику работы метода, который уже многие давно используют, мы не можем.
Но мы добавили еще один метод создания многолистовой карты, который после создания сразу открывает новую карту в компоненте.
Новая версия выйдет на днях.
Страницы: 1
Читают тему (гостей: 1)



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

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