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

mapCreateMtq

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3 4 След.
RSS
mapCreateMtq
 
http://gistoolkit.ru/download/doc/mapapi.pdf
 
Цитата
Andrey Gheleznyakov пишет:
http://gistoolkit.ru/download/doc/mapapi.pdf
Все получилось, привожу код (код сырой, но суть будет понятна тем, у кого аналогичная проблема):
[DllImport(GisLibrary, CharSet = CharSet.Ansi)]
unsafe public static extern int mapCreateMtq(StringBuilder name, ref BUILDMTW parm, IntPtr projectiondata, IntPtr palette, int countpalette);

MapControl.BUILDMTW MTWProperties = new MapControl.BUILDMTW();
       
               MTWProperties.StructSize = (uint)(Marshal.SizeOf(MTWProperties));
               MTWProperties.BeginX = MapControl.MapAccess.mapGetMapX1(MapScreen1.MapHandle);
               MTWProperties.BeginY = MapControl.MapAccess.mapGetMapY1(MapScreen1.MapHandle);
               MTWProperties.Width = MapControl.MapAccess.mapGetMapY2(MapScreen1.MapHandle) - MapControl.MapAccess.mapGetMapY1(MapScreen1.MapHandle);
               MTWProperties.Height = MapControl.MapAccess.mapGetMapX2(MapScreen1.MapHandle) - MapControl.MapAccess.mapGetMapX1(MapScreen1.MapHandle);

               MTWProperties.ElemSizeMeters = 3;
               MTWProperties.ElemSizeBytes = 8;// TxElementSizeBytes.es64bit;

               MTWProperties.Unit = 3;// TxUnitHeight.uhMeter;
               // MTWProperties.ReliefType = 0;
               MTWProperties.Scale = 100000;
               MTWProperties.Init();
               //  MTWProperties.HeightSuper = 0;
               //    MTWProperties.Method = TxBuidlMtwMethod.bmMiddleIP16Smooth;

            //  
              // char* d = stackalloc char[20];
              /* for(int i = 0; i < 20; i++)
               {
                   MTWProperties.Reserve[i] = (char)0;
               }*/
               //MTWProperties.Reserve = d;

               UInt32[] palette = new UInt32[64];
               GCHandle handle = GCHandle.Alloc(palette, GCHandleType.Pinned);

               IntPtr pointer = handle.AddrOfPinnedObject();
               //  Marshal.StructureToPtr(palette, ptr1, false);

               String s = "C:/SCIENTIFIC_COMPANY/Matrixrrrrrr.mtq";
               StringBuilder sb = new StringBuilder(256);
               
               char* c = stackalloc char[s.Length];
               for (int i = 0; i < s.Length; i++)
               {
                   sb.Append(s[i]);
                   textBox1.Text += sb[i];
               }
               MTWProperties.StructSize = (uint)(Marshal.SizeOf(MTWProperties));
               int hMtq = -1;

               MapControl.MTRPROJECTIONDATA t = new MapControl.MTRPROJECTIONDATA();
               t.Init();

               if (File.Exists(s))
               {
                   hMtq = MapControl.MapAccess.mapCreateMtq(sb, ref MTWProperties, IntPtr.Zero, pointer, 64);
               }
 
Возник новый вопрос: в чем разница между mtr и mtq? Почему для них используются разные алгоритмы?
Могу ли я добавить матрицу качеств (mtq) с помощью MapMtrs.Append(), а не с помощью mapOpenMtqForMap()?
 
Методом MapMtrs.Append() добавить матрицу качеств можно, но ГИС ядро будет считать, что это матрица высот.
Разные алгоритмы - из-за разных предметных качеств: в одном случае - это высота (со всеми вытекающими последствиями и возможностью обработки как высоты), в другом случае - это некое число, интерпритация которого ложится на плечи автора...
 
Возник вопрос по палитре в C#:
private uint RGB(int r, int g, int b)
{
   return (uint)(255 + 0x100 * 255 + 0x10000 * 255); //RBG->COLORREF
}
...
           uint[] palette = new uint[10];
           
           palette[0] = RGB(255, 255, 255);
           palette[1] = RGB(0, 255, 255);
           palette[2] = RGB(0, 235, 235);
           palette[3] = RGB(0, 215, 215);
           palette[4] = RGB(0, 195, 195);
           palette[5] = RGB(0, 175, 175);
           palette[6] = RGB(0, 155, 155);
           palette[7] = RGB(0, 135, 135);
           palette[8] = RGB(0, 115, 115);
           palette[9] = RGB(0, 95, 95);
...
int rcPalette = MapControl.MapAccess.mapSetMtqPalette(hMtq, //вызываю API-функцию
               GCHandle.Alloc(palette, GCHandleType.Pinned).AddrOfPinnedObject(), palette.Length, 1);

Cреди цветов в итоге отображаются только синий и черный (еще иногда прозрачный, когда именно - пока не разобрался). Причем синий и черный остаются независимо от заполнения палитры и ее длины. Подозреваю, что дело может быть в uint или в переводе RGB в COLORREF.
 
Может чего не понимаю, но где используются входные параметры?
Цитата
Андрей Рогаль пишет:
private uint RGB(int r, int g, int b)
{
return (uint)(255 + 0x100 * 255 + 0x10000 * 255); //RBG->COLORREF
}
 
Да, позорная опечатка, но, к сожалению, проблема была не в ней, а возникла еще до того, как я написал эту функцию.
При исправленной
       private uint RGB(int r, int g, int b)
       {
           return (uint)(r + 0x100 * g + 0x10000 * b);
       }
имею следующее изображение
GIS.JPG (253.21 КБ)
Изменено: Андрей Рогаль - 24.02.2016 10:46:27
 
А есть уверенность, что матрица заполняется правильно? Для информации - размер матрицы должен быть порядка 800 Мб.
 
800мб? Если не секрет, что там на 800мб? Полагаю, объем сильно зависит от площади элементарного участка и других параметров.
У меня вес не доходит и до мегабайта, но могу сказать следующее:
Матрицу заполняю последовательно числами от 0 до 1000:
           double step = 1;
           for (double X = BegX; X <= EndX; X += Elem)
           {
               for (double Y = BegY; Y <= EndY; Y += Elem)
               {
                   if (step > 1000) step = 0;
                   MapControl.MapAccess.mapPutMtqValue(hMtq, 1, X, Y, step);
                   double f = MapControl.MapAccess.mapGetMtqValue(hMtq, 1, X, Y);
                   step++;
               }
           }

1. mapGetMtqValue дает правильные значения
2. Прозрачные, черные и синие полосы соответствуют обнулению значения матрицы в точке
3. Размер полос растет с ростом площади элементарного участка
 
По картинке определил, что работаем с картой из инсталляции.
Габариты карты грубо 30 000 метров.
Вы задали следующие параметры
MTWProperties.ElemSizeMeters = 3; - получается 10 000 элементов по горизонтали и вертикали
MTWProperties.ElemSizeBytes = 8; - 8байт * 10 000 * 10 000 = 800 Мб
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)



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

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