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

KFF (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » KFF
Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 ... 315 316 317 318 319 320 321 322 323 324 325 ... 327 След.
API Количество выделенных объъектов
 
[URL=http://www.gistoolkit.com/forum/messages/forum2/topic665/message2700/?result=edit#message2700]ПОСМОТРИТЕ ТУТ (красным жирным текстом)[/URL] + пример
Создание матрицы качеств по пользовательской карте
 
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]
Изменено: XENA - 06.03.2009 17:16:55
Проблема при получении массива высот из матрицы
 
[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)
-----------------------
а мой код, который Вы выделили ЦИТАТОЙ - показывает
принцип анализа информации считанной с матрицы Вашим методом
Изменено: XENA - 20.03.2009 14:31:17
Проблема при получении массива высот из матрицы
 
Здравствуйте господин 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 (Паскаль)
 
Спасибо помогло но.
Срабатывает через раз.
ПОДРОБНО:
При открытом проекте в Делфи - не срабатывает
При работе с ЕХЕ-шником срабатывает
-----------------------------------
Тему далее можно не развивать, методом "научного ..."
вычислено, что при определенной последовательности
команд срабатывает в обоих случаях (ВОТ ТАК):
-----------------------
 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;
-------------------------
СПАСИБО ЗА ОТВЕТ. ПОМОГ.
Изменено: XENA - 03.03.2009 14:22:26
Работа с компонентой TMapFind (Паскаль)
 
Здравствуйте господа Разработчики !
Подскажите пожалуйста каким образом организовать поиск используя компоненту
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
 
Как говорил один мой знакомый - не буду вдаватся в дискусии
просьба проверить данный код:
---------------------------
 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]
(в Паскале переменные не инициализируются - один из плюсов по отношению к Си)
Изменено: XENA - 02.03.2009 20:50:52
Получение массива значений высот из матрицы, каким способом?
 
Давно хотел пожаловаться. Темы и вопроса подходящего не было
-------------------
Владимиру Патейчуку:
[QUOTE]Все недостающие можно объявить там же или в своем приложении.[/QUOTE]
А почему ничего не надо обьявлять в Си ?
Или КБ не признает язык Паскаль, языком программирования?
PS: Пришлось целый модуль писать который переводит файлы *.h
в аналогичные *.pas
Изменено: XENA - 02.03.2009 19:39:59
Получение массива значений высот из матрицы, каким способом?
 
Здравствуйте Владимир Сергеевич
я плохо понимаю С# но код ниже на Паскале может Вам как-то поможет выйсти с ситуации

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];

Res = MapAccess.mapGetMtrFrame(hHeightMap, 1, ref bytes[0], 0, 0, Column, Row, Column * Size);

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 байт на ячейку !!!
Изменено: XENA - 02.03.2009 14:43:26
Ошибка в функции mapCommitObject
 
Здравствуйте господа разработчики (еще раз)!
Просьба исправить реакцию 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"
Изменено: XENA - 01.03.2009 15:16:54
Страницы: Пред. 1 ... 315 316 317 318 319 320 321 322 323 324 325 ... 327 След.



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

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