Работа с MapWindow GIS. Выделение отдельных областей слоя

6 минут на чтение

Здравствуйте все, на этот раз статья по MapWindow GIS в Delphi готовилась долго, просто времени не так уж и много, да и в принципе уже многое с MapWindow GIS разобрали, так что, приходится, что-то новое поискать и рассмотреть. В этой статье, мы рассмотрим, как можно выделять отдельные области, регионы или что-то другое на shp-слоях. Довольно очень популярный прием, который часто используется в своих приложениях. Мы, в данной статье, рассмотрим:

  • Как выделить область с помощью мыши
  • Как выделить область с помощью двойного щелчка мыши

Что касается первого вопроса, то Вы наверняка помните, стиль курсора TMap cmSelection, который принимает вид выделения, так вот, если им что-то попробовать выделить, то ничего не происходит, на этот раз, мы сделаем так, чтобы все у нас выделялось.

Что касается второго вопроса, то мы, получим название всех областей слоя, и отобразим их в компоненте TListBox, затем по двойному нажатию мыши, по нужной области в TListBox, мы будем ее также выделять на нашем слое.

Все это нам придаст визуального восприятия того, где какая область, регион расположен на нашем слое.

Приступим, в наш проект MapWindow GIS в Delphi, исходник, которого находится на вкладке Исходники, я добавил, дополнительно, следующие компоненты:

  • TPanel
  • TListBox

Далее, на событие OnClick кнопки, которая загружает в TMap shp-слой, я дописал следующий код:

Map1.SendSelectBoxFinal:=True;

Данный код, позволит нам активировать событие, которое отвечает за выделение отдельных областей карты.

Ну а далее, на событие OnSelectBoxFinal компонента TMap, я написал следующий код:

procedure TForm1.Map1SelectBoxFinal(ASender: TObject; left, right, bottom,
  top: Integer);
var
 xmin,ymin,xmax,ymax:double;
 ex:IExtents;
 ShpID:OleVariant;
 a:integer;
begin
   if Map1.CursorMode=cmselection then
   begin
    ex:=shp.Extents;
    Map1.PixelToProj(left,bottom,xmin,ymin);
    Map1.PixelToProj(right,top,xmax,ymax);
    ex.SetBounds(xmin,ymin,0,xmax,ymax,0);
    shp.SelectShapes(ex,0,INTERSECTION,ShpID);
    Map1.ShapeLayerFillColor[HandleLayer] := Map1.ShapeLayerFillColor[HandleLayer];  //reset the color of the shapes
    Map1.ShapeLayerLineColor[HandleLayer] := Map1.ShapeLayerLineColor[HandleLayer];
    For a := 0 To VarArrayDimCount(ShpID) do
     begin
      Map1.ShapeFillColor[HandleLayer, ShpID[a]] := clYellow;
      Map1.ShapeLineColor[HandleLayer, ShpID[a]] := clRed;
     end;
    end
   else
    begin
     ex:=shp.Extents;
     Map1.PixelToProj(left,bottom,xmin,ymin);
     Map1.PixelToProj(right,top,xmax,ymax);
     ex.SetBounds(xmin,ymin,0,xmax,ymax,0);
     shp.SelectShapes(ex,0,INTERSECTION,ShpID);
     Map1.ShapeLayerFillColor[HandleLayer] := Map1.ShapeLayerFillColor[HandleLayer];
     Map1.ShapeLayerLineColor[HandleLayer] := Map1.ShapeLayerLineColor[HandleLayer];
     Map1.ShapeFillColor[HandleLayer, ListBox1.ItemIndex] := clYellow;
     Map1.ShapeLineColor[HandleLayer, ListBox1.ItemIndex] := clRed;
   end;
end;

Разберемся по-порядку. Во-первых, данный код выделяет, как с помощью курсора, так с помощью двойного щелчка мыши, по нужной области, которая находится в TListBox, это можно определить, исходя из условий в данном коде. Во-вторых, выделение с помощью двойного щелчка мыши, мы рассмотрим и без данного события.

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

Хочу заметить!!! При загрузке shp-слоя, я дописал также код, который добавляет в TListBox — области данного слоя. При этом, я использовал для добавления — свойство CellValue, в котором указывал номер столбца, где хранятся названия всех областей, у меня это столбец под номером 2.

Идем дальше, чтобы выделить слой, при нажатии двойного щелчка мыши по TListBox, я на событие OnDbClick компонента TListBox, написал следующий код:

procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
   Map1SelectBoxFinal(sender,round(shp.Shape[0].Extents.xMin),round(shp.Shape[0].Extents.yMin),round(shp.Shape[0].Extents.xMax),round(shp.Shape[0].Extents.xMax));
end;

То есть, мы просто передаем значения  в нашу процедуру.

Можно было сделать просто так:

Map1.ShapeFillColor[HandleLayer, ListBox1.ItemIndex] := clYellow;
Map1.ShapeLineColor[HandleLayer, ListBox1.ItemIndex] := clRed;

Думаю статья, в дальнейшем, Вам пригодится, ну а обновленный исходник проекта MapWindow GIS в Delphi, скачивайте со страницы Исходники


Интернет безусловно грандиозное создание человечества. Но подумайте, где хранится вся информация, наверняка существует хостинг сайтов, который позволяет существовать интернет ресурсам.


Все статьи по MapWindow GIS на моем блоге:

  1. Работа с MapWindow GIS. Обзор
  2. Работа с MapWindow GIS. Загрузка карт
  3. Работа с MapWindow GIS. Проекция карт
  4. Работа с MapWindow GIS. Настройки TMap
  5. Работа с MapWindow GIS. Конвертация Яндекс.Карт в Shape-файл
  6. Работа с MapWindow GIS. Работа со слоями
  7. Работа с MapWindow GIS. Работа с таблицами атрибутов
  8. Работа с MapWindow GIS. Загрузка растровых изображений. Тип Image
  9. Работа с MapWindow GIS. Выделение отдельных областей слоя
Facebook Vk Ok LinkedIn Telegram

Похожие записи:

Доброго времени суток дорогие читатели блога, а особенно любителям MapWindow GIS. В данной статье я хотел бы рассмотреть возможность выделения объектов на слое, а также получение информации о данном объекте. Мы уже рассматривали тему в MapWindow GIS 4.7, как м...
Ну что, любитель MapWindow GIS, пора возвращаться к нашей теме. Давненько мы ничего интересного не рассматривали. Долго искал тему, чтобы такое новое и интересное написать про MapWindow GIS, в итоге нашел и решился. Помните нашу статью о том, когда мы выделяли...
Всех приветствую, хочу продолжить тему по MapWindow GIS в Delphi, а на этот раз хотелось бы поговорить о новой версии, которая вышла совсем недавно в июне, данного года, последняя версия сборки 4.8.2. Скачать можно с официального сайта MapWindow GIS, благо дан...