Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MB60UG

.pdf
Скачиваний:
12
Добавлен:
13.02.2015
Размер:
1.47 Mб
Скачать

Глава 7: Работа с таблицами

Таблицы, содержащие растровые изображения

Таблицы, содержащие растровые изображения (без векторных графических данных), имеют лишь некоторые из компонент, перечисленных нами в предыдущем разделе. Это связано с тем, что таблице с растровым изображением не соответствуют никакие числовые данные. Каждая растровая таблица состоит из двух или более файлов: .TAB-файла (в нем хранится информация о контрольных точках изображения) и одного или нескольких файлов, содержащих собственно растровое изображение. Например, если растровая таблица основана на файле PHOTO.TIF, то такая таблица может состоять из двух файлов: PHOTO.TIF и PHOTO.TAB.

Во многих отношениях растровые таблицы сходны с обычными таблицами в MapInfo. Чтобы открыть растровую таблицу, надо выполнить оператор Open Table. Чтобы показать растровую таблицу в окне Карты, следует выполнить оператор Map. Чтобы добавить растровую таблицу в окно Карты, надо применить Add Map Layer. С другой стороны, к растровым таблицам неприменимы операции типа Select.

Чтобы узнать, является ли таблица растровой, следует обратиться к функции TableInfo( )

с параметром TAB_INFO_TYPE. Если таблица является растровой, TableInfo( ) возвратит код TAB_TYPE_IMAGE.

Как правило, MapInfo не вносит никаких изменений в исходный файл с растровым изображением, на котором основана та или иная растровая таблица. Поэтому:

При использовании оператора Drop Table для удаления растровой таблицы MapInfo удаляет .TAB-файл, но не удаляет файл с исходным растровым изображением.

При использовании оператора Rename Table для растровой таблицы MapInfo переименует .TAB-файл, но не изменит название файла с исходным растровым изображением.

При использовании оператора Commit для копирования растровой таблицы MapInfo скопирует только .TAB-файл, но не файл с исходным растровым изображением.

TAB-файл для растровых таблиц создается в тот момент, когда пользователь заполняет поля диалога "Регистрация изображения". Чтобы создать такой .TAB-файл в программе MapBasic, Вам следует использовать стандартные операции файлового ввода/вывода:

создать файл оператором Open File и поместить в него текст с помощью оператора Print #; см. пример ниже в этой главе.

В следующем примере программы показано, как создать .TAB-файл для растровой таблицы.

Замечание: В данной программе контрольным точкам присвоены произвольные координаты (а не реальные географические координаты, которые следует задавать). Поэтому полученную таблицу нельзя использовать для совмещения растрового изображения с векторными картами. Однако при использовании изображения, не связанного с географическими координатами (скажем, Вашего фирменного знака), проблем не возникнет.

135

Глава 7: Работа с таблицами

Include "mapbasic.def" Declare Sub Main

Declare Function register_nonmap_image(ByVal filename As String, ByVal tablename As String) As Logical

Sub Main

Dim fname, tname As String

fname = "c:\data\raster\photo.gif" 'файл с растровым

'изображением

tname = PathToDirectory$(fname)

+ PathToTableName$(fname) + ".tab" 'название создаваемой 'таблицы

If FileExists(tname) Then

Note "Растровое изображение уже было зарегистрировано; 'остановка."

Else

If register_nonmap_image(fname, tname) Then

Note "Создана таблица для изображения из файла: " + fname + "." Else

Note "Таблица не может быть создана." End If

End If End Sub

Function register_nonmap_image( ByVal filename As String, ByVal tablename As String) As Logical

register_nonmap_image = FALSE OnError GoTo handler

Open File tablename For Output As #1 FileType "MIta" Print #1, "!Table"

Print #1, "!Version 300"

Print #1, "!charset WindowsLatin1" Print #1

Print #1, "Definition Table"

Print #1, " File """ + filename + """"

Print #1, " Type ""RASTER"" "

Print #1, " (1,1) (1,1) Label ""Pt 1"", " Print #1, " (5,1) (5,1) Label ""Pt 2"", " Print #1, " (5,5) (5,5) Label ""Pt 3"" "

Print #1, " CoordSys NonEarth Units ""mm"" "

Print #1, " Units ""mm"" "

Print #1, " RasterStyle 1 45" ' Brightness; default is 50 Print #1, " RasterStyle 2 60" ' Contrast; default is 50 Close File #1

register_nonmap_image = TRUE ' установить значение, которое вернет ' функция

last_exit: Exit Function

handler:

Close File #1 Resume last_exit

End Function

136

Глава 7: Работа с таблицами

Работа с метаданными

Что такое метаданные?

Метаданные – это данные, хранящиеся в файле .TAB не в виде строк или колонок. Например, если Вы хотите записать сведения типа “кто и когда работал с данной таблицей”, Вам следует запомнить их в виде метаданных.

Метаданные не отображаются в стандартном интерфейсе пользователя MapInfo. Пользователи не могут видеть метаданных таблицы (если они не просматривают

.TAB-файл в текстовом редакторе или не запускают программу-пример TABLEMGR). Однако MapBasic-приложение может читать и записывать метаданные.

Каждая таблица может содержать (или не содержать) один или несколько ключей метаданных. Каждый ключ соответствует своему разделу, например, “имя автора”, “объявления об авторском праве”, и т.д. Например, ключ, именованный "\Copyright", мог бы иметь значение " Copyright 1995 Acme Corp.”

Как выглядят ключи метаданных?

Каждый ключ метаданных имеет имя, которое всегда начинается с символа "\" (наклонной черты влево). Имя ключа никогда не заканчивается этим символом. В имени ключа не различаются прописные и строчные буквы.

Значение ключа – это строка длиной не более 239 символов.

В таблице приведены примеры имен и значений ключей.

Имя ключа

Значение ключа (пример)

 

 

”\Copyright Notice”

”Copyright 1995 Горбунков.”

 

 

”\Info”

”Стамбул - город контрастов”

 

 

”\Info\Author”

”Семен Семеныч Горбунков”

 

 

”\Info\Date\Start”

”12/14/95”

 

 

”\Info\Date\End”

”12/31/95”

 

 

”\IsReadOnly”

”FALSE”

 

 

Отметим следующие моменты:

Пробелы внутри имен и значений ключей разрешены.

Вы можете определить иерархию ключей, используя имена, которые имеют два или больше символов (\). В приведенной таблице выше несколько ключей принадлежат иерархии, которая начинается с ключа "\Info". Устройство ключей в иерархиях разрешают работать со всей иерархией одновременно (например, Вы можете удалять всю иерархию одним оператором).

"\IsReadOnly" – специальный ключ, зарезервированный для внутреннего использования MapInfo. Когда Вы добавляете метаданные к таблице, MapInfo автоматически создает ключ \IsReadOnly. Не пытайтесь изменять его.

137

Глава 7: Работа с таблицами

В таблице выше каждая строка записана в кавычках, чтобы подчеркнуть, что она имеет строковое значение. Однако, когда Вы извлекаете ключи из таблицы, MapBasic не заключает их в кавычки.

Примеры работы с метаданными

Функция GetMetadata$( ) позволяет сделать запрос о метаданных таблицы, но только если Вы уже знаете точное имя ключа метаданных. Если Вы знаете, что таблица имеет ключ с именем "\Copyright", то следующее обращение к функции возвратит значение ключа:

s_variable = GetMetadata$(table_name, ”\Copyright”)

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

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

Metadata Table table_name

SetKey ”\Info\Author” To ”Семен Семеныч”

В следующем примере ключ удаляется.

Metadata Table table_name

Dropkey ”\Info\Author”

Здесь удаляется целая иерархия ключей. Все ключи, имена которых начинаются с “\Info\” , будут удалены.

Metadata Table table_name

Dropkey ”\Info” Hierarchical

Когда Вы используете оператор Metadata, чтобы записывать или удалять метаданные, изменения происходят немедленно. Вы не должны выполнять операцию Save.

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

Использовать оператор Metadata Table ... SetTraverse для инициализации просмотра имен ключей.

Использовать оператор Metadata Table ... Next, чтобы получить значение следующего ключа. Оператор возвращает имя ключа в строковой переменной. Обычно это следует повторять в цикле. Если ключа нет, оператор вернет пустое значение в качестве его имени.

Завершить поиск оператором Metadata Traverse ... Destroy.

Пример:

Sub Print_Metadata(ByVal table_name As String)

Dim i_traversal As Integer

138

Глава 7: Работа с таблицами

Dim s_keyname, s_keyvalue As String

Инициализация просмотра ключей. Укажите ”\” как

начальный ключ, просмотр начнется с первого ключа Metadata Table table_name

SetTraverse ”\” Hierarchical Into ID i_traversal

Попытка доступа к первому ключу:

Metadata Traverse i_traversal

Next Into Key s_keyname Into Value s_keyvalue

цикл по всем ключам Do While s_keyname <> ””

Print ” ”

Print ”Имя ключа: ” & s_keyname Print ”Значение: ” & s_keyvalue Metadata Traverse i_traversal

Next Into Key s_keyname Into Value s_keyvalue Loop

Закончим и освободим память:

MetaData Traverse i_traversal Destroy

End Sub

Полный синтаксис оператора Metadata приведен в Справочнике MapBasic и в Справочной

системе MapBasic.

139

Глава 7: Работа с таблицами

Работа со сшитыми таблицами

Что такое сшитая (seamless) таблица?

Сшитые таблицы позволяют группировать несколько таблиц вместе и обрабатывать их как одну таблицу. Если Вы сгруппировали Ваши таблицы в сшитую, Вы сможете добавлять всю группу к окну Карты в диалоге “Управление Слоями”.

Для введения в работу со сшитыми таблицами, см. Руководство пользователя MapInfo.

Как работать со сшитыми таблицами?

Комплект поставки MapInfo содержит программу MapBasic “Сшитые таблицы” (SEAMMGR.MBX), которая позволяет создавать такие таблицы и манипулировать ими. Чтобы увидеть, из чего составлена сшитая таблица, Вы должны действовать следующим образом:

Открыть сшитую таблицу, например, HIGHWAY.

Запустить приложение “Сшитые таблицы”.

Выполнить команду ПРОГРАММЫ > ÑШИТЫЕ ТАБЛИЦЫ > ÎТКЛЮЧИТЬ “ÑШИТОСТЬ”, чтобы отключить соответствующий атрибут для таблицы HIGHWAY.TAB

Выполнить команду ОÊÍÎ > ÍÎÂÎÅ ÎÊÍÎ Окна просмотра, чтобы отобразить таблицу в окне Списка.

Как и обычная таблица, сшитая содержит строки и колонки. Каждая строка соответствует включенной в нее таблице

Описания из второй колонки . . .

. . . попадают в окошко списка сшитой таблицы

Первый столбец в таблице содержит имена таблиц. Второй содержит описания, которые появляются в интерфейсе пользователя.

140

Глава 7: Работа с таблицами

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

Каждая строка в сшитой таблице имеет присоединенный графический объект, точно также как объекты присоединены к строкам в стандартных таблицах. Однако объекты в сшитой таблице не предназначены для отображения. Каждая строка в сшитой таблице содержит объект-прямоугольник, который определяет для соответствующей таблицы ее минимальное прямоугольное покрытие (MПП). Когда пользователь отображает сшитую таблицу в окне Карты, MapInfo сравнивает текущие размеры окна Карты с MПП. MapInfo открывает только те основные таблицы, для которых МПП виден хотя бы частично в окне Карты.

Синтаксис MapBasic для сшитых таблиц

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

Set Table DCMetroA Seamless Off

и затем откройте окно Списка для таблицы.

Вызывайте функцию TableInfo( , TAB_INFO_SEAMLESS ), если нужно узнать, является ли данная таблица сшитой.

Вызывайте функцию GetSeamlessSheet( ), если нужно вывести на экран диалог с приглашением выбрать таблицу из группы сшитых.

Ограничения при работе со сшитыми таблицами

Все основные таблицы в сшитой таблице должны иметь ту же самую структуру (то есть, одинаковое число столбцов, одинаковые имена столбцов и т.д..).

Обратите внимание на то, что некоторые операции MapInfo не могут использоваться со сшитыми таблицами. Например:

Вы не можете одновременно выбирать объекты более чем из одной базовой таблицы в сшитой таблице.

Оператор MapBasic Find не может искать во всей сшитой таблице; оператор Find может работать только с одной основной таблицей в каждый момент времени.

Вы не можете делать сшитую таблицу доступной для редактирования в окне Карты.

Вы не можете создавать тематическую Карту для сшитой таблицы.

141

Глава 7: Работа с таблицами

Доступ к удаленным данным

В предыдущих обсуждениях мы описывали, как работать с “локальными” таблицами MapInfo (таблицами на Вашем жестком диске или, возможно, на сетевом файл–сервере). Этот раздел содержит сведения о том, как MapBasic может обращаться к удаленным таблицам в сетях типа Oracle или Sybase.

Названия операторов и функций MapBasic, относящихся к этой теме, начинаются с ключевого слова Server, за исключением оператора Unlink. Подробности относительно синтаксиса можно найти в Справочнике MapBasic.

Как осуществлять доступ к удаленным данным при помощи команд

MapInfo позволяет приложениям MapBasic соединяться со многими базами данных в одно и то же время и выдавать SQL-запросы к различным базам. Это удается сделать, используя так называемые дескрипторы соединения è дескрипторы оператора.

Дескриптор (или номер) соединения идентифицирует информацию о конкретном соединении. MapBasic определяет дескрипторы соединения как переменные целого типа. Приложение получает дескриптор соединения после соединения с источником данных. Дескриптор соединения используется, чтобы связать (сопоставить) последующие операторы с конкретным соединением.

Дескриптор (или номер) оператора идентифицируют информацию об SQL-операторе. MapBasic определяет дескриптор оператора как переменную целого типа. Приложение должно получить дескриптор оператора после вызова функции Server_Execute( ), чтобы передать SQL-запрос. Дескриптор оператора используется, чтобы связать с ним последующие SQL-запросы, например, операции Fetch è Close с конкретным оператором

Select.

Установление и разрыв связи

Прежде, чем приложение MapBasic сможет начать выполнять оператор SQL для доступа к удаленным базам данных, оно должно запросить соединение, используя функцию

Server_Connect. Только если соединение успешно установлено, функция возвращает дескриптор соединения (hdbc) для использования с последующими SQL-DataLink обращениями.

Dim hdbc As Integer

hdbc = Server_Connect(”QELIB”, ”DBMS=ORACLE7;DLG=1”)

Когда драйвер выполнит фиксацию (commit) или откат (rollback), сбрасываются все операторные запросы, связанные с этим соединением. Диспетчер драйвера производит работу, связанную с переключением соединений, в то время как происходит обработка транзакции для текущего соединения.

Используйте следующий оператор для разъединения:

Server hdbc Disconnect

Этот оператор закрывает соединение и освобождает все связанные с ним ресурсы.

142

Глава 7: Работа с таблицами

Следующая схема описывает последовательность, в которой могут быть использованы операторы SQL MapBasic Server. Есть некоторые операторы и функции, которые не требуют никакой информации о соединении (например, Server_NumDrivers( )), некоторые требуют только дескриптора соединения (например, Server Commit), некоторым же нужен дескриптор оператора (например, Server Fetch).

Эти операторы не нуждаются в и н ф о р м а ц и и о с о е д и н е н и и :

Server_NumDrivers()

Server_DriverInfo()

Функция для установления соединения :.

hdbc=Server_Connect(toolkit,connect_string)

 

 

 

 

 

 

 

 

Этим операторам нужен

 

 

 

Заверш ение соединения.

дескриптор соединения.

 

 

 

Server hdbc Disconnect

Server hdbc Begin Transaction

 

 

 

 

 

 

 

 

 

 

 

 

Server hdbc Commit

 

 

 

 

 

 

 

 

 

 

 

 

Server hdbc Rollback

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Получение дескриптора.

hstmt=Server_Execute(hdbc,sql_string)

 

 

 

 

Этим операторам нужен

 

О свобождение

 

дескриптор оператора.

 

дескриптора оператора

Server hstmt Bind Column

 

 

 

Server hstmt Fetch

 

Server hstmt Close

Server_EOT(hstmt)

 

 

 

Server_NumCols(hstmt, ...)

 

 

 

 

 

 

Server_ColumnInfo(hstmt, ...)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вы можете загрузить (download) из ODBC-источника данных всю таблицу, некоторые строки и столбцы, или результирующее множество, используя предложение Into

оператора MapBasic Server Fetch. Однако никакие изменения в загруженной таблице не повлияют на таблицу базы данных сервера. Модификация удаленных баз данных выполняется при помощи создания связанных таблиц.

143

Глава 7: Работа с таблицами

Доступ и изменения в удаленных базах данных при помощи

связанных таблиц

Связанная таблица – специальный вид таблицы MapInfo, которая сохраняет связь с удаленной базой данных. Редактирование может производиться даже при наличии многих соединений. Целостность данных обеспечивается механизмом транзакций; другие пользователи могут модифицировать те же самые строки в тех же самых таблицах. Управление параллельной обработкой данных реализовано с использованием предложения

Automatic/Interactive оператора Commit Table. Когда данные сохранены, соединение с удаленной базой данных переустанавливается, происходит разрешение конфликтов, связанных с внесением изменений в базу данных. Связанная таблица создается оператором MapBasic Server Link Table.

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

Неотредактированная связанная таблица может быть обновлена текущими данными из удаленной базы данных без провторного указания данных о соединении, запросе и таблице. Данные в связанной таблице обновляются оператором MapBasic Server Refresh.

Связанная таблица может быть отсоединена оператором MapBasic Unlink. Отсоединение таблицы удаляет связь с удаленной базой данных. В результате получается обычная таблица MapInfo.

При использовании пространственной индексации MapInfo пользователи могут сохранять и отыскивать точки в любой базе данных; также поддерживается пространственный индекс SDO Oracle. См. Приложение E.

Прямой доступ к удаленным базам данных

Вы можете получить прямой доступ к данным из удаленных баз данных, используя операторRegister Table . Когда Вы определяете Type êàê ODBC, оператор Register Table

сообщает MapInfo , что надо проверить таблицу ODBC и создать соответствующую таблицу (имя_файла.TAB).

144

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]