Здравствуйте все, на этот раз статья по 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, это можно определить, исходя из условий в данном коде. Во-вторых, выделение с помощью двойного щелчка мыши, мы рассмотрим и без данного события.
В самом начале, мы сверяем, если курсор у нас в виде выделения, то мы переводим координаты мыши в географические координаты, и при выделении мыши, у нас области, которые охватил указатель мыши, при выделении — окрашиваются в желтый цвет, а границы задаются карсным цветом. Вот, что у меня вышло:
Идем дальше, чтобы выделить слой, при нажатии двойного щелчка мыши по 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 на моем блоге:
- Работа с MapWindow GIS. Обзор
- Работа с MapWindow GIS. Загрузка карт
- Работа с MapWindow GIS. Проекция карт
- Работа с MapWindow GIS. Настройки TMap
- Работа с MapWindow GIS. Конвертация Яндекс.Карт в Shape-файл
- Работа с MapWindow GIS. Работа со слоями
- Работа с MapWindow GIS. Работа с таблицами атрибутов
- Работа с MapWindow GIS. Загрузка растровых изображений. Тип Image
- Работа с MapWindow GIS. Выделение отдельных областей слоя