Работа с MapWindow GIS. Работа со слоями

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

Всем привет, как и обещал, сразу же возвращаюсь к написанию статей. Первая статья, после недельного перерыва, посвящена MapWindow GIS. А, рассмотрим мы, в этой статье: как работать со слоями компонента TMap, а точнее, как придать очертание краям карты; как разукрасить области в нужный нам цвет; как разместить на слоях надписи, линии и другое. Немного затронем работу с dbf-файлами, но об этом подробнее будет в следующих статьях. Хочу сказать, что тут ничего сложного нету, должно все у всех получиться и быть понятно. У меня на форме следующие компоненты

  • TButton — 3 шт
  • TMap
  • TColorBox

При загрузке shp-файла, мы сразу будем разукрашивать в нужный нам цвет области нашего слоя. При выборе конкретного значения цвета из компонента TColorBox, мы будем менять цвет контура всей карты.

На событие кнопки OnClick, по нажатию, на которую, мы загружаем наш shp-файл, я написал следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
 shp:Shapefile;
begin
   try
    if OpenDialog1.Execute then
     begin
      shp:=CoShapefile.Create;
      shp.Open(OpenDialog1.FileName,nil);
      Map1.Focused;
      idLayer:=Map1.AddLayer(shp,True);
      Map1.ZoomToMaxExtents;
      for i:=0 to shp.NumShapes-1 do
       begin
        Map1.ShapeFillColor[idLayer,i]:=RGB(RandomRange(0,255),RandomRange(0,255),RandomRange(0,255));
       end;
     end
    else
     exit;
   except
    on e:Exception do
     //-//-//-//-//-//
   end;
end;

Переменная idLayer у меня объявлена типа integer. Как видите, у меня здесь есть цикл, который каждую область слоя окрашивает в случайный цвет, что определено функцией RandomRange. Свойство ShapeFillColor, определяет заливку конкретной области слоя, а свойство NumShapes - общее количество.

Для того, чтобы сразу залить весь слой в один цвет, необходимо написать следующий код:

procedure TForm1.Button4Click(Sender: TObject);
begin
   Map1.ShapeLayerFillColor[idLayer]:=clred;
end;

Теперь перейдем к цвету самого контура карты. Для этого, на событие OnChange компонента TColorBox, я написал следующий код:

procedure TForm1.ColorBox1Change(Sender: TObject);
begin
   Map1.ShapeLayerLineColor[idLayer]:=ColorToRGB(ColorBox1.Colors[ColorBox1.ItemIndex]);
end;

Для того, чтобы каждую область нашего слоя, обвести разным цветом, то воспользуемся следующим кодом:

procedure TForm1.Button4Click(Sender: TObject);
var
 i:integer;
begin
   for i:=0 to shp.NumShapes-1 do
    begin
     Map1.ShapeLineColor[idLayer,i]:=RGB(RandomRange(0,255),RandomRange(0,255),RandomRange(0,255));
    end;
end;

Теперь приступим к нанесению на слой точек, линий, надписей. Начнем с точек. Нанесем, на каждый областной центр (область), по одной точке, для этого нам понадобится тот же цикл, что и при раскрашивании областей.

Код, который расставляет точки:

procedure TForm1.Button3Click(Sender: TObject);
var
 i:integer;
begin
   Map1.NewDrawing(dlSpatiallyReferencedList);
   for i:=0 to shp.NumShapes-1 do
    begin
     Map1.DrawCircle(shp.Shape[i].Point[0].x,shp.Shape[i].Point[0].y,4,clRed,True);
    end;
end;

Функция NewDrawing определяет то, что мы начинаем рисовать на нашем слое, параметром которой выступает тип рисования.

Далее с помощью процедуры DrawCircle мы размещаем круг, нужных нам размеров, думаю с параметрами тут все ясно. Также есть процедура DrawCircleEx, которая определяет, на каком слое рисовать круги (идентификатор слоя). Остальные геометрические фигуры рисуются аналогичным образом, я только лишь перечислю названия процедур:

  • DrawPolygon - рисование области
  • DrawPoint - рисование точки
  • DrawLine - рисование линии

И все теже процедуры, но с добавление Ex, которое означает, что необходимо еще указывать: на каком конкретном слое рисовать.

Ну и напоследок, нанесем метки на наш слой, а точнее какой-нибудь текст. В данном случае, текст, я буду брать из файла dbf, там находятся названия областей, городов и так далее, но глубоко объяснять я по-этому поводу не буду, так как данной теме будет посвящена целая статья.

Итак, следующий код, который расставляет:

procedure TForm1.Button2Click(Sender: TObject);
var
 i:integer;
 text:WideString;
begin
   for i:=0 to shp.NumShapes-1 do
    begin
     text:=shp.CellValue[1,i];
     Map1.AddLabel(idLayer,text,clRed,shp.Shape[i].Point[0].x,shp.Shape[i].Point[0].y,hjCenter);
    end;
end;

С помощью CellValue мы получаем значение из dbf-файла, где первым параметром является номер колонки, из которой получать значение, Вы должны его знать заранее.

С помощью AddLabel, мы, размещаем текст (метку) на нашем слое. С параметрами, думаю, тут все ясно. Скажу, только, насчет последнего параметра — он определяет расположение текста, относительно координат. Вот, что у меня получилось:


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

procedure TForm1.Button2Click(Sender: TObject);
var
 i:integer;
 text:WideString;
begin
   for i:=0 to shp.NumShapes-1 do
    begin
     text:=shp.CellValue[1,i];
     Map1.AddLabelEx(idLayer,text,clRed,shp.Shape[i].Point[0].x,shp.Shape[i].Point[0].y,hjCenter,45);
    end;
end;

У меня текст, относительно координат, расположен, по данному примеру, под 45 градусов, вот, что у меня получилось:

Если слой состоит из множество областей (например, около 500 и больше), то во время нанесение на него меток, линий, точек (в цикле имеется ввиду), может происходить зависание программы, что нейтрализуется путем введения потоков.

Facebook Vk Ok Twitter LinkedIn Telegram

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

Всех приветствую, хочу продолжить тему по MapWindow GIS в Delphi, а на этот раз хотелось бы поговорить о новой версии, которая вышла совсем недавно в июне, данного года, последняя версия сборки 4.8.2. Скачать можно с официального сайта MapWindow GIS, благо дан...
Всем привет, продолжаем тему с MapWindow GIS, а в особенности рассматриваем тему, которая посвящена именно выходу новой версии MapWindow GIS в виде ActiveX-компонента, в которой появилось достаточно много изменений, о которых (о некоторых) я вспоминал в данной...
Всем привет, данная статья будет посвящена — двум географическом-информационным системам: Яндекс.Карты совместно с MapWindow GIS в Delphi. Яндекс.Карты мы уже использовали в своих проектах, и рассматривали их (Static Api), теперь попробуем совместить эти два д...