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

Епифанов Сергей (Все сообщения пользователя)

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

Страницы: 1 2 3 4 5 След.
один край фрейма матрицы высот заполнен значением -32767000
 
[B]Александр Горбунов[/B], спасибо!

Почему же матрица высот может получаться больше сектора?
один край фрейма матрицы высот заполнен значением -32767000
 
[QUOTE]При запросе высот участка функцией mapGetMtrFrame Вы задаёте left = dY; top = dX; ? [/QUOTE]

Да. Это можно увидеть в конце приведенного ниже кода.

[QUOTE]Что значит "матрица строится квадратами" ? Как реализовано это построение ? [/QUOTE]

Матрица высот строится для каждого тайла, который пересекается с картой. Это происходит параллельно. При этом для каждого тайла создается файл с уникальным именем, потом строится и записывается в него матрица (функция API mapBuildMtwUn), потом открывается (mapOpenDataUn), в ней находится нужный фрейм (исп. функции API mapGetMtrDescribeUn, mapShowMtrByBorder и mapGetActualMtrFrame) из нее вынимается нужный фрейм (mapGetMtrFrame).

Все эти функции вызываются синхронно (каждая функция вызывается с использованием Native.synchronizedLibrary из JAVA JNA). Кстати тут возникает вопрос, "тяжелые" функции mapBuldMtwUn и mapGetMtrFrame - потокобезопасны? Потому что вызывать их синхронно получается очень, очень медленно.

Код без неважных подробностей:

[CODE]
// строим матрицу высот
final String pathToMatrix = getUniquePathToTempMatrixFile();
mapBuildMtwUn(hMap, pathToMatrix, "", params, 0)

// открываем файл матрицы высот
NativeLong hMtr = mapOpenDataUn(pathToMatrix, 0x100000);

// матрица высот получается больше сектора (в ней живут блоки 256х256 и другие причины)
// - и это нужно учесть: брать только часть матрицы в пределах сектора
MtrFrame frame = findRealMtrFrame(hMtr, params.ElemSizeMeters);

// заполняем память матрицей высот
Memory area = new Memory(frame.width * frame.height * params.ElemSizeBytes);
mapGetMtrFrame(hMtr, 1, area, frame.dY, frame.dX, frame.width, frame.height, 0);
[/CODE]
один край фрейма матрицы высот заполнен значением -32767000
 
Да, уточню, что после построения матрицы вычисляется ее фрейм -- подматрица с высотами того участка, который просили построить в функции mapBuildMTW (а эта функция делает матрицу большего размера). Потом высоты из этого фрейма запрашиваются функцией mapGetMtrFrame().

На случай, если проблема может быть связана с вычислением фрейма, вот этот код (это Java без лишних деталей):

[CODE]
MtrFrame findRealMtrFrame(long hMtr, double elemSizeMeters) {
// сначала получаем габариты всей матрицы (в метрах)
MTRDescribeUn mtrDescribe = new MTRDescribeUn();
mapGetMtrDescribeUn(hMtr, 1, mtrDescribe);
DFrame allMtrFrame = mtrDescribe.FrameMeters;

// теперь получаем фактические границы матрицы (в метрах)  
DFrame realMtrFrame = new DFrame();
mapShowMtrByBorder(hMtr, 1, 1);
mapGetActualMtrFrame(hMtr, realMtrFrame, 1);

// вычисляем нужную часть матрицы (в элементах матрицы)
int dX = (int) ((allMtrFrame.X2 - realMtrFrame.X2) / elemSizeMeters);
int dY = (int) ((realMtrFrame.Y1 - allMtrFrame.Y1) / elemSizeMeters);
int height = (int) ((realMtrFrame.X2 - realMtrFrame.X1) / elemSizeMeters);
int width  = (int) ((realMtrFrame.Y2 - realMtrFrame.Y1) / elemSizeMeters);

return new MtrFrame(dX, dY, height, width);
}[/CODE]
один край фрейма матрицы высот заполнен значением -32767000
 
Добрый день.

У нас есть .sit-карта, по ней строится матрица высот, но не вся сразу, а квадратами (на краю получаются прямоугольники). При этом часто значения на краю такого квадрата оказываются равны -32767000 метров, несмотря на то, что от края квадрата до края карты еще далеко. Прикладываю иллюстрирующую картинку (высоты со значением -32767000 метров на ней отображены как высоты с большим значением 5000 метров).

Параметры построения матрицы такие:

[CODE]
params.BeginX = sectorInMeters.X1;
params.BeginY = sectorInMeters.Y1;
params.Height = sectorInMeters.X2 - sectorInMeters.X1;
params.Width  = sectorInMeters.Y2 - sectorInMeters.Y1;
params.ElemSizeBytes = 4;
params.Unit = 0;
params.ReliefType = 0;
params.ElemSizeMeters = ... // (высчитывается, но не менее 20 метров и не более ширины и высоты матрицы)
params.Method = 2;
params.Extremum = 0;
params.UserType = 0;
params.HeightSuper = 0;
params.LimitMatrixFrame = 1;
params.NotUse3DMetric = 1;
params.SurfaceSquare3DObject = 0;
params.AltitudeMarksNet = 2;
params.LimitMatrixByFramesOfSheets = 0;[/CODE]
кодировка надписей на карте, *.sit карты под windows - c ёжиками.
 
Создал карту, в которой оставил только некоторые подписи. Сделал это с помощью экспорта в .txf с фильтром по типу объектов. Если потом обратно распаковать этот .txf, в получившемся .sit сохраняются ёжики, как и было изначально. При этом если открыть .txf в Notepad++, названия написаны корректно, без ёжиков (кодировка в Notepad++ выбрана "ANSI").

Прикладываю классификатор, карту в виде txf-архива и ту же карту, но распакованную, в архиве zip.
кодировка надписей на карте, *.sit карты под windows - c ёжиками.
 
Попробовал, не помогает. Есть ли вообще какие-то механизмы управления кодировкой на карте? Есть функция

[CODE] // Запросить/Установить кодировку шрифта карты
 // technology - тип устройства (DT_RASDISPLAY, DT_PLOTTER)
 //              определяемый функцией GetDeviceCaps(...)
 // index      - номер шрифта (0-4)
 // code       - (RUSSIAN_CHARSET, DEFAULT_CHARSET, ANSI_CHARSET)

_MAPIMP long int _MAPAPI mapGetMapFontCharSet(long int technology, long int index);
_MAPIMP long int _MAPAPI mapSetMapFontCharSet(long int technology, long int index,
long int code);[/CODE]

-- она позволяет решить проблему? Что ей подавать в первый параметр (вывод на дисплей - это какое число?), в третий параметр (каким числам соответствуют какие кодировки)?
mapBuildMTW() - как подавить сообщения на экран?
 
[B]Andrey Gheleznyakov[/B], спасибо!
Несоответствие габаритов карты паспорту карты (и реальности), функция mapGetMapX1()
 
Спасибо, я разобрался, действительно нужна [B]рамка[/B], получить ее габариты можно функцией mapGetListFrame().
Несоответствие габаритов карты паспорту карты (и реальности), функция mapGetMapX1()
 
Вероятно, я понимаю под этим рамку карты. В ГИС Панорама Мини: паспорт карты -> рамка карты -> геодезические координаты -> долгота Юго-Запад и долгота Северо-Запад -- 45 градусов ровно.

Одновременно, при отрисовке карты -- что в ГИС Панораме Мини, что через API -- можно воочию наблюдать границу: вот тут карта есть, а вот тут карты уже нет. Она пролегает тоже ровно по 45-му градусу. И именно она мне интересна.

Как мне получить число "45" через API? И что означает

[QUOTE]Рамка карты (код 91000000)[/QUOTE]

как получить по коду объекта значение?
mapBuildMTW() - как подавить сообщения на экран?
 
Добрый день,

Используем функцию mapBuildMTW(), передавая ей в качестве параметра -- хэндлера сообщений 0, что должно означать по ее описанию, что сообщения не посылаются. Однако, если, например, для построения матрицы высот в указанной области недостаточно данных - об этом выдается сообщение на экран. Что весьма неприятно (достаточно того, что функция возвращает ноль). Что же с этим делать?

Используем ГИС Toolkit 11.
Страницы: 1 2 3 4 5 След.



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

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