Работа с MapWindow GIS. Ответы на вопросы

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

Всем привет! Как я и говорил раньше, со временем соберу самые интересные вопросы по MapWindow GIS в Delphi, которые задавались на блоге и не только, и отвечу в одной статье, их совсем не много, но отвечу на самые интересные (и, конечно же, на которые я знаю ответ), а все потому, что не многие изучают данную ГИС в Delphi. Мы уже довольно много рассмотрели статей по MapWindow GIS, я на этом не собираюсь останавливаться, но раз здесь получается такая ознакомительная статья, то я хотел бы сформировать весь список статей по MapWindow GIS: для удобного поиска, в дальнейшем я хочу создать для MapWindow GIS отдельную страницу, где будет храниться вся информация с моего блога о MapWindow GIS (исходные коды, компоненты, уроки, статьи и так далее).

Список статей, доступный на данный момент по MapWindow GIS в Delphi:

  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. Static API+MapWindow GIS
  10. Работа с MapWindow GIS. Создание shape-файлов
  11. Работа с MapWindow GIS. Новая версия 4.8.2. Работа с метками
  12. Работа с MapWindow GIS. Новая версия 4.8.2. Сохранение настроек и опций
  13. Работа с MapWindow GIS. Новая версия 4.8.2. Создание диаграмм на картах
  14. Работа с MapWindow GIS. Ответы на вопросы

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

Вопрос 1: Как можно скопировать слой?

Ответ: Сам слой, это и есть сам shp-файл, который мы отображаем в компоненте TMap. Поэтому у интерфейса IShapeFile есть функция SaveAs, которая полностью сможет скопировать состояния текущего открытого, на данный момент, слоя и отображенного его в TMap. Пример:

procedure TGISForm.SpeedButton8Click(Sender: TObject);
var
 shp,shpCopy:IShapefile;
begin
   if OpenDialog1.Execute then
    begin
     shp:=CoShapefile.Create;
     shp.Open(OpenDialog1.FileName,nil);
     shp.SaveAs('C:\copy.shp',nil);
     shpCopy:=CoShapefile.Create;
     shpCopy.Open('C:\copy.shp',nil);
     Map1.AddLayer(shpCopy,True);
    end;
end;

 

Также имеется функция Clone, которая может копировать конкретную область слоя.

Вопрос 2: Как увеличить или уменьшить масштаб?

Ответ: Для увеличения или уменьшения масштаба используются процедуры ZoomIn и ZoomOut компонента TMap. Если необходимо уменьшить масштаб и сделать его 1:10, то необходимо написать следующее:

Map1.ZoomOut(10/1);

Не забывайте, что масштаб 1:10, является крупнее масштаба 1:25

Вопрос 3: Можно ли в Delphi, с помощью MapWindow GIS сохранять настройки слоя?

Ответ: Это возможно. Во-первых, это можно производить с помощью стандартных методов Delphi, например, использовать сохранение настроек в INI-файл: сохранять в каждую секцию цвет, масштаб, координаты и так далее, но это сильно долго и даже, наверное, не правильно. Поэтому в версии 4.8.2 есть метод SaveLayerOptions, который позволяет сохранить в XML-файл все настройки, а также соответствующий метод LoadLayerOptions, который позволяет загрузить все эти настройки. Подробно я писал в статье: Работа с MapWindow GIS. Новая версия 4.8.2. Сохранение настроек и опций.

Вопрос 4: Как осуществить самый просто поиск в MapWindow GIS?

Ответ: Если честно, то я с поиском не очень работал в MapWindow GIS. Если взять, например, большие ГИС, такие как QGis и много других, в них поиск, например, осуществляется по любому объекту: найти можно дорогу, дом и так далее, здесь конечно можно тоже так организовать, но придется потрудиться, начиная с самого shape-файла, а чтобы сделать по полному совпадению поиск, то я его сделал следующим образом:

procedure TForm3.BitBtn1Click(Sender: TObject);
var
 i:integer;
begin
   for i:=0 to Form1.ShapeLayer[0].shp.NumShapes-1 do
    begin
     if Edit1.Text=Form1.ShapeLayer[0].shp.CellValue[1,i] then
      begin
        Form1.Map1.NewDrawing(dlSpatiallyReferencedList);
    Form1.Map1.DrawCircle(Form1.ShapeLayer[0].shp.Shape[i].Point[0].x,Form1.ShapeLayer[0].shp.Shape[i].Point[0].y,0.5,clRed,True);
        Break;
      end;
    end;
   Close;
end;

 

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

Вопрос 5: Можно ли загружать несколько слоев на карту и работать с конкретным слоем?

Ответ: Конечно можно, либо было бы использовать MapWindow GIS совсем не интересно, так как найти сразу один готовый слой, например всей Московской области в shp-файле проблематично. Можно конечно найти карты в других форматах и переконвертировать их в shape-файл, но и то не факт, что это Вам удастся. Можно сделать самому карту полную, но это долго, поэтому ответ таков — используйте массив записи. Создайте запись с необходимыми параметрами: идентификатор слоя, имя слоя, сам shape-файл и работайте с каким угодно Вам. Я это реализовывал следующим образом. Объявил запись следующего вида:

type
 TShpRecord=record
  sname:String;
  shp:IShapefile;
  handle:Integer;
end;

 

В переменной sname-полный пусть к нашему shape-файлу

Переменная shp – для создания shape-файла

Handle – идентификатор слоя

Теперь объявить массив записи TShpRecord:

ShapeLayer:array[0..100] of TShpRecord;

Вот, например как добавлять новый shape-файл:

procedure TForm1.Action1Execute(Sender: TObject);
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].handle:=Map1.AddLayer(ShapeLayer[count].shp,True);
     ListBox1.Items.Add(ExtractFileName(ShapeLayer[count].sname));
     inc(count);
    end;
end;

 

Не забудьте обнулить переменную count. Теперь, когда вы добавляете слой, в TMap они все отображаются, а так как список слоев я добавляю в TListBox, то у меня TListBox.ItemIndex соответствует номеру слоя в массиве. Поэтому по нажатию по конкретному IntemIndex в TListBox, я могу задавать своем слою цвет, отображать или не отображать метки и так далее.

Вопрос 6: Можно ли на самих слоях рисовать?

Ответ: Насколько я знаю, на самих слоях рисовать нельзя, можно только на компоненте TMap, это тоже самое, что урок по нанесению меток на Ваш слой, и это тоже самое рисование, вместо меток мы можем разместить круги, квадратики, прямоугольники и так далее. Для этого необходимо lkz начала установить, что мы начинаем рисовать, это делается с помощью функции NewDrawing, а затем с помощью функции DrawCircle начать рисовать на самом компонент TMap, например:

Map1.NewDrawing(dlSpatiallyReferencedList);
 
Map1.DrawCircle(0,0,1,clRed,True);

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

Вопрос 7: Можно ли сделать легенду?

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

Вопрос 8: Почему в версии MapWindow GIS 4.8.2 не работают такие свойства, как, например, ShapeFillColor, ShapeLineColor и другие?

Ответ: Это все из-за своей «глючности» самой версии, как говориться «багги» всегда бывают, поэтому разработчики и выпустили такую не стабильную версию, почему только они выпускали под Final Realease не понятно. Поэтому, чтобы не было всяких этих проблем, необходимо перейти на MapWindow GIS 4.8.6 и все Ваши проблемы исчезнут, скачиваем с официального сайта также MapWindow GIS 4.8.6 Final Release и радуемся. Еще как вариант, можно вернуться на более ранние версии, например MapWindow GIS 4.7, но стоит ли? Так, что вперед и с песнями.

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

Также давайте будем двигаться вперед, и открывать новые горизонты в MapWindow GIS, ведь это же интересно. Следующая статья по MapWindow GIS: создание собственной легенды и простой поиск на карте.

Также можете мне помогать интересным материалами по MapWindow GIS в Delphi.

Facebook Vk Ok Twitter LinkedIn Telegram

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

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