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

Раньше я говорил, что легенду можно сделать при помощи стандартных методов и компонентов Delphi, а можно сделать и даже лучше, при помощи стандартных методов и средств компонента TMap. Лично я, выбрал метод, когда можно сделать легенду, при помощи стандартных методов компонента TMap и именно про него я буду рассказывать дальше.

Никакой сложности, в разработке легенды нет, если Вы довольно неплохо работаете с MapWindows GIS, то Вам не составит никакого труда разработать легенду для Вашего проекта.

Также хочется заметить то, что уже февраль, и он приближается к концу, а вот новую версию MapWindow GIS 4.9 (ActiveX), обещали сделать к концу января, а ее все нет и нет, но надеюсь, из-за задержки, разработчики выпустят хорошую документацию и качественный релиз в ближайшее время.

Не забываем следить за проектом MapWindow GIS, а также помогать в разработке проекта, если Вам, конечно, это интересно.

Ну что, давайте теперь приступим к рассмотрению нашей темы. Для нашей статьи, мы, давайте, создадим проект в Delphi и разместим на главной форме следующие компоненты:

  • TButton – 2 шт
  • TMap (вкладка ActiveX)
  • TTreeView

У нас все стандартно. По нажатию на одну кнопку мы будем открывать какой-то слой, а в TTreeView мы будем отображать список наших слоев (название слоев). Легенду я буду делать, при помощи стандартных средств MapWindow GIS, о чем я говорил выше, это будет выглядеть, примерно следующим образом:

MapWindowGIS1.0.0.3

 

Как, видите, это выглядит намного эффектнее, чем сделать, при помощи, каких-нибудь компонентов Delphi, хотя кому как, да и на компоненте TMap, легенда будет занимать, для кого-то, возможно, лишнее место.

По нажатию на первую кнопку, мы будем загружать наш слой (shape-файл) и отображать его в компоненте TMap, а также будем заносить его название в компонент TTreeView (и отображать для названия слоя дочерние элементы, которые будут содержать данные, первого столбца *.dbf таблицы).

По нажатию на вторую кнопку, мы будем отображать, соответственно, легенду нашей карты, как я говорил выше, легенда будет содержать список слоев. Для каждого слоя, мы будем задавать ему цвет, а цвет будет выбираться случайным образом (random). Хотя Вы можете сделать это как-то по-другому (задавать конкретный цвет, для каждого слоя).

Ну что, хватит теперь теории, давайте приступим к практике. Для начала, мы напишем код, который позволит нам загружать shape-файлы в проект и отображать их в компоненте TMap, а название слоя в компоненте TTreeView. Для этого, на событие OnClick, нашей первой кнопки мы напишем следующий код:

procedure TForm1.Action1Execute(Sender: TObject);
var
 i:integer;
 shp:IShapefile;
 TN:TTreeNode;
begin
   if OpenDialog1.Execute then
    begin
     FName:=OpenDialog1.FileName;
     ShapeLayer[count].shp:=CoShapefile.Create;
     ShapeLayer[count].sname:=FName;
     ShapeLayer[count].shp.Open(ShapeLayer[count].sname,nil);
     ShapeLayer[count].nshp:=0;
     ShapeLayer[count].handle:=Map1.AddLayer(ShapeLayer[count].shp,True);
     StatusBar1.Panels[0].Text:='Количество слоев: '+IntToStr(Map1.NumLayers);
     TN:=TreeView1.Items.Add(nil,ExtractFileName(ShapeLayer[count].sname));
     for i:=0 to ShapeLayer[count].shp.NumShapes-1 do
      begin
       TreeView1.Items.AddChild(TN,ShapeLayer[count].shp.CellValue[1,i]);
      end;
     Map1.ZoomToMaxExtents;
     TreeView1.Selected:=TN;
     inc(count);
    end;
end;

Тут, я думаю, что Вам все понятно (сколько уже это проходили и делали). Имеется запись определенной структуры, в которой мы храним подробные данные о слое:

  • Название shape-файла (имя слоя)
  • Путь к shape-файлу
  • Идентификатор слоя
  • Сам shape-файл

Это я делаю для того, чтобы с каждым слоем было удобно работать, который отображен в компоненте TMap.

После того, как мы заполнили нашу структуру данными, мы заполняем компонент TTreeView названием слоев, а дочерние элементы будут содержать данные первого поля файла *.dbf, о чем я говорил выше. Хотя, можно сделать и без дочерних элементов.

Ну, вот и все, с загрузкой мы разобрались, теперь давайте разберемся с нашей легендой.

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

procedure TForm1.Action18Execute(Sender: TObject);
var
   text:WideString;
   i,y_count,x_count,ID:integer;
   R,G,B:integer;
begin
   if Action18.Checked=True then
    begin
     y_count:=20;
     x_count:=20;
     ID:=Map1.NewDrawing(dlScreenReferencedList);
     for i:=0 to count-1 do
      begin
       text:=ExtractFileName(ShapeLayer[i].sname);
       R:=RandomRange(100,255);
       G:=RandomRange(50,255);
       B:=RandomRange(25,255);
       Map1.DrawCircle(x_count,y_count,8,RGB(R,G,B),True);
       Map1.AddDrawingLabel(0,text,RGB(R,G,B),100, y_count, hjCenter);
       Map1.ShapeLayerFillColor[i]:=RGB(R,G,B);
       y_count:=y_count+20;
      end;
     end;
    if Action18.Checked=False then
     begin
      Map1.ClearDrawings;
     end;
end;

В принципе, тут вопросов тоже возникнуть не должно, но все-таки мы рассмотрим данный код более подробно.

В начале, мы получаем идентификатор нового типа рисования на компоненте TMap.

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

Далее, случайным образом (рандомно) мы получаем цвет для нашего слоя и легенды соответственно.

Далее мы рисуем круг на компоненте TMap, в левом верхнем углу. Цвет кругу задаем, который мы получили случайным образом. Далее, рядом с кругом, мы выводим метку (текст), то есть название нашего слоя, который мы получили выше и который будет точно таким же, как и в компоненте TTreeView. Необходимо просто хорошо подобрать координаты, чтобы текст и сам круг выводились друг с другом рядом и красиво.

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

Тут я еще дописал код, в зависимости от того, отображать легенду или нет. Если было повторно нажатие на кнопку отображать легенду слоев, то я стираю нашу легенду, при помощи метода ClearDrawings (вообще данным методом будет стерто все, что Вы нарисовали на компоненте TMap).

Вот примерно и все. Легенду, я Вам советую делать именно данным методом, оно смотрится эффективнее и красивее. Так же, Вы можете делать легенду таким способом абсолютно на разные данные, а зависимости от структуры Вашего Shape-файла.

Давайте разберемся, как можно сделать похожую легенду, при помощи стандартных методов и компонентов Delphi. Да, в принципе тут все просто, тоже самое получается. Можно выводить на канву, почти любого компонента те же круги и название наших слоев. Но тут проблема в том, что надо найти место в своем проекта для этого, а так мы это делаем все, внутри компонента TMap.

Таким образом, Вы даже можете рисовать диаграммы на TMap, если кого-то, это заинтересует, то можно будет рассмотреть.

Что касается следующих тем по MapWindow GIS, то я хочу в следующей статье рассказать о том, как работать со статическими картами Яндекса. Мы уже рассматривали эту тему, но мы не рассматривали эту тему, именно в связке с MapWindow GIS.

Это можно делать и со статическими картами Google, Вам останется только лишь выбрать.

Как выглядит связка MapWindow GIS и статические карты, Вы можете посмотреть на официальном сайте проекта.

Исходные коды статьи я не прикладываю, у Вас должно итак все получиться и прощаюсь с Вами до следующей статьи по MapWindow GIS.

Метки: , , , , ,

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*