Не долго пришлось ждать следующей статьи — про 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;
В данном примере, получаем поочередно значение каждого столбца, очень удобный способ.
Ну вот и все, теперь Вы можете использовать данные таблицы атрибутов для своих целей, а исходник Вы можете скачать со страницы Исходники