19.02.2016 13:12:38
|
|
|
|
20.02.2016 10:52:54
[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); } |
|||
|
|
24.02.2016 10:46:10
Да, позорная опечатка, но, к сожалению, проблема была не в ней, а возникла еще до того, как я написал эту функцию.
При исправленной private uint RGB(int r, int g, int b) { return (uint)(r + 0x100 * g + 0x10000 * b); } имею следующее изображение
Изменено: |
|
|
|
24.02.2016 13:59:44
А есть уверенность, что матрица заполняется правильно? Для информации - размер матрицы должен быть порядка 800 Мб.
|
|
|
|
24.02.2016 16:36:57
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. Размер полос растет с ростом площади элементарного участка |
|
|
|
24.02.2016 17:42:14
По картинке определил, что работаем с картой из инсталляции.
Габариты карты грубо 30 000 метров. Вы задали следующие параметры MTWProperties.ElemSizeMeters = 3; - получается 10 000 элементов по горизонтали и вертикали MTWProperties.ElemSizeBytes = 8; - 8байт * 10 000 * 10 000 = 800 Мб |
||||
|
|
|||
© КБ Панорама, 1991-2024 Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности |