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

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

Не долго пришлось ждать следующей статьи — про 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;

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

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

Facebook Vk Ok Twitter LinkedIn Telegram

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

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