Не долго пришлось ждать следующей статьи — про MapWindow GIS в Delphi, а тема ее — Работа с таблицами атрибутов, а точнее, работа, с тем самым, файлом dbf. Вообще, как Вы догадались возможно раньше, что приложен файл dbf - к shp-файлу не с проста. Вообще, если не будет присутствовать dbf-файла в одной директории и с одним именем, как и у shp-файла, то Вы просто-напросто не сможете отобразить у себя в проекте слой (карту). Так как в dbf-файле хранятся географические сведения объектов слоя (карты): название областей, штатов, городов, рек; координаты этих объектов и другие данные. Мы рассмотрим 3 случая доступа к данным dbf-файла. Один из этих случаев не с помощью средств MapWindow GIS. Вообще, насколько мне известно, то dbf-файл — это файл базы данных Paradox, и ее можно создать с помощью BDE Administrator, который входит в состав Delphi (с версии 7 точно входит). Если, открыть dbf-файл с помощью текстового редактора, то можно увидеть, что в нем перечислены название полей базы данных.

Способ № 1

Итак, первый способ доступа с помощью компонентов вкладки BDE. Будем использовать доступ, как к обычной таблице. На форму необходимо добавить компоненты:

  • TTable - с вкладки BDE
  • TDataSource - с вкладки Data Access
  • TDBGrid - с вкладки DataControls

Сразу скажу, что данный метод самый неправильный, но в тоже время самый удобный. Неправильный в том смысле, что нам необходимо получить имя shp-файла (без расширения) и и добавить к данному имени — dbf-расширение.

У компоненте TDBGrid в свойстве DataSource связываем с компонентом TDataSource. А компонент TDatasource в свойстве Dataset связываем с компонентом TTable.

Теперь на событие OnClick кнопки, которой открывается shp-файл, я написал код (привожу только часть, связанную с данной темой, но исходник будет весь):

procedure TForm1.Action1Execute(Sender: TObject);
var
 nameDB:WideString;
begin
   try
    if OpenDialog1.Execute then
     begin
      nameDB:=OpenDialog1.FileName;
      Delete(nameDB,length(nameDB)-2,3);
      nameDB:=nameDB+'dbf';
      Form2.Table1.TableName:=nameDB;
      Form2.DBGrid1.Font.Charset:=RUSSIAN_CHARSET;
      Form2.Table1.Active:=True;
     end;
   except
    on e:Exception do
     //-//-//-//-//-//
   end;
end;

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

Вот и смотрим, что у меня получилось:

Как видите, у нас все данные получены и мы их можем использовать для наших целей.

Способ № 2

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

procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
begin
   for i:=0 to shp.NumShapes-1 do
    begin
     ShowMessage(shp.CellValue[1,i]);
    end;
end;

Данный метод плох тем, что мы должны знать имя поля БД к которому обращаемся, но можно обращаться по его номеру. Кроме этого, свойство NumFields - определяет количество полей БД. Также данным способ, можно получить доступ к полям, с помощью свойств:

  • Field
  • FieldByName

Которые, собственно, знакомы нам из курса БД.

Способ № 3

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

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

Функции:

  • Open - открытие файла
  • Close - закрытие файла атрибутов

Свойства:

  • NumRows -количество строк в БД
  • NumFields - количество полей в БД
  • CellValue - определяет значение i-го столбца, j-строки
  • Field — тут все ясно, получает значение определенного поля БД.

Этот метод мне нравится тем, что необходимо указывать путь не к dbf-файлу, а к shp (указывать данный путь в функции Open). Пример работы, по данному способу:

procedure TForm1.Button1Click(Sender: TObject);
var
 i,j:integer;
 NewTable:Table;
begin
   NewTable:=CoTable.Create;
   if OpenDialog1.Execute then
    begin
     NewTable.Open(OpenDialog1.FileName,nil);
    end;
   for i:=0 to NewTable.NumRows-1 do
    begin
     for j:=0 to NewTable.NumFields-1 do
      begin
       ShowMessage(NewTable.CellValue[j,i]);
      end;
    end;
   NewTable.Close;
end;

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

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


Кто мог подумать, что появятся безлимитные мобильные тарифы, которые позволят выгодно общаться со своими друзьями, родственниками и знакомыми.


Все статьи по MapWindow GIS на моем блоге:

  1. Работа с MapWindow GIS. Обзор
  2. Работа с MapWindow GIS. Загрузка карт
  3. Работа с MapWindow GIS. Проекция карт
  4. Работа с MapWindow GIS. Настройки TMap
  5. Работа с MapWindow GIS. Конвертация Яндекс.Карт в Shape-файл
  6. Работа с MapWindow GIS. Работа со слоями
  7. Работа с MapWindow GIS. Работа с таблицами атрибутов

Метки: , , , , , , , ,




К записи “Работа с MapWindow GIS. Работа с таблицами атрибутов” оставлено комментариев: 11.

  1. Maringo:

    Скажите, пожалуйста, как создать метод Action1Execute для формы?))

    • Andrey53:

      конкретней, что Вам необходимо сделать, выполнить ActionExecute?, если да, то ActionExecute(Sender)

  2. Fortes:

    Здравствуйте! я студент выпускник.
    Я работаю с mapwingis и MS SQL SERVER 2008.
    Вопрос: 1.как отображать данных с различными легендами;
    2.в mapwingis как получить и отображать shapefile из MS SQL Server 2008?

    • Andrey53:

      1. С легендами я еще не разбирался
      2. Через блоб-поля

      • Fortes:

        Здравствуйте! как с помощью mapwingis загружать shp и отображать только те элементы, которые соответствуют с критерием выбора в атрибутивной таблицы? например, у меня есть слой для гостиниц, как отображать только те гостиницы, у которых 4 звезды? спасибо.

        • Andrey53:

          ShapeVisible[номер слоя, номер элемента, который скрывать]:=False
          Перед этим делаете свое условие

  3. Maringo:

    Ну, Action1Execute по сути как метод получается? Ругается, что нет определения данного метода.

  4. [...] Работа с MapWindow GIS. Работа с таблицами атрибутов [...]

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

Вы можете использовать следующие теги:

*