Всем привет! Как я и говорил раньше, со временем соберу самые интересные вопросы по 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.

Метки: , , , , ,




К записи “Работа с MapWindow GIS. Ответы на вопросы” оставлено комментариев: 21.

  1. Максим:

    Здравствуйте уважаемый андрей,мне очень нравяться ваши статьи. Можете связаться со мной? Нужна ваша консультация по api vkontakte. icq: шесть074044семь4

  2. Alexandr:

    Andrey Добрый день! у меня такой вопросик, как можно использовать MouseDown, MouseMove, отследить например что нажата правая кнопка мыши?

    • Andrey:

      надо для начала включить свойства
      Map1.SendMouseMove:=True;
      Map1.SendMouseDown:=True;
      А затем проверяйте просто

      procedure TForm1.Map1MouseDown(ASender: TObject; Button, Shift: Smallint;
      x, y: Integer);
      var
      xx,yy:double;
      begin
      if Button=Smallint(mbright) then
      ShowMessage(‘Right button active’);
      end;

  3. Alexandr:

    if Button=Smallint(mbright) then — Incompatible types

    надо для начала включить свойства
    Map1.SendMouseMove:=True;
    Map1.SendMouseDown:=True;
    включил и в свойсвах Map-а и в когде прописал не помогает

  4. Alexandr:

    Извините перезапуск Делфи помог все ОК! спасибо большое

  5. Alexandr:

    Да уж достаточно интересное). Интерактивный план здания, план эвакуации расположение Кабинетов, ПК, орг техники и прочего. опыта пока можно сказать нет, только вопросы одни. Вот один:


    count:=0;
    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));
    for i:=0 to ShapeLayer[count].shp.NumShapes-1 do
    begin
    ListBox2.Items.Add(ShapeLayer[count].shp.CellValue[1,i]);
    Memo1.Lines.Add(inttostr(ShapeLayer[count].shp.NumShapes-1));
    Map1.ShapeFillColor[HandleLayer,i]:=RGB(RandomRange(1,255),RandomRange(1,255),RandomRange(1,255));
    end;
    inc(count);
    end;
    end;

    Map1.ShapeFillColor не закрашивает области на слое, точнее все что есть закрашивается одним рендомным цветом. хотя на слое 3 полигона. может я что то не так делаю?

    • Andrey:

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

  6. Alexandr:

    У меня 4.8 с офф сайта! Не знаю насколько она стабильная конечно но последняя. А какую используете вы?

  7. Alexandr:

    Интересно у меня на 4.8.6 не работает ShapeFillColor, поставил 4.7 заработал))

    • Andrey:

      да, на 4.7 работает это все, но на 4.7 нет такого функционала как в 4.8.6, я вот буду писать по 4.8.6 интересную статью, так что ждите, может пригодиться

  8. Почти все GMT-инструменты посылают на стандартный выход код на языке post-script. Этот код является каким либо элементом карты. Стандартный выход мы можем просто перенаправить и записать в нужный нам файл или приписать к уже существующему («> file» или «>> file» после вызова утилиты). Этим достигается необычайная гибкость — одну карту мы рисуем последовательно вызывая утилиты, каждая из которых добавляет в файл свою порцию данных (рамка, изолинии, маршруты, точки, надписи, масштабная линейка, легенда и т.п.). По этой причине, последовательность вызовов утилит принято оформлять в shell-скрипт, незначительно отредактировав который мы можем перерисовать карту, или нарисовать новую. Скачать можно на офсайте по ссылке http://www.soest.hawaii.edu/gmt/ . Работать с программой начинающим довольно сложно , поэтому рекомендую данный сайт — http://gis-lab.info/docs.html .

  9. Женя:

    Здравствуйте, подскажите пожалуйста, как векторное изображение сохранить в других форматах (сделать экспорт в растровое изображение)?

  10. Женя:

    Да, при помощи MapWindowGIS

  11. Александр:

    Добрый день. подскажите каким образом можно в Windows MAP GIS отцентровать карту на конкретной точке?

  12. Александр:

    Проекция World Merkaator (Цилиндрический)

  13. Владимир:

    Многие лета, помогите нарисовать окружность заданного радиуса (например — 3км) с центром в заданной географической точке

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

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

*