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

Построение изолиний

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Построение изолиний, GISToolKit Active С#
 
   Здравствуйте. Подскажите пожалуйста есть ли функции MAPAPI, которые позволяют построить изолинии, к примеру по матрице качеств?
 
Посмотрите эти функции (в частности - mtrMtqToVector)
Скрытый текст
 
Здравствуйте!
Имею GTK (free) v.13.1.1.2 Delphi XE10.2
применяю mtrMtqToVector()
имею растр
по нему строю карту (*.sitx) с изолиниями

  ref := mtrMtqToVector(hMap, hSit, FMTQ.Number,
    0,          // isfilter:Integer;
    0,          //  hselect : HSELECT;
    @classesR,   // classes:PMTRCLASS;
    1,          // classcount:Integer;
    hObj,       // border:HOBJ;
    1,          //  iscuthole:Integer;
    Self.Handle);

https://d.radikal.ru/d09/2103/b0/1a7a4cd49674.jpg

Особенность первая.
наблюдаю ошибки построения  в виде как пропуска дискретов матрицы качества так и включение лишних
https://b.radikal.ru/b10/2103/93/b4eba981d3d0.jpg
https://a.radikal.ru/a31/2103/77/8e52290fe214.jpg

Особенность вторая.
Ожидаю что изолинии будут построены по задаваемым параметрам Мин и Мах из TMTRCLASS-а
так оно и происходит но надо добавлять к Мин некоторую дельту например 0.01 тогда построение верное
иначе будет
вот так
https://a.radikal.ru/a36/2103/4f/b7ae98994f33.jpg
(только рамка)

...
aDesc: TMTRDESCRIBE;
...
mvMap.FMapMtqs.NameMtqs[ GTKString(FMapMtqName)].GetMtqDesc(aDesc)


With classesR do
  begin
    Min:=aDesc.fMinHeightValue+0.01;
    Max:=aDesc.fMaxHeightValue+0.01;
    Excode := 22222000;
    Color          := clRed;
    SemanticNumber := 1;
    SemanticMin    := 1;
    SemanticMax    := 2;
    SemanticColor  := clRed;
  end;
к Max  тоже лучше прибавить иначе возможно неверное построение.



Что можно сделать для увеличения точности построения (не пропуска дискретов и наоборот невключения лишних      (// isfilter:Integer =0 или 1 никак не влияет) )
Рекомендации по выбору добавляемой "дельты" к полям Min, Max класса  TMTRCLASS передаваемого в mtrMtqToVector()  
Изменено: Алексей К - 29.03.2021 23:26:13
 
1. Алгоритм не работает при диагональном касании пикселей, поэтому перед обработкой в таких местах добавляются пиксели.
2. В матрице качеств может быть разный размер элемента в байтах от 1 до 8 (mapGetMtqElementSize) и разные единицы хранения (mapGetMtqMeasure), что влияет на ошибку округления при чтении значения матрицы. Видимо у вас матрицы имеют маленький размер элемента.
 
Спасибо за ответ но
по
1. Непонятно как это "добавлять пиксели". Я так понимаю что пиксели в данном контексте это дискрет(элемент) матрицы. Матрица построена с элементами 500 м, размерами примерно 10*10 км. Каждый элемент окружен другими элементами (если конечно не сбоку матрицы)
поэтому непонятно почему происходит как "не включение" соседнего элемента (см рис) или наоборот  исключение. Если пиксели это пиксели экрана(точки карты) то я сам бы не хотел бы анализировать фигуры и расширять  состыковки, делать там проходы в диагоналях. Теряется смысл автоматизации и использовании функций GTK
Ожидаю этого от  функции GTK.

2. Посмотрел матрицу, значения записываю туда как с плавающей точкой. mapGetMtqElementSize возвращает =4 из описания однако "long int"?, mapGetMtqMeasure возвращает 1 (дециметры). Поэтому непонятно что матрица хранящая число с плавающей точкой критична к таким значениям
и требует добавки к мин и мах значениям.
вот так создается данная матрица
 ...
 MtrParm.ElemSizeMeters := 500;    // Размер стороны элементарного участка в метрах на местности
 MtrParm.ElemSizeBytes := 4;
 MtrParm.FastBuilding := 1;
 MtrParm.Scale := mvMap.ViewScale;
 MtrParm.UnitH := 1;
...
 
1. Пиксели матрицы
2. При любом сравнении вещественных чисел используется некая дельта. В вашем случае значение хранится в файле в 4 байтовом int с дискретом 0.1. Если вам недостаточно точности 0.1, то создавайте матрицу с 8 байтовым элементом, что соответствует 8 байтовому вещественному числу.
PS Если разрешить диагональное касание пикселей одного класса, то задача имеет множество решений и будет невозможно отличить внешние границы от внутренних.
 
1. Погонял различные матрицы 53x53 км 10х10 с дискретом 500м. Упорное нежелание строить изолинии касающиеся по диагонали. Почему нельзя определить(сделать) из двух диагональных элементов матрицы качества два замкнутых   объекта изолиний, каждый из которых имеет свою метрику и касающиеся др. др.
Похоже выход только в создании уменьшенного шага дискретизации при создании матрицы. Но это ведет к резкому увеличению времени расчета а как писали тут на форуме и невозможности оперировать в GTK такими матрицами в памяти (читал что то про проблемы уже при  100-200 метров при 10х10км). Но как я понимаю проблема диагоналей не уйдет просто будет меньше ошибка  (по суммарной площади).

2. Не понял про дискрет 0.1 (откуда 0.1?), но в любом случае  я добавляю дельту 0.01 которая "перевешивает" . Но эта особенность  не критична предполагаю что и 0.001 поможет это можно включить в алгоритм как данность
Страницы: 1
Читают тему (гостей: 1)



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

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