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

Перестала рисоваться линия на карте

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 След.
RSS
Перестала рисоваться линия на карте, mapViewUserObject
 
Здравствуйте!

Установили GisToolKit13
перестала работать нанесение линии на карту.

Было так:

//---------------------------------------------------------------------------
//  Нарисовать на карте многоугольник
// --------------------------------------------------------------
procedure PaintRect;
begin
MapTopLeft.X:=form_main.mvMap.MapLeft;
MapTopLeft.Y:=form_main.mvMap.MapTop;
form_main.mvMap.ConvertMetric(MapTopLeft.X, MapTopLeft.Y, PP_PICTURE, PP_PLANE);
mapViewUserObject(form_main.mvMap.MapHandle,form_main.mvMap.Handle, MapTopLeft, BlueLine, Data, integer(PP_MAP));
end;

procedure Tform_main.FormCreate(Sender: TObject);
begin
SelectPoints := 0; // Количество заданных точек

Image.Color := $00F0F0F0; // black
Image.Thick := 250;       // mkm
Image.Dash  := 1250;      // stroke length
Image.Blank := 500;       // gap length

// Для рисования пунктира
Form.Image := IMG_DOT;  // пунктир
Form.Parm  := @Image;
Form.Mode  := R2_NOT;  // R2_XORPEN;

Data.Points:=@points;
Data.PolyCounts:=@SelectPoints;
Data.Count:=1;

BlueLine.Image := Maptype.IMG_LINE;
BlueLine.Parm  := @ImageLine;
BlueLine.Mode  := R2_COPYPEN;  // R2_XORPEN;
end;

procedure Tform_main.mvMapMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
// Нарисовать многоугольник
If SquareMode = true then
begin

SelectPoint := SelectPoint+1;
SelectPoints := SelectPoints+1;

points[SelectPoint].X := xx;
points[SelectPoint].Y := yy;

PaintRect();
// mapAppendPointPlane(ObjectSquare, points[SelectPoint].X, points[SelectPoint].Y, 0);
form_main.sbStatus.Panels.Items[0].Text := ' ВЫБЕРИТЕ СЛЕДУЮЩУЮ ТОЧКУ';
end;

Теперь это не работает.
Просим подсказать почему?
 
1.
просьба при публикации кода использовать соответствующее форматирование , очень трудно читать

2.
Код
points[SelectPoint].X := xx;
points[SelectPoint].Y := yy;


Вы берете координаты мыши без учета смещения карты в окне.
При MapLeft и/или MapTop отличных от нуля рисование может не попасть в видимую область карты.

3.
Код
SelectPoint := SelectPoint+1;

и так до бесконечности?
Код
points[SelectPoint].X := xx;
points[SelectPoint].Y := yy;

- вот тут в конце концов выйдете за пределы массива и будет access violation

4.
не увидел параметров ImageLine

5.
Код
mapViewUserObject(form_main.mvMap.MapHandle,form_main.mvMap.Handle, MapTopLeft, BlueLine, Data, integer(PP_MAP));

- координаты у Вас в пикселах, PP_MAP вообще использовать не стоит, передавайте либо в пикселах (но с правильным смещеением)

Цитата
// Отобразить произвольный объект в пределах фрагмента окна (карты)
// hmap   - идентификатор открытых данных
// hwnd  - идентификатор окна,
// point - координаты верхнего левого угла окна на карте
// в соответсвующей параметру place системе координат

// image - описание вида объекта (см. MAPGDI.H),
// data  - координаты объекта.
// place - вид системы координат (в точках экрана - PP_PICTURE, в метрах в
//         системе координат документа - PP_PLANE, в радианах на эллипсоиде
//         документа - PP_GEO)
// Координаты объекта заданы в соответствии с параметром place

_MAPIMP long int _MAPAPI mapViewUserObject(HMAP hmap, HWND hwnd,
                                          DOUBLEPOINT *point,
                                          PAINTPARM *image,
                                          PLACEDATA *data,
                                          long int place);

При этом у Вас координаты верхнего левого угла окна на карте в метрах:
Код
form_main.mvMap.ConvertMetric(MapTopLeft.X, MapTopLeft.Y, PP_PICTURE, PP_PLANE);
 
Цитата
Денис Вицко написал:
не увидел параметров ImageLine

ImageLine                : Maptype.TIMGLINE;      // Описание пунктирной линии (контур фрагмента)

mapViewUserObject(form_main.mvMap.MapHandle,form_main.mvMap.Handle, MapTopLeft, BlueLine, Data, integer(PP_MAP));

BlueLine указана procedure Tform_main.FormCreate(Sender: TObject);

BlueLine.Image := Maptype.IMG_LINE;
BlueLine.Parm  := @ImageLine;
BlueLine.Mode  := R2_COPYPEN;  // R2_XORPEN;

Или это нет?
Изменено: Сергей Викторович - 21.04.2021 16:26:15
 
Цитата
Денис Вицко написал:
координаты у Вас в пикселах, PP_MAP вообще использовать не стоит, передавайте либо в пикселах (но с правильным смещеением)
Это

//---------------------------------------------------------------------------
//  Нарисовать на карте многоугольник
// --------------------------------------------------------------
procedure PaintRect;
begin
MapTopLeft.X:=form_main.mvMap.MapLeft;
MapTopLeft.Y:=form_main.mvMap.MapTop;
form_main.mvMap.ConvertMetric(MapTopLeft.X, MapTopLeft.Y, PP_PICTURE, PP_PLANE);
mapViewUserObject(form_main.mvMap.MapHandle,form_main.mvMap.Handle, MapTopLeft, BlueLine, Data, integer(PP_MAP));
end;

точно работало в GisToolKit12
Если сейчас по другому, то как правильно это написать?
 
Код
form_main.mvMap.ConvertMetric(MapTopLeft.X, MapTopLeft.Y, PP_PICTURE, PP_PLANE);
mapViewUserObject(form_main.mvMap.MapHandle,form_main.mvMap.Handle, MapTopLeft, BlueLine, Data, integer(PP_PLANE));
Преобразовали точку к PP_PLANE и передали на отрисовку PP_PLANE
 
Цитата
Сергей Викторович написал:
точно работало в GisToolKit12
Если сейчас по другому, то как правильно это написать?

Работать не могло, поскольку координаты линии Вы передаете в пикселах, координаты верхнего левого угла окна на карте в метрах, а в функцию указываете PP_MAP.
То есть полное несоответствие входных параметров.

Совет:
чтобы не путаться, переведите координаты мыши в mvMapMouseUp в метры с учетом смещения в окне (MapLeft и MapTop)
и передавайте и координаты линии, и координаты верхнего левого угла окна на карте в метрах, обязательно указав это в функции как PP_PLANE.

Лайфхак:
Всегда можно поиском найти функцию по исходным текстам GIS ToolKit и посмотреть на живом примере, как она используется.
 
Похоже я не понимаю, как эта функция работает.
Лучше понять по шагам.

Объявляем глобальные переменные
Var
BlueLine                     : TPAINTPARM;             // Вид контура фрагмента на экране
Image                         : Maptype.TIMGDOT;      // Описание пунктирной линии
ImageLine                 : Maptype.TIMGLINE;      // Описание пунктирной линии (контур фрагмента)
Data                           : TPLACEDATA;
SelectPoint                : integer; // Количество неограниченных точек
SelectPoints               : integer; // Количество всего выбранных точек
points                         : array [1..255] of TDOUBLEPOINT;
xx,yy                          : double;  // Глобальные координаты мыши

Первый шаг. Указываем чем рисовать линию на карте OnCreate на форме с картой.
begin
Data.Points:=@points;
Data.PolyCounts:=@SelectPoints;
Data.Count:=1;

BlueLine.Image := Maptype.IMG_LINE;
BlueLine.Parm  := @ImageLine;
BlueLine.Mode  := R2_COPYPEN;  // R2_XORPEN;

Image.Color := $00F0F0F0; // black
Image.Thick := 250;       // mkm
Image.Dash  := 1250;      // stroke length
Image.Blank := 500;       // gap length
end;

Второй шаг. Определяем координаты указателя мыши на карте
procedure Tform_main.MapPoint1ChangePoint(Sender: TObject);
var
dX, dY       : double;
begin
 if not mvMap.MapView
    then exit;

 if not MapPoint1.GetPoint(dX, dY)
    then exit;

 case MapPoint1.PlaceOut of
   PP_PLANE
       begin
        MapPoint1.GetPoint(xx, yy);
       end;
 end;
end;

Третий шаг. Считаем клики мыши по карте и рисуем линию пунктиром
procedure Tform_main.mvMapMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
SelectPoint := SelectPoint+1;
SelectPoints := SelectPoints+1;

points[SelectPoint].X := xx;
points[SelectPoint].Y := yy;

MapTopLeft.X:=form_main.mvMap.MapLeft;
MapTopLeft.Y:=form_main.mvMap.MapTop;
form_main.mvMap.ConvertMetric(MapTopLeft.X, MapTopLeft.Y, PP_PICTURE, PP_PLANE);
mapViewUserObject(form_main.mvMap.MapHandle,form_main.mvMap.Handle, MapTopLeft, BlueLine, Data, integer(PP_PLANE));
end;

Результат:
кликаем мышью по карте,
линия не наносится.
Изменено: Сергей Викторович - 22.04.2021 10:01:55
 
Текст интересный (всего не понять), например, ссылка идет на BlueLine.Parm  := @ImageLine;, а заполняется Image.Color := . Что получится в итоге не понятно. Хотелось бы ответить на конкретные вопросы, а не анализировать текст процедуры полностью, например, что такое xx в points[SelectPoint].X := xx?
Вам проще всего использовать компонент TMapObj и отображать объекты с его помощью.
 
Цитата
Andrey Gheleznyakov написал:
Хотелось бы ответить на конкретные вопросы
Мы объявили BlackLine                 : TPAINTPARM;             // Вид контура фрагмента на экране

BlackLine.Image := Maptype.IMG_LINE;
BlackLine.Parm  := @Image;
BlaclLine.Mode  := R2_COPYPEN;  // R2_XORPEN;

Заполняем Image                      : Maptype.TIMGDOT;      // Описание пунктирной линии
Image.Color := $00F0F0F0; // black
Image.Thick := 250;       // mkm
Image.Dash  := 1250;      // stroke length
Image.Blank := 500;       // gap length

Это правильно?
Изменено: Сергей Викторович - 22.04.2021 19:54:48
 
В принципе и это сработает (первые байты одинаковые), но если объявляете Maptype.IMG_LINE, то для наглядности, лучше использовать струтуру
TIMGLINE = packed record     // (128) ЛИНИЯ
  Color : TColor;        // Цвет линии (COLORREF)
  Thick : integer;       // Толщина линии
end;
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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