[URL=http://www.gistoolkit.com/forum/messages/forum2/topic665/message2700/?result=edit#message2700]ПОСМОТРИТЕ ТУТ (красным жирным текстом)[/URL] + пример
Создание матрицы качеств по пользовательской карте
Пользователь
Сообщений: Регистрация: 26.12.2008
06.03.2009 17:12:45
1-й монолог [QUOTE]а когда я пытаюсь сделать это функцией mapBuildMtw в своей программе, передавая в качестве первого параметра HSITE пользовательской карты - функция падает[/QUOTE] Откуда берете параметр HSITE ? --------------------------- 2-й монолог [QUOTE]Попутно еще один вопрос: как "объяснить" функции mapBuildMtw, что строится матрица качеств, а не матрица высот.[/QUOTE]
Используя: // Построение матрицы качеств по массиву значений характеристики качества. // hMap - исходная карта для построения матрицы качеств // mtqName - полное имя создаваемой матрицы качеств // palette - адрес палитры создаваемой матрицы качеств, // если palette равно нулю - используется палитра по умолчанию // countpalette - количество цветов в палитре // pointArray - адрес массива значений характеристики качества // Координаты точек (pointArray->X,pointArray->Y) задаются в метрах // в системе координат векторной карты // pointCount - число точек в массиве pointArray // Размер в байтах массива, заданного адресом pointArray, должен // быть не менее pointCount * sizeof(XYHDOUBLE), в противном случае // возможны ошибки работы с памятью // elemSizeMeters - размер стороны элементарного участка в метрах на местности // (дискрет матрицы) // minValue,maxValue - диапазон значений характеристики качества создаваемой матрицы // качеств, если minValue >= maxValue - в матрицу заносится // фактический диапазон значений из массива pointArray // handle - идентификатор окна диалога, которому посылаются // сообщения о ходе процесса : // 0x0581 - сообщение о проценте выполненных работ (в WPARAM), // если процесс должен быть принудительно завершен, в ответ // должно вернуться значение 0x0581. // Если handle равно нулю - сообщения не посылаются. // При ошибке возвращает 0.
[B]_MAPIMP long int _MAPAPI mapBuildMtq(HMAP hMap, // 17/11/06 const char * mtqName, const COLORREF* palette, long int countpalette, const XYHDOUBLE * pointArray, long int pointCount, double elemSizeMeters, double minValue, double maxValue, HWND handle);[/B]
Изменено: - 06.03.2009 17:16:55
Проблема при получении массива высот из матрицы
Пользователь
Сообщений: Регистрация: 26.12.2008
05.03.2009 14:30:51
[QUOTE]это смертоубийство[/QUOTE] Советую написать функцию выбора высоты по кооринате в окне таким образом:
type TCardinalArray = array of cardinal;
function GetPositionHight(Matrix : TCardinalArray; X,Y, mean : integer): double; var Value : Cardinal; begin Value:=Items[Row*i+Col]; result:=-111111; if Value=$FFFFFFFF then exit; case mean of //АНАЛИЗ ПОЛЕЗНЫХ ДАННЫХ типа result:=Value/ (коефициент) end; end; ---------------------------------------- А вообще, советую изменить подход к анализу матрицы и использовать следующий код:
type TMatrix = array of array of double;
function CreateSurface(Map : HMap;Base:TDoublePoint;WidthM,HeightM,MinH : double):TMatrix; var Pnt,sPnt : TDoublePoint; i,j,cX,cY : integer; begin //очистка старых данных for i:=0 to LenGth(result)-1 do Finalize(result[i]); Finalize(result); if (Map=0) or (WidthM<MinH) or (HeightM<MinH) or (MinH=0) then exit; cX:=Round(WidthM/MinH); cY:=Round(HeightM/MinH); [B] SetLength(result, cY);[/B] for i:=0 to cY-1 do begin [B] SetLength(result[i], cX+1);[/B] Pnt.X:=Base.X+MinH*i; Pnt.Y:=Base.Y; sPnt:=Pnt; sPnt.Y:=Pnt.Y+MinH*cX; mapGetHeightArray(Map,[B]result[i,0][/B],cX,Pnt,sPnt); end; end; -------------------- При вызове его для Подольска с параметрами procedure TForm1.Button1Click(Sender: TObject); var MRT : TMatrix; B : TDoublePoint; begin B.X:=6158000; B.Y:=7420000; MRT:=CreateSurface(MV.MapHandle, B, 1000,1000,50); // ВОТ ТУТ Finalize(Mrt); end;
Получите набор готовых высот. При этом не необходимости а) анализировать еденицу измерения высоты б) делать дополнительный код преобразования координат X,Y Высоте MRT[A,B] будет соответсвовать точка с координатами (B.X+50*A, B.Y+50*B) ----------------------- а мой код, который Вы выделили ЦИТАТОЙ - показывает принцип анализа информации считанной с матрицы Вашим методом
Изменено: - 20.03.2009 14:31:17
Проблема при получении массива высот из матрицы
Пользователь
Сообщений: Регистрация: 26.12.2008
04.03.2009 19:52:48
Здравствуйте господин Victor ! Судя по стилю программирования, обсуждается мой код. Постараюсь как-то ответить. [QUOTE]В итоге получается, что Row и Col больше реальных габаритов матрицы[/QUOTE] Не могу сказать точно, скажет скорее всего один из разрабочиков, но могу предположить что лишние строчки - это пустоты в полезных данных матрицы. а [QUOTE]то есть Items при чтении содержит кучу лишних строк и столбцов со значениями 2^31-1.[/QUOTE] скорее всего значения -111111. ($FFFFFFFF или белый цвет или -1 что одно и то же) и обозначают отсутствие полезных данных. [QUOTE]Откуда берётся это несоответствие и как с ним бороться?[/QUOTE] Попробуйте отфильтровать пустоты приблизительно таким условием for i:=0 to Row-1 do for j:=0 to Col-1 do if Items[Row*i+Col]<>$FFFFFFFF then begin //АНАЛИЗ ПОЛЕЗНЫХ ДАННЫХ end;
Работа с компонентой TMapFind (Паскаль)
Пользователь
Сообщений: Регистрация: 26.12.2008
03.03.2009 14:21:30
Спасибо помогло но. Срабатывает через раз. ПОДРОБНО: При открытом проекте в Делфи - не срабатывает При работе с ЕХЕ-шником срабатывает ----------------------------------- Тему далее можно не развивать, методом "научного ..." вычислено, что при определенной последовательности команд срабатывает в обоих случаях (ВОТ ТАК): ----------------------- MapFind.Active:=false; MapFind.MapSelect.ClearSemantic; MapFind.MapSelect.MapSites[-1] := false; MapFind.MapSelect.MapSites[1] := true; MapFind.MapSelect.AddSemantic(3000,Column.Field.DataSet.FieldByName('ID').AsString,SC_EQUAL); MapFind.Active:=true; MapFind.Center; ------------------------- СПАСИБО ЗА ОТВЕТ. ПОМОГ.
Изменено: - 03.03.2009 14:22:26
Работа с компонентой TMapFind (Паскаль)
Пользователь
Сообщений: Регистрация: 26.12.2008
02.03.2009 22:13:28
Здравствуйте господа Разработчики ! Подскажите пожалуйста каким образом организовать поиск используя компоненту TMapFind (работа в Делфи) при на одном из подсоедененных Ситов (свойство MapView.MapSites)
К примеру: в моем случае TMapView содержит 3 карты (1 -базовая подложка и 2 рабочих Сита) на одном из Ситов есть 2 объекта с семантикой 3000 и значениями 4 и 5. В БД этим значениемя соответсвуют 2 отдельные записи с индексами 4 и 5 соответсвенно.
Указанный ниже кусок кода ВСЕГДА!!! выбирает объект который создан первым то есть с кодом 4 хотя значение Column.Field.DataSet.FieldByName('ID').AsString - менятеся 4<->5 ?
---------------------- if ROUTES.RecordCount>0 then begin MapFind.MapSelect.AddSemantic(3000,Column.Field.DataSet.FieldByName('ID').AsString,SC_EQUAL); MapFind.Active:=true; MapFind.Center; MapFind.Active:=false; MapFind.MapSelect.ClearSemantic; end; ------------------------ Если в TMapView закинуть единственный СИТ (с описанными выше объектами) - ПРОБЛЕМ НЕТ находит и 4=й и 5-й объект -----------------------
Ошибка в функции mapCommitObject
Пользователь
Сообщений: Регистрация: 26.12.2008
02.03.2009 20:49:16
Как говорил один мой знакомый - не буду вдаватся в дискусии просьба проверить данный код: --------------------------- Map:=mapOpenMap('E:\@map\WGS84\Statistic.sit',GENERIC_READ or GENERIC_WRITE); Obj:=mapCreateSiteObject(Map,Map,KM_IDFLOAT2,0); mapRegisterObject(Obj, 10000000, OL_MARK); X:= 5600000; Y:= 5E13; mapAppendPointPlane(Obj,X,Y,0); if mapCommitObject(Obj)=0 then MessageBox(0,'','',0); mapFreeObject(Obj); mapCloseMap(Map); ------------------------------- Карта E:\@map\WGS84\Statistic.sit - обычный сит в СК - UTM, еллипсоид WGS84 создан в любой части Восточной Европы осевой мередиан и паралели значения не имеют -------------------------------
PS: только что обновил Гистоолкит на 10.1.1 - ошибка с указанная выше исчезла НО: Y:= 5E13; - вполне нормальное значение с плавающей запятой [QUOTE]Например, переменные, которые объявлены, но не проинициализированы[/QUOTE] (в Паскале переменные не инициализируются - один из плюсов по отношению к Си)
Изменено: - 02.03.2009 20:50:52
Получение массива значений высот из матрицы, каким способом?
Пользователь
Сообщений: Регистрация: 26.12.2008
02.03.2009 19:39:02
Давно хотел пожаловаться. Темы и вопроса подходящего не было ------------------- Владимиру Патейчуку: [QUOTE]Все недостающие можно объявить там же или в своем приложении.[/QUOTE] А почему ничего не надо обьявлять в Си ? Или КБ не признает язык Паскаль, языком программирования? PS: Пришлось целый модуль писать который переводит файлы *.h в аналогичные *.pas
Изменено: - 02.03.2009 19:39:59
Получение массива значений высот из матрицы, каким способом?
Пользователь
Сообщений: Регистрация: 26.12.2008
02.03.2009 14:41:49
Здравствуйте Владимир Сергеевич я плохо понимаю С# но код ниже на Паскале может Вам как-то поможет выйсти с ситуации
procedure TForm1.Button1Click(Sender: TObject); var fSize, row, col : integer; meas : integer; full : integer; Items : array of cardinal; begin meas:=mapGetMtrMeasure(MV.MapHandle, 1); fSize := mapGetMtrElementSize(MV.MapHandle, 1); Row := mapGetMtrElementRow(MV.MapHandle, 1); col := mapGetMtrElementColumn(MV.MapHandle, 1); full:= Row * Col; SetLenGth(Items, full); mapGetMtrFrame(MV.MapHandle, 1, @Items[0], 0, 0, Col,Row, Col*fSize); for col:=155000 to 155200 do case meas of // 0-м, 1-дм, 2-см, 3-мм 0: m1.Lines.Add(IntToStr(Items[col])); 1: m1.Lines.Add(IntToStr(Items[col] div 10)); 2: m1.Lines.Add(IntToStr(Items[col] div 100)); 3: m1.Lines.Add(IntToStr(Items[col] div 1000)); end; Finalize(Items); end; ---------------------------------- Зная язык Си в качестве плохого переводичка думаю что Ваш код будет выглядеть приблизительно так:
int Meas = MapAccess.mapGetMtrMeasure(hHeightMap, 1); int Size = MapAccess.mapGetMtrElementSize(hHeightMap, 1); // = 4 int Row = MapAccess.mapGetMtrElementRow(hHeightMap, 1); int Column = MapAccess.mapGetMtrElementColumn(hHeightMap, 1);
int FullSize = Row * Column ; int[] bytes = new byte[FullSize];
for (X = 0; X <= FullSize; X += 1) { double R = 0; switch(meas) {case 0: { R=bytes[x]; break; } case 1: { R=bytes[x]/10; break; } case 2: { R=bytes[x]/100; break } case 3: { R=bytes[x]/1000; break } } } ------------------- Обратите внимание результирующий массив не байтовый а целочисленный по 4 байт на ячейку !!!
Изменено: - 02.03.2009 14:43:26
Ошибка в функции mapCommitObject
Пользователь
Сообщений: Регистрация: 26.12.2008
01.03.2009 15:15:43
Здравствуйте господа разработчики (еще раз)! Просьба исправить реакцию mapCommitObject на некорректные данные согласно описанию: // ........ // При ошибке возвращает ноль _MAPIMP long int _MAPAPI mapCommit(HOBJ info); _MAPIMP long int _MAPAPI mapCommitObject(HOBJ info); --------------------------------- СИТУАЦИЯ: карта WGS84, координаты в плане внесены с ошибкой: вот таким образом ----------- // Arr[i] - массив координат в плане!!! P.X:=Arr[i].X; P.Y:=Arr[i].X; mapAppendPointPlane(Obj, P.X, P.Y, 0); ---------- после вызова функции mapCommitObject(Obj) вместо того что-бы выдать 0 см. код case mapCommitObject(Obj)=0 of << в этом месте выдает [B]"Invalid float point Operation"[/B] true : isInside=(mapCheckInsidePoint(Obj,0,P)<>2); false : break; end;
mapFreeObject(Obj); --------------------- Посмотрите пожалуйста. Мне бы лучше что-бы в указаном месте, выдавало "0"