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

Изменить параметры проекции

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 3 4 5 6 След.
RSS
Изменить параметры проекции, Изменить параметры проекции
 
Здравствуйте!

Понадобилось в прикладной программе предоставить диалог для изменения параметров проекции карты.

Для этого делаю следующее:

procedure Tform_main.N20Click(Sender: TObject);
Var
b : PMAPREGISTEREX;
c : PDATUMPARAM;
e : PELLIPSOIDPARAM;
d : PTASKPARMEX;
aMap : HMAP ;
begin
aMap := form_main.mvMap.MapHandle ;
paspSetProjectionParameters(aMap,b,c,e,d,'Параметры проекции',1);
end;

Компилируется и запускается все хорошо.
И даже в вызываемом диалоге работает кнопки <Из XML> и <Установить>. Форма диалога хорошо закрывается.
Проблема в том, что при повтором вызове этого же диалога, выскакивает ошибка по памяти компьютер.
Программа подвисает в процессах и закрытие ее уже возможно только при вызове Диспетчера задач.
Та же самая ошибка по памяти компьютера выскакивает, если после закрытия вышеназванного диалога попытаться закрыть программу.
Похоже я не устанавливаю нужные параметры.
Просьба подсказать какие и как указать параметры?
Или может что-то другое?
 
Screenshort1.png (40.34 КБ)
 
Цитата
Сергей Викторович написал:
Var
b : PMAPREGISTEREX;
c : PDATUMPARAM;
e : PELLIPSOIDPARAM;
d : PTASKPARMEX;
Это указатели на соответствующие структуры MAPREGISTEREX, DATUMPARAM и др.

Во-первых, очень плохая практика не инициализировать объявленные переменные.
А во-вторых, и это самое главное, - по тексту нет выделения памяти для передачи в функцию по этим указателям!
По факту функция получает ненулевые (поскольку там грязь) указатели, пытается читать и писать данные по этим указателям.
Таким образом Вы рушите память программы, поэтому последующая работа программы вообще непредсказуема.
 
Давайте разберемся по каждой структуре. В Руководстве программиста этого нет.

TMAPREGISTEREX  = packed record
  Length    : integer;      // Размер данной структуры  //06/11/2010
Здесь не понятно, какие значения может принимать данный параметр

  Name      : array[0..31] of GTKChar;    // Имя района
Это имя файла карты? или Название карты?

  Scale,                     // Знаменатель масштаба
Ну здесь я думаю можно поставить 2000, т.е. значение моего исходного масштаба, правильно?

  ProjectionFlag,            // Флаг соответствия проекции
Это не понятно, я бы поставил True, это правильно?

  EllipsoideKind,            // Вид эллипсоида
Здесь нужно написать 'Красовский 1940'?

  HeightSystem,              // Система высот
Здесь какие могут быть значения?

  MaterialProjection,        // Проекция исх. материала
Здесь какие могут быть значения?

  CoordinateSystem,          // Система координат
Здесь какие могут быть значения?

  PlaneUnit,                 // Единица измерения в плане
Здесь какие могут быть значения?

  HeightUnit,                // Единица измерения по высоте
Здесь какие могут быть значения?

  FrameKind,                 // Вид рамки
Здесь какие могут быть значения?

  MapType,                   // Обобщенный тип карты
Здесь какие могут быть значения?
  DeviceCapability,          // Разрешающая способность прибора
                                     // Обычно равна 20 000
                                    // Для карт повышенной точности:  // 26/12/06
                                    // -1 - максимальная точность
                                    // -2 - хранить координаты в сантиметрах
                                    // -3 - хранить координаты в миллиметрах
                                    // -7 - хранить координаты в радианах     // 17/03/10
Здесь я поставлю конечно 20000

  DataProjection,            // Наличие данных о проекции
Здесь какие могут быть значения?

  OrderViewSheetFlag,        // ZoneIdent; // Идентификатор района (для МСК 63: A-X или 0)      // 11/12/2013
Здесь какие могут быть значения?

  FlagRealPlace,             // Вид карты                                                       // 11/12/2013
                             // (0 - MAP (устаревший), 1 - SIT, -1 - SIT c постоянной рамкой)   // 11/12/2013
Вот это понятно, поставлю 1


  ZoneNumber   : integer;    // Заполняется системой при запросе   //06/11/2010
                             // формуляра - номер зоны топокарты в радианах
Здесь какие могут быть значения?

  FirstMainParallel,         // Первая главная параллель  StandardParallel1
Здесь какие могут быть значения?

  SecondMainParallel,        // Вторая главная параллель  StandardParallel2
Здесь какие могут быть значения?

  AxisMeridian,              // Осевой меридиан   (Долгота полюса проекции) CentralMeridian
Здесь какие могут быть значения?

  MainPointParallel,         // Параллель главной точки (Широта полюса проекции) LatitudeOfOrigin
Здесь какие могут быть значения?

  PoleLatitude,              // Широта полюса проекции  (Latitude of false origin, etc)
Здесь какие могут быть значения?

  PoleLongitude,             // Долгота полюса проекции (Longitude of false origin, etc)
Здесь какие могут быть значения?

  FalseEasting,              // Смещение координат по оси Y 06/11/2010
Здесь какие могут быть значения?

  FalseNorthing,             // Смещение координат по оси X
Здесь какие могут быть значения?

  ScaleFactor,               // Масштабный коэффициент на осевом меридиане (1.0 +\- ...)
Здесь какие могут быть значения?

  TurnAngle:  double;        // Угол разворота осей для локальных систем (МСК)
Здесь какие могут быть значения?

  Reserv2 : array[0..3] of double; // Резерв = 0
Это понятно, поставлю 0

Я правильно понимаю, что абсолютно все значения параметров должны быть заполнены?

Просьба ответить на все вопросы: Здесь какие могут быть значения?
Ответ: Я же не знаю какая карта у вас, не подойдет.
Мне нужно понять как вообще заполнять эти значения и какой набор значений может быть для каждого параметра.
Очень хорошо представлен только параметр:
FlagRealPlace,             // Вид карты                                                       // 11/12/2013
                             // (0 - MAP (устаревший), 1 - SIT, -1 - SIT c постоянной рамкой)   // 11/12/2013
Вот это понятно, поставлю 1

Вопрос 2.
Как выделить память для передачи в функцию значений параметров по вышеприведенному указателю?
 
 
Цитата
Сергей Викторович написал:
Вопрос 2.
Как выделить память для передачи в функцию значений параметров по вышеприведенному указателю?
Способов два - выделить память статически (в стеке) либо динамически (в куче) - с помощью new.
Понимание базовых принципов работы с памятью является неотъемлемым условием при программировании с использованием интерфейса MAPAPI.

Конкретно в Вашем случае достаточно объявить структуру и взять от нее указатель (это выделение памяти в стеке).

примерно так:
Цитата
Код
procedure Tform_main.N20Click(Sender: TObject);
Var
b : TMAPREGISTEREX;
c : TDATUMPARAM;
e : TELLIPSOIDPARAM;
d : TTASKPARMEX;
aMap : HMAP ;
begin
aMap := form_main.mvMap.MapHandle ;
// заполнить структуры
.....

// вызов
paspSetProjectionParameters(aMap,@b,@c,@e,@d,'Параметры проекции',1);
end;
Цитата
Сергей Викторович написал:
Давайте разберемся по каждой структуре. В Руководстве программиста этого нет.
В руководстве программиста и не будет описана каждая структура и каждый ее параметр. Особенно в руководстве по GIS ToolKit.
Основные принципы написания программ на основе интерфейса MAPAPI приведены в руководстве по этому интерфейсу.

Описания параметров функций приводятся непосредственно в тесте объявления функций. То же самое касается структур.

Установка параметров проекции подразумевает наличие представления того, что же Вы хотите установить.
Поэтому такие параметры, как "Осевой меридиан", "Параллель главной точки", "Масштабный коэффициент", "Угол разворота осей" и др. я комментировать не буду, так как их названия и комментарии к ним являются исчерпывающими.
Поясню только, что все угловые величины передаются в радианах.

Далее.
Цитата
Сергей Викторович написал:
Length    : integer;      // Размер данной структуры  //06/11/2010
Здесь не понятно, какие значения может принимать данный параметр
Многие структуры в MAPAPI имеют контрольное поле Length. Его надо заполнить размером самой структуры.


Цитата
Сергей Викторович написал:
Name      : array[0..31] of GTKChar;    // Имя района
Это имя файла карты? или Название карты?
Это имя района. В диалоге паспорта карты (например, в ГИС Панорама 12) этот параметр называется имя карты.

Вообще, рекомендую посмотреть, какие поля содержит этот диалог. Сразу многое станет понятно, так как заполняемые Вами структуры - это и есть паспортные данные карты.


Каждый параметр имеет тип данных.
Цитата
Сергей Викторович написал:
ProjectionFlag,            // Флаг соответствия проекции
Это не понятно, я бы поставил True, это правильно?

  EllipsoideKind,            // Вид эллипсоида
Здесь нужно написать 'Красовский 1940'?
Не получится в параметр с типом integer записать текстовую строку.

Целочисленые параметры - это либо флаг (0-нет/1-да), либо код, определяющий значение некого перечисления.

В частности, EllipsoideKind - это одно из возможных значений ELLIPSOIDKIND:


Скрытый текст




Там же описаны и другие параметры, задаваемые для паспорта карты.

Кстати, рекомендую ресурс - http://help.gisinfo.ru. При программировании на MAPAPI бывает весьма полезен.

 
Что касается символа @ я догадывался, что он нужен для адресации память, вы это подтвердили, спасибо.
Последняя ссылка
Там же описаны и другие параметры, задаваемые для паспорта карты.
это похоже на то, что мне нужно, спасибо.
Буду разбираться.
 
Заменил код на вашу его редакцию,
procedure Tform_main.N20Click(Sender: TObject);Var
b : TMAPREGISTEREX;
c : TDATUMPARAM;
e : TELLIPSOIDPARAM;
d : TTASKPARMEX;
aMap : HMAP ;
begin
aMap := form_main.mvMap.MapHandle ;
// заполнить структуры
b.Length := sizeof(b);
b.Name := 'Map';
b.Scale := 2000;
// вызов
paspSetProjectionParameters(aMap,@b,@c,@e,@d,'Параметры проекции',1);
end;
результат скриншот во вложении

Что я сделал не правильно?
Я правильно понимаю, что если значения каких-либо параметров не указаны,
то берутся по умолчанию и не должно гинирироваться ошибки выделения памяти?
Может все-таки в синтаксисе что-то не то?  
Screenshort2.png (22.02 КБ)
 
Устал я разбираться с предыдущем диалогом,
решил попробовать другой диалог. См скриншот.

d : TTASKPARMEX;
aMap : HMAP ;
begin
aMap := form_main.mvMap.MapHandle;
d.Language := 2;
paspSetWorkSystemParameters(aMap,@d);
end;

Думаю, что он так же может помочь изменить параметры проекции из XML
Ура, он запускается и даже не "валится" по выделению памяти.
Закрывается и открывается отлично.
Но,(( почему-то при нажатии на кнопку из XML ничего не происходит.
Т.е. кнопка хорошо нажимается, но не вызывается диалог выбора файла((
Почему, что здесь я делаю не так?  
Screenshort2.png (33.49 КБ)
 
Тоже самое касается формы паспорта.
f : PTASKPARM;
aMap : HMAP ;
begin
aMap := form_main.mvMap.MapHandle;
MapPaspEdit(aMap,'Map',@f);
end;

Вызывается хорошо.
Работает кнопка Из Карты.
Кнопка Из XML нажимается, но не вызывается диалог выбора файла XML
Почему?
Screenshort3.png (44.88 КБ)
 
Компилятор Delphi 7 Выдает ошибку при компиляции:
идентификатор должен быть проинициализирован, это касается @a

procedure Tform_main.N18Click(Sender: TObject);
Var
MapFileName,RscFileName : widestring;
a : TMAPREGISTER;
b : TLISTREGISTER;
begin
MapFileName := ExtractFilePath(Application.ExeName)+'Data\'+tmp_NameProject+'\Map.sit';
RscFileName := ExtractFilePath(Application.ExeName)+'Data\'+tmp_NameProject+'\Uzor.rsc';
a.Length := sizeof(a);
a.mName := 'Map';
a.Scale := 2000;
a.ProjectionFlag := 1;
a.EllipsoideKind := 1;
a.HeightSystem := 1;
a.MaterialProjection := 1;
a.CoordinateSystem := 1;
a.PlaneUnit := 1;
a.HeightUnit := 1;
a.FrameKind := 1;
a.MapType := 1;
a.DeviceCapability := 1;
a.DataProjection := 1;
a.OrderViewSheetFlag := 1;
a.FlagRealPlace := 1;
a.ZoneNumber := 1;
a.FirstMainParallel := 1;
a.SecondMainParallel := 1;
a.AxisMeridian := 1;
a.MainPointParallel := 1;

b.Length := sizeof(b);
b.Nomenclature := 'Map';
b.ListName := 'List';
b.FileName := 'FileName';
b.XSouthWest := 0;
b.YSouthWest := 0;
b.XNorthWest := 0;
b.YNorthWest := 0;
b.XNorthEast := 0;
b.YNorthEast := 0;
b.XSouthEast := 0;
b.YSouthEast := 0;
b.BSouthWestCoordinate := 0;
b.LSouthWestCoordinate := 0;
b.BNorthWestCoordinate := 0;
b.LNorthWestCoordinate := 0;
b.BNorthEastCoordinate := 0;
b.LNorthEastCoordinate := 0;
b.BSouthEastCoordinate := 0;
b.LSouthEastCoordinate := 0;
b.MaterialKind := 1;
b.MaterialType := 1;
b.ReliefHeight := 1;
b.sDate := '05.05.2017';
b.MagneticAngle := 0;
b.YearMagneticAngle := 0;
b.MeridianAngle := 0;
b.DateAngle := '05.05.2017';
b.Reserve :='';
mapCreateMap(PChar(MapFileName),PChar(RscFileName),@a,@b);
end;

Вроде все проинициализировано?
 
В этот раз исправил так:
mapCreateMap(PChar(MapFileName),PChar(RscFileName),a,b);

Все заработало.
Почему в одном случаи нужно указывать @переменная, в других нет, переменная?  
Страницы: 1 2 3 4 5 6 След.
Читают тему (гостей: 1)



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

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