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

Алексей Агулов (Все сообщения пользователя)

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

Страницы: 1 2 3 4 След.
преобразование проекций средствами ГИС Конструктор под ОС Astra-Linux v.1.3, получение косой азимутальной равнопромежуточной проекции путём трансформации других проекций
 
Спасибо, с матрицей высот разобрались.
Возник ещё вопрос.

После создания карты в новой проекции(азимутальная Гуам) на неё копируются объекты с исходной карты (имеющей цилиндрическую проекцию). При этом, чтобы исключить эффект "заворачивания" границ, в ходе копирования производится селекция только той части полушария, которая обращена к полюсу проекции. А объекты, расположенные на  "теневой" части отбрасываются.
Этот метод работает хорошо, пока на границе области селекции не оказываются объекты большой протяжённости, каковыми являются моря или океаны. При использовании для копирования функции mapSelectSeekArea() можно либо копировать подобные объекты целиком на новую карту (что частично возвращает эффект "заворачивания" краёв в местах расположения подобных объектов), либо полностью исключать их из новой карты (что , в силу их большой протяженности, существенно обедняет карту).

Можно ли программным образом рассекать объекты вдоль границы области селекции, таим образом, чтобы при работе функции mapSelectSeekArea() на новую карту копировалась лишь часть объекта, попадающая в область селекции? И как это сделать?

Или, возможно, существует другой способ, позволяющий не отображать на карте ту часть объекта, на которую мы "смотрим" как бы "со спины"?
преобразование проекций средствами ГИС Конструктор под ОС Astra-Linux v.1.3, получение косой азимутальной равнопромежуточной проекции путём трансформации других проекций
 
Спасибо. Запрет вывода сообщений помог. Просчёт матрицы выполняется.
Но есть ещё одна проблема. Надеюсь, последняя в этой теме.

Я заметил, что матрица высот, просчитанная под ОС Astra Linux несколько отличается от той же матрицы просчитанной под ОС Windows.
Вот вид матрицы, полученной ГИС "Оператор" версия 11.10.4 под ОС Windows :

<img src="http://storage2.static.itmages.ru/i/15/0204/h_1423038872_1925309_02d4bfa1cf.jpg">

А такой вид получается при просчёте матрицы под ОС Astra Linux (результат одинаков и при получении матрицы моим приложением с помощью ГИС Конструктора, и при просчёте с помощью ГИС "Панорама" для Linux версии 11.9.3) :

<img src="http://storage2.static.itmages.ru/i/15/0204/h_1423038680_5013686_b23c0a55b6.jpg">

Как видно, в области поверхности морей вместо ровной глади формируются какие-то полосы.
То, что подобный эффект наблюдается и при работе ГИС Конструктора, и при работе стандартного приложения, наводит на мысль, что причина кроется в механизме формирования матриц, заложенном в библиотечных функциях, используемых обоими приложениями.
Исходные данные, используемые для просчёта матриц, корректны, т.к. в Windows результат получается правильным.

Как получить такой же результат под ОС Astra Linux?
преобразование проекций средствами ГИС Конструктор под ОС Astra-Linux v.1.3, получение косой азимутальной равнопромежуточной проекции путём трансформации других проекций
 
Спасибо.  После добавления обнуления структур матрицы стали считаться.
Но есть проблема.
Видимо, в составе карты есть объекты, имеющие ошибки в 3D метрике. И, хотя я не использую при расчётах  3D метрику объектов, когда такие объекты попадают в область просчёта матрицы, происходит выдача окна диалога, в котором ни одна кнопка не работает, и закрытие которого вызывает аварийный останов программы :

<img src="http://storage4.static.itmages.ru/i/15/0203/h_1422961633_6213788_df5f078969.jpg">

Вот мой код :

<CODE>

       hMap = mapOpenData("MyMap.sit",0);

       BUILDMTW* param = new BUILDMTW;
       memset(param, 0, sizeof (BUILDMTW));
       param->StructSize = sizeof(BUILDMTW);
       param->BeginX = -4200000;
       param->BeginY = -4200000;
       param->Width  = 8400000;
       param->Height = 8400000;
       param->ElemSizeMeters = 2500;
       param->ElemSizeBytes  = 4;
       param->NotCheckDiskFreeSpace = 0;
       param->Unit = 0;    
       param->ReliefType = 0;  
       param->HeightSuper = 1;  
       param->Method = 2;
       param->LimitMatrixFrame = 2;
       param->NotUse3DMetric = 1;

       mapBuildMtw(hMap, "./MyMap.mtw", 0, param, 0);

</CODE>

В Панорама мини я отключаю в окне диалога учёт 3D метрики при просчёте абсолютных высот объектов, и далее всё считается нормально. Но в ГИС Конструкторе, во-первых, кнопки при выдаче подобного окна не работают, а во-вторых, сама программа предполагает выполнение расчёта в фоновом режиме по заранее заданным параметрам без ведения каких-либо диалогов.

Как изменить код, чтобы 3D метрика объектов не мешала вычислению матрицы?
И возможно ли как-то подредактировать исходную карту таким образом, чтобы автоматизированно исправить (или удалить) присутствующие в ней ошибки 3D метрики?
Изменено: Алексей Агулов - 03.02.2015 14:55:43
преобразование проекций средствами ГИС Конструктор под ОС Astra-Linux v.1.3, получение косой азимутальной равнопромежуточной проекции путём трансформации других проекций
 
С фильтрацией проблема решена. Всё получилось!

Остался последний вопрос - построения матрицы высот для сформированной проекции.

Сейчас у меня для этого существует код:

<code>

hMap = mapOpenData("MyMap.sit",0);

BUILDMTW* param = new BUILDMTW;
param->StructSize = sizeof (BUILDMTW);
param->BeginX = -900000;
param->BeginY = -900000;
param->Width  = 1800000;
param->Height = 1800000;
param->ElemSizeMeters = 2500;
param->ElemSizeBytes  = 4;
param->Scale = 5000000;
param->Unit = 0;
param->ReliefType = 0;
param->HeightSuper = 1;
// param->FastBuilding = 2;
param->Method = 0;

mapBuildMtw(hMap, "./MyMap.mtw",0, param, 0);


</code>


При его выполнении выдаётся сообщение ""Building failure" и файл MyMap.mtw не формируется.
Если раскомментировать строку "param->FastBuilding = 2;", то программа вообще завершается с выдачей сообщения о неожиданном прекращении процесса.
Границы карты, как минимум, в 10 раз превышают границы заказанного района для построения матрицы.

Подскажите, что задано неверно, и где можно посмотреть пример правильного использования процедуры просчёта матрицы высот.
Изменено: Алексей Агулов - 28.01.2015 13:39:30
преобразование проекций средствами ГИС Конструктор под ОС Astra-Linux v.1.3, получение косой азимутальной равнопромежуточной проекции путём трансформации других проекций
 
Не совсем понял Ваш ответ относительно объектов "которые на другой стороне полушария, но должны быть видны".
Вы имеете ввиду географические полушария? Т.е. задавать объект-область поиска для метода mapSelectSeekArea(...) в таком виде, как показана зона А в предыдущем рисунке (в сообщении от 22.01.2015) не допускается?
Можно ведь после создания карты в новой проекции (азимутальной Гуама) для задания зоны А указать ломаную линию вдоль параллели Bn. При этом точки ломаной вычислять в геодезических координатах (это гораздо удобнее), и затем, используя процедуры из состава ГИС Конструктора, преобразовывать их в прямоугольные и уже потом добавлять в описание объекта-области поиска. Такой способ возможен, или нахождение географического полюса внутри задаваемого площадного объекта недопустимо?

И ещё Вы не ответили на вопрос, возможно ли при описании границ площадного объекта непосредственно указывать геодезические координаты (широта, долгота) или допустимы только прямоугольные координаты?
преобразование проекций средствами ГИС Конструктор под ОС Astra-Linux v.1.3, получение косой азимутальной равнопромежуточной проекции путём трансформации других проекций
 
Спасибо. Всё получилось!
Теперь ГИС Конструктор может строить азимутальные проекции не хуже ГИС Панорама мини.

Остаётся решить следующий вопрос - устранения наложения объектов невидимого полушария на объекты видимого полушария (со стороны полюса проекции). Ранее для решения этой проблемы Вы предложили следующее:
"Чтобы ограничить область отображения Вы можете на исходной карте (Карта мира цилиндрической проекции) нанести окружность с центром будущей азимутальной проекции. Затем скопировать объекты с обрезанием по заданному объекту (окружности) на другую карту. На промежуточную цилиндрическую или азимутальную. В этом случае не будет заворачиваний объектов за горизонт. Выполнение этой процедуры на лету при отображении в заданной проекции требует существенных временных затрат."

Согласен, что временные затраты на формирование проекции при выполнении фильтрации объектов неизбежно возрастут. Но, ввиду невозможности обхода данной процедуры, с этим придется мириться. Сократить эти затраты можно лишь упрощением алгоритма фильтрации.

Т.е., на настоящий момент для формирования азимутальной проекции имеется следующий код:

<code>
/////////////////////////

       hMap=mapOpenData("k0.map",0);  // открываем исходную карту

       MAPREGISTEREX mapreg;
       LISTREGISTER  listreg;
       memset((void*)&mapreg, 0, sizeof(mapreg));
       memset((void*)&listreg, 0, sizeof(listreg));
       mapreg.Length = sizeof(MAPREGISTEREX);
       listreg.Length = sizeof(LISTREGISTER);
       mapRegisterFromMapType(GEOGRAPHIC, &mapreg);
       mapreg.EllipsoideKind = SPHERE_WGS_84;
       mapreg.MaterialProjection = AZIMUTALEQUIDISTANTGUAM; // выбираем новый тип проекции
       mapreg.MainPointParallel = 89 * M_PI / 180.0; // широта полюса проекции
       mapreg.AxisMeridian = 0 * M_PI / 180.0; // долгота полюса проекции
       mapreg.Scale = 5000000;
       mapreg.FlagRealPlace = 1;
       mapreg.DeviceCapability = -1;
       mapreg.DataProjection = 1

       // создаём карту в новой проекции
       HMAP hMapNew = mapCreateMapEx("MyMap.sit", "Karta_mira.rsc", &mapreg, &listreg);
       HOBJ hObj = mapCreateSiteObject(hMap, hMap);
       HOBJ hTemp = mapCreateSiteObject(hMap, hMap);
       HSELECT hSelect = mapCreateSiteSelectContext(hMap, hMap);

       //// здесь следует задать условия фильтрации объектов ////

       int flag = WO_FIRST;
       while (mapSeekSiteSelectObject(hMap, hMap, hObj, hSelect, flag) != 0)
       {
           flag = WO_NEXT;
           // Сделать копию объекта, чтобы не нарушить
           // последовательность поиска объектов в mapSeekSiteSelectObject
           mapReadCopyObject(hTemp, hObj);
           // Перенос объекта на другую карту
           if (mapChangeObjectMap(hTemp, hMapNew, hMapNew) != 0)
           {
              // Запись на новую карту
              mapCommitObject(hTemp);
           }
       }
       
       mapFreeObject(hTemp);        
       mapFreeObject(hObj);
       mapDeleteSelectContext(hSelect);
       MapSortingWithEvent("MyMap.sit", 0, 0, 0, "./", 0);

/////////////////////////

</code>

Затруднение вызывает задание структуры hSelekt, описывающей область фильтрации объектов.
При этом указанная область может иметь форму окружности (как было предложено Вами) с центром в точке, совпадающей с полюсом проекции, или же можно реализовывать упрощённый алгоритм фильтрации по геодезическим координатам, например, такой:

1.
Зная геодезические координаты полюса проекции (Bo,Lo), вычисляем предельные значения области проецирования (в градусах):
предельная широта с севера Bn = Bo + 90,
предельная широта с юга        Bs = Bo - 90,
предельная долгота слева Ll = Lo - 90,
предельная долгота справа Lr = Lo + 90.
Полученные величины приводим к допустимому диапазону их значений:
       если Bn > 90, то Bn = 180 - Bn,
если Bn < -90, то Bn = -180 - Bn,
если Ll < -180, то Ll = Ll + 360,
если Lr > 180, то Lr = Lr - 360.

2.
Выполнение, собственно, фильтрации.
На новую проекцию переносятся только объекты, удовлетворяющие хотя бы одному из двух условий.
Условие А:
если Bo < 0, широта объекта должна быть меньше Bs, иначе (если Bo > 0) широта объекта должна быть больше Bn;
при Bo = 0 условие А не рассматривается и работает только условие Б.
Условие Б:
если Bo = 90 или Bo = -90, условие Б не учитывается и работает только условие А,
иначе (если Bo лежит в диапазоне ]-90,90[ ) геодезические координаты объекта должны попадать в диапазон [Bn,Bs] по широте, а по долготе быть
               больше Ll и в то же время меньше Lr.

Иными словами, при нахождении полюса проекции на Экваторе, отсечение "невидимого" полушария происходит только по долготе за счет работы условия Б.
При совпадении полюса проекции с одним из географических полюсов отсечение "невидимого" полушария осуществляется только по широте за счет работы условия А.
В иных случаях на новую карту проецируются и зона А, и зона Б за счёт работы обоих условий:

<img src="http://i58.fastpic.ru/big/2015/0122/8a/b72ba0120060dd118d0536c78cd1188a.jpg">

Предполагаю, что описанный алгоритм будет работать несколько быстрее предложенного Вами за счёт того, что в нём нет необходимости вычислять расстояния от каждого из анализируемых объектов до полюса проекции, а достаточно лишь сравнить геодезические координаты объекта с их предельными значениями для выбранного положения полюса проекции. Это лишь незначительно увеличило бы временные затраты на формирование косой азимутальной проекции.


Ввиду всего вышеизложенного, прошу ответить на следующие вопросы:

1.
На Ваш взгляд, способна ли реализация описанного упрощённого алгоритма фильтрации существенно сократить временные затраты на формирование проекции по сравнению с предложенным Вами ранее вариантом построения окружности с центром будущей азимутальной проекции и последующей выборке объектов из заданной области?
Иными словами, какой из алгоритмов видится более предпочтительным с позиции сокращения временных затрат на вычисления?

2.
Каким образом описать в структуре hSelect границы области селекции объектов для предпочитаемого метода фильтрации?
В частности, если использовать для этого метод mapSelectSeekArea(...), то каким образом задавать границы используемого в нём объекта-области поиска (особенно если это окружность)? Обязательно ли при задании границ объекта указывать прямоугольные координаты или существуют методы создания объектов по геодезическим координатам (что в данном случае гораздо удобнее)?
Изменено: Алексей Агулов - 22.01.2015 11:38:32
преобразование проекций средствами ГИС Конструктор под ОС Astra-Linux v.1.3, получение косой азимутальной равнопромежуточной проекции путём трансформации других проекций
 
Спасибо. После добавления установки значения 1 в поле FlagRealPlace проекции стали формироваться корректно.
Единственное, после открытия в Панорама мини для правильного отображения сформированных проекций приходиться выполнять операцию Сортировки.
В чём её суть, и как это выполнить программно в ГИС Конструкторе?
преобразование проекций средствами ГИС Конструктор под ОС Astra-Linux v.1.3, получение косой азимутальной равнопромежуточной проекции путём трансформации других проекций
 
1. Преобразование из цилиндрической проекции в азимутальную составляет суть данной темы форума. Решению этой проблемы она и посвящена.
Обратное преобразование (из азимутальной в цилиндрическую) было сделано только ради эксперимента по Вашей же просьбе (Ваше сообщение от 4.12.2014), и какой в этом смысл должно было быть известно только Вам.

2. Весь программный код и карты готов предоставить (по фрагментам это уже было сделано).

3. ГИС Панорама мини справляется с этой задачей достаточно корректно без всякого разбиения на фрагменты. Решение проблемы заворачивания краёв мы обсуждали ранее. К тому же, на используемой карте присутствует только северное полушарие, что само по себе исключает наложение объектов противоположных полушарий. Доказательством тому вид проекции, построенной Панорамой мини (см. второй рисунок в моём сообщении от 4.12.2014).

На мой взгляд, механизм построения азимутальных проекций неточно перенесён из ГИС Панорама мини в ГИС Конструктор. Задача будет решена, если Конструктор сможет строить проекции так же, как это делает Панорама.
преобразование проекций средствами ГИС Конструктор под ОС Astra-Linux v.1.3, получение косой азимутальной равнопромежуточной проекции путём трансформации других проекций
 
Ну уж в этом я с Вами не могу согласится.
Во-первых. Выполненная процедура Сортировки никак не изменила внешний вид проекции.
Во-вторых. Что значит похожи?

<img src="http://i63.fastpic.ru/big/2014/1224/f8/ff1577809708b98eecbb3233ef1c3ff8.jpg">


<img src="http://i67.fastpic.ru/big/2014/1224/f0/492129afcc8688a8b37156ac22ddf9f0.jpg">


В каком месте эта похожесть и как пользоваться настолько искажённой картой? Достаточно обратить внимание на одну только розовую область, чтобы стал ясен масштаб искажений. И почему количество объектов сократилось с 31433 до 26348?

В-третьих, повторю предыдущее сообщение. Как объяснить, что тип проекции AZIMUTALEQUIDISTANTGUAM вообще не формируется?
Изменено: Алексей Агулов - 24.12.2014 11:17:51
преобразование проекций средствами ГИС Конструктор под ОС Astra-Linux v.1.3, получение косой азимутальной равнопромежуточной проекции путём трансформации других проекций
 
Какие будут комментарии по предыдущему сообщению?
И как объяснить, что тип проекции  AZIMUTALEQUIDISTANTGUAM вообще не формируется?
Страницы: 1 2 3 4 След.



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

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