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

MB60UG

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

Графические объекты

9

 

Глава 9: Графические объекты

 

Одно из наиболее существенных достоинств языка MapBasic – его способность обрабатывать и изменять объекты на карте – дуги, эллипсы, рамки, линии, точки, ломаные, прямоугольники, области, скругленные прямоугольники и текстовые объекты. В этой главе мы рассмотрим, как из программы на MapBasic обращаться к объектам Карты, создавать и изменять их. Вместе с тем заметим, что Вы должны понимать принципы построения таблиц MapInfo прежде чем изучать, как с помощью MapBasic сохранять объекты в таблице. Поэтому прочтите главу 7, если Вы до сих пор этого не сделали.

В этой главе . . .

Графические объекты ...............................................................

155

Переменные типа Object ............................................................

156

Работа с колонкой “Obj" ...........................................................

156

Определение атрибутов объекта ..................................................

158

Создание новых объектов ..........................................................

164

Создание новых объектов на основе уже существующих.....................

167

Изменение объектов.................................................................

168

Работа с подписями .................................................................

170

Координаты и единицы измерения ...............................................

174

Географические запросы............................................................

177

 

 

 

 

Глава 9: Графические объекты

Переменные типа Object

Тип данных Object в языке MapBasic позволяет работать как с простыми графическими объектами (такими как линии), так и со сложными объектами (например, областями). С переменными типа Object можно работать почти так же, как и с переменными других типов: им можно присваивать значения переменных типа Object, передавать такие переменные как аргументы процедур и функций, а также сохранять значения переменных типа Object в таблицах MapInfo.

Определить переменную-объект можно с помощью оператора Dim:

Dim Myobj, Office As Object

Вам не надо указывать конкретно, какой тип графических объектов будет храниться во вводимой переменной. Переменная типа Object может содержать любой графический объект Карты или Отчета.

Знак равенства (=) используется для присвоения значения переменной-объекту, например:

Office = CreatePoint(73.45, 42.1)

Myobj = Office

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

имя_таблицы. Obj. Константные выражения типа Object в MapBasic не применяются.

Переменная-объект хранит всю информацию об объекте на Карте. Например, если сохранить линию в переменную типа Object, то такая переменная будет содержать не только географическую информацию о линии (т.е. координаты начала и окончания линии), но и информацию о представлении (цвет, толщину и тип линии). В языке MapBasic имеется также четыре типа переменных стиля (Pen, Brush, Symbol и Font), в которых можно хранить описание типов (стилей) графических объектов без конкретных координат.

Работа с колонкой “Obj"

Специальная колонка с названием Obj предназначена для хранения информации о графических объектах таблицы. Каждая таблица, которой сопоставлены графические объекты, содержит колонку Obj, хотя колонка Obj и не показывается обычно в окне Списка. Обратиться к этой колонке можно следующим образом: имя_таблицы.obj или имя_таблицы.object.

В следующем примере объявляется переменная типа Object (current_state), а затем копируется первый объект из таблицы STATES в эту переменную.

Dim current_state As Object Open Table "states"

Fetch First From states current_state = states.obj

156

Глава 9: Графические объекты

С колонками графических объектов можно осуществлять те же операции, что и с обычными колонками. Можно использовать колонку объектов в SQL-запросах, производить обновление (Update) значений (объектов) в такой колонке, присваивать содержимое колонки переменным. Ниже в примере создается таблица, содержащая сокращенные названия штатов и их площади; колонка Obj используется в качестве одного из параметров функции Area( ):

Select state, Area(obj, "sq mi")

From states

В следующем примере создается таблица из одной записи, которая содержит общую длину шоссейных дорог штата California (в милях):

Select Sum(ObjectLen(obj, "mi")) From highways

Where obj Within (Select obj From states Where state = "CA")

Некоторым записям не соответствуют объекты на карте. Например, если Вы станете геокодировать свою базу данных в MapInfo, то в процессе геокодирования некоторым записям таблицы будут сопоставляться точечные объекты; тем же записям, которые не были геокодированы, не будет сопоставлено никакого объекта на Карте. Чтобы выбрать записи, которым не соответствуют графические объекты, используйте условие Not obj â

предложении Where оператора Select. Вот пример оператора, выбирающего все записи, которым не сопоставлены объекты на Карте:

Select *

From sites

Where Not obj

Создание колонки Object

Не все таблицы отображаются на Карте. Например, если в качестве таблицы Вы используете файл базы данных или электронной таблицы, подготовленный не в MapInfo, то такую таблицу сначала нельзя увидеть в окне Карты. Чтобы отобразить такую таблицу на Карте, следует выполнить оператор Create Map, который добавляет к таблице колонку графических объектов (Object).

Чтобы удалить колонку Obj из таблицы, выполните оператор Drop Map. Запомните, что

Drop Map удалит колонку объектов полностью. Иногда Вам может потребоваться удалить лишь некоторые объекты из таблицы, не убирая совсем колонку Obj; этот процесс называется “раскодированием" таблицы. Для удаления не колонки Obj, а значений из нее, используйте оператор Delete Object.

Чтобы определить, имеется ли в таблице колонка графических объектов, вызовите функцию TableInfo( ) с параметром TAB_INFO_MAPPABLE.

Ограничения, накладываемые на колонку Object

На колонки графических объектов накладываются некоторые особые ограничения. В частности, в каждой таблице может быть только одна колонка графических объектов. При создании выборки с объединением двух таблиц, обе из которых имеют колонку Object, результирующая таблица содержит только один из графических объектов (объект из той таблицы, которая указана первой в предложении From оператора Select).

157

Глава 9: Графические объекты

Следующий пример показывает, как осуществить запрос к двум таблицам, имеющим графические объекты: таблице STATES и таблице OUTLETS, которая содержит точечные объекты, обозначающие предприятия розничной торговли. В предложении From оператора

Select указываются названия обеих таблиц. Но поскольку таблица STATES указана первой, результирующая таблица содержит графические объекты из таблицы STATES.

Select *

From states, outlets

Where states.state = outlets.state

Map From selection

Если в приведенном примере в предложении From указать первой таблицу OUTLETS (см. ниже), то оператор Select создаст таблицу, содержащую точечные объекты (торговые предприятия), а не границы штатов:

Select *

From outlets, states

Where outlets.state = states.state

Map From selection

Каждой записи таблицы может соответствовать не более одного графического объекта. Поэтому графические объекты могут быть составными. Объект типа "область" может состоять из нескольких многоугольников (полигонов); так что группу островов можно представить единым графическим объектом (областью). Аналогично, и ломаная может состоять из нескольких сегментов. Чтобы определить, из скольких многоугольников состоит область или из скольких сегментов состоит ломаная, выберите этот объект и выполните команду MapInfo ПРАВКА > ÃЕОИНФОРМАЦИЯ. Чтобы определить те же параметры в программе, используйте функцию ObjectInfo( ) с кодом TAB_INFO_NPOLYGONS.

Определение атрибутов объекта

Таблица MapInfo может содержать разные типы графических объектов. Скажем, карта города может состоять из линий и областей. Чтобы определить тип графического объекта, обратитесь к функции ObjectInfo( ) с параметром OBJ_INFO_TYPE. Подробно функция

ObjectInfo( ) описана в Справочнике MapBasic.

При работе с окном MapBasic в режиме диалога имеются и другие способы узнать тип графического объекта. Например, можно выполнить следующий оператор в окне MapBasic, чтобы выдать окно сообщения с типом объекта:

Fetch First From world

Note world.obj

Следующий оператор выбирает все объекты типа Text из окна Отчета.

Select *

From Layout1

Where Str$(obj) = "Text"

Чтобы узнать географические координаты объекта, обращайтесь к функции

ObjectGeography( ). Например, если Вы хотите определить координаты X и Y концов линейного объекта, вызовите функцию ObjectGeography( ). Процедура определения

158

Глава 9: Графические объекты

координат узлов ломаной или области сложнее, поскольку число узлов может быть произвольным. Для определения координат узлов ломаной или области используются функции ObjectNodeX( ) è ObjectNodeY( ).

Положение центроида объекта определяется с помощью функций Centroid( ) èëè

CentroidX( ) è CentroidY( ). Минимальный описанный прямоугольник для объекта можно найти с помощью функции MBR( ).

Другие атрибуты графических объектов возвращает функция ObjectInfo( ). Например, после операции над графическими объектами из таблицы и присвоения значения выражения переменной типа Object, можно вызвать ObjectInfo( ), чтобы определить тип объекта (линия, область и т.д.), либо обратиться к ObjectInfo( ), чтобы скопировать стиль объекта (Pen, Brush, Symbol или Font). Для текстовых объектов ObjectInfo( ) выдает надпись, хранящуюся в текстовом объекте.

Многие стандартные функции языка MapBasic в качестве одного из аргументов используют графические объекты, возвращая при этом различные характеристики объектов. Например, функции Area( ), Perimeter( ) è ObjectLen( ) используют графические объекты в качестве параметров. Ниже в примере вычисляется площадь зоны затопления (flood – потоп, затопление, наводнение):

Dim floodarea As Float Open Table "floodmap" Fetch First From floodmap

floodarea = Area(floodmap.obj, "sq km")

Стили объектов (Pen, Brush, Symbol, Font)

Каждый графический объект имеет один или несколько параметров, условно называемых стилем. Например, каждая линия имеет стиль Pen ("перо"), который определяет цвет линии, ее толщину и тип (или шаблон, скажем, пунктирная или непрерывная), каждый точечный объект имеет стиль Symbol, который определяет вид символа, его цвет и размер. Замкнутые (или площадные) объекты, такие как области, имеют стиль Pen, а также стиль

Brush (штриховка).

В данной таблице приведены определения четырех стилей объектов.

Pen

толщина, тип и цвет линии.

 

 

 

Brush

шаблон, основной цвет и цвет фона для внутренней части области.

Font

название шрифта, тип, размер, цвет, фон; для текстовых объектов.

Symbol

В MapInfo 3.0: вид, цвет, размер.

 

Для символов из шрифтов TrueType: вид, цвет, размер, имя шрифта, стиль

 

(например, курсив), параметры поворота.

 

Для пользовательских символов, основанных на файлах с растровыми картинками:

 

имя файла, цвет, размер и атрибуты стиля.

Для получения подробной информации о стилях обратитесь к разделам Brush, Font, Pen, è

Symbol â Справочнике MapBasic и интерактивной справке.

159

Глава 9: Графические объекты

Во всех операторах, создающих графические объекты, можно использовать предложения, задающие стиль (стили) объектов. Например, в операторе Create Line можно использовать предложение Pen для того, чтобы задать толщину, тип и цвет линии. Если же стиль объекта явно не указывать, MapInfo присвоит графическому объекту текущий стиль.

Замечание: Вы не можете использовать оператор =, чтобы сравнить два стиля. Например, следующая программа, которая пытается сравнивать две переменные типа Brush, генерирует ошибку времени выполнения.

Dim b1, b2 As Brush

b1 = MakeBrush(2, 255, 0)

b2 = CurrentBrush()

If b1 = b2 Then

Note ”Два шаблона заполнения одинаковы.”

End If

Эта программа генерирует run–time ошибку, когда пытается сравнивать две переменных типа Brush. Если Вам нужно подобное сравнение, используйте функцию StyleAttr (), чтобы извлечь индивидуальные элементы стиля (цвет, и т.д.) и затем сравнивть их.

Стили Шрифтов

Каждый текстовый объект имеет стиль (начертание). Стиль шрифта включает сам шрифт (например Times, Roman или Baltica), стиль текста (например полужирный, курсивный, и т.д.) и цвет. Стиль шрифта также содержит информацию о размере; однако, размер иногда игнорируется.

Когда Вы создаете текстовый объект в окне Отчета, размер шрифта управляет высотой текста. Если стиль шрифта указывает размер 10 пунктов, текстовый объект определен как 10–пунктовый текст. Текст может не отображаться на экране высотой в 10 пунктов, но когда Вы напечатаете Отчет, высота текста будет 10 пунктов.

Когда Вы создаете текстовый объект в окне Карты, MapInfo игнорирует размер шрифта. В этой ситуации высота текста определяется координатами карты, которые Вы устанавливаете в операторе Create Text. Когда Вы выполняете оператор Create Text, Вы указываете координаты x и y, которые определяют прямоугольную область на карте; текстовый объект заполняет эту область. Из-за этого текстовые объекты, сохраненные в “графической” таблице, будут становиться большими, если Вы увеличиваете, и меньшими, если Вы уменьшаете окно Карты.

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

Начертание шрифта включает имя шрифта, типа Courier или Helvetica. Имена шрифтов могут отличаться на различных аппаратных платформах; например, Geneva – общее имя шрифта на Macintosh, но не на других платформах. Helv и TmsRmn (или Times New Roman) в среде Microsoft Windows называются Helvetica и Times на платформах Sun и Macintosh.

160

Глава 9: Графические объекты

Helvetica, Times и Courier распознаются в предложении MapBasic Font независимо от текущей платформы.

Переменные стилей

В MapBasic имеются переменные стилей следующих типов: Pen, Brush, Symbol и Font, что соответствует стилям графических объектов.

Присвоить значение переменной стиля можно четыремя способами:

Создать стиль с помощью MakePen( ), MakeBrush( ), MakeSymbol( ), MakeFont( ),

MakeCustomSymbol( ) èëè MakeFontSymbol( ), а затем присвоить его переменной стиля. Перечисленные функции позволяют явно задать нужный стиль. Так, в программе SCALEBAR из набора примеров MakeBrush( ) используется для построения штриховок из черного и белого цветов, которые используются для рисования шкалы.

Вызвать CurrentPen( ), CurrentBrush( ), CurrentSymbol( ) èëè CurrentFont( ) è

присвоить значение функции переменной стиля. Указанные функции возвращают текущие стили (т.е. те стили, которые показываются в диалогах MapInfo НАСТРОЙКА > ÑТИЛЬ ЛИНИЙ, ÑТИЛЬ ОБЛАСТЕЙ, ÑТИЛЬ СИМВОЛОВ И ÑТИЛЬ ТЕКСТА, когда ни один графический объект не выбран).

Вызвать ObjectInfo( ), определить с ее помощью стиль некоторого объекта и присвоить этот стиль переменной.

Открыть диалог, в котором пользователь мог бы выбрать тот или иной стиль. В любом диалоге, содержащем кнопку PenPicker, BrushPicker, SymbolPicker èëè

FontPicker, пользователь может выбрать стиль, указав мышью на такую кнопку. Подробно диалоги описаны в главе 6.

Следующий пример демонстрирует, как создать стиль Pen с помощью обращения к функции MakePen( ). Значение стиля Pen присваивается переменной типа Pen.

Dim p_var as Pen

p_var = MakePen(1, 10, RGB(128, 128, 128))

Аргументы функции MakePen( ) определяют стиль линии: 1 означает, что толщина линии составляет один пиксел; 10 задает номер шаблона (dotted); а функция RGB( ) определяет цвет. Подробнее эти три параметра, с помощью которых создается стиль линий (со списком всех шаблонов линий), описаны в разделе "Предложение Pen" в Справочнике MapBasic.

Аналогично, создание стилей Brush, Font и Symbol описано в разделах, описывающих предложения Brush , Font и Symbol в Справочнике MapBasic.

В следующем примере показано, как присвоить переменной типа Pen стиль линии одного из существующих объектов:

p_var = ObjectInfo(obj_var, OBJ_INFO_PEN)

161

Глава 9: Графические объекты

Присвоив значение переменной типа Pen, Вы можете использовать эту переменную при создании графических объектов:

Create Line Into Variable obj_var (-73, 42) (-74, 43)

Pen p_var

Функция StyleAttr( ) возвращает одну из компонент заданного стиля. Например, в программе TEXTBOX из набора примеров показывается диалог, в котором пользователь может выбрать стиль линии; выбранный стиль сохраняется в переменную типа Pen, с именем "pstyle". Затем в программе TEXTBOX выполняется оператор, который выделяет цвет стиля и присваивает его переменной типа Integer (line_color):

line_color = StyleAttr(pstyle, PEN_COLOR)

Цвета в MapInfo хранятся в виде целых чисел. Например, черному цвету соответствует число 0, синему – 255. Функция RGB( ) языка MapBasic вычисляет значение цвета на основании заданного соотношения красного, зеленого и синего оттенков. Например,

RGB(0, 255, 0) возвращает зеленый цвет.

Для обозначения цветов используйте функцию RGB( ). Например:

highway_style = MakePen(2, 2, RGB(0, 0, 255))

Вместо обращения к RGB( ) можно использовать одно из стандартных числовых обозначений цветов (BLACK, WHITE, RED, GREEN, BLUE, YELLOW, CYAN и MAGENTA), определенных в файле MAPBASIC.DEF.

Выбор объектов с заданным стилем

Функция ObjectInfo( ) позволяет извлекать значения Pen, Brush, Symbol или Font из объекта. Если только Вы извлекли Pen, Brush, Symbol или Font, Вы можете воспользоваться функцией StyleAttr( ), чтобы рассмотреть индивидуальные элементы (например, чтобы определить цвет стиля Symbol).

Вы можете использовать оператор Select, чтобы выбрать объекты, основанные на стилях. Как показывает следующий пример, предложение Where оператора Select может вызывать функции ObjectInfo( ) è StyleAttr( ), чтобы MapInfo выбрал только те объекты, которые имеют некоторые атрибуты (например, объекты некоторого цвета).

Следующий пример добавляет кнопку на инструментальную панель “Программы”. Если Вы выбираете объект и затем нажимаете эту кнопку, программа выбирает все объекты в таблице, которые имеют тот же самый цвет.

162

Глава 9: Графические объекты

Include ”mapbasic.def”

Declare Sub Main

Declare Sub SelectPointsByColor()

Sub Main

’ Добавим кнопку к панели ”Программы”. Alter ButtonPad ”Программы” Add PushButton

Calling SelectPointsByColor

HelpMsg ”Выбор точек того же цвета\nВыбор по цвету” End Sub

Sub SelectPointsByColor

Dim i_color, i_open As Integer

Dim symbol_style As Symbol

Dim object_name, table_name As String

Сколько таблиц открыто? i_open = NumTables()

Определим имя текущей таблицы.

table_name = SelectionInfo(SEL_INFO_TABLENAME) If table_name = ”” Then

’ ... ничего не выбрано; завершаем работу. Exit Sub

End If

’ Если таблица не содержит графики, то выход.

If Not TableInfo(table_name, TAB_INFO_MAPPABLE) Then Exit Sub

End If

Выбранный объект - точка?

Если да, определим цвет. Fetch First From Selection

object_name = Str$(Selection.obj) If object_name = ”Point” Then

symbol_style = ObjectInfo(Selection.obj,OBJ_INFO_SYMBOL) i_color = StyleAttr(symbol_style, SYMBOL_COLOR)

End If

Если открылась таблица запроса Запрос1 (или Запрос2...).

закроем ее.

If NumTables() > i_open Then

Close Table TableInfo(0, TAB_INFO_NAME)

End If

If object_name <> ”Point” Then ’...если объект - не точка, то выход. Exit Sub

End If

163

Глава 9: Графические объекты

’ Выберем все точечные оъекты. Select * From table_name

Where Str$(Obj) = ”Point”

Into Color_Query_Prep NoSelect

’ Отберем с нужным цветом. Select * From Color_Query_Prep

Where StyleAttr(ObjectInfo(obj,OBJ_INFO_SYMBOL),SYMBOL_COLOR)

= i_color Into Color_Query

Close Table Color_Query_Prep

End Sub

Этот пример работает с объектами типа точки, но те же самые методы могут использоваться с другими типами объектов. Например, чтобы работать с объектамиобластями вместо точек, Вы проверяли бы для имени объектного "Region" вместо "Point", и Вы вызывали ObjectInfo() с OBJ_INFO_BRUSH вместо OBJ_INFO_SYMBOL, и т.д.

Создание новых объектов

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

Операторы создания объектов

Следующие операторы можно использовать для создания новых графических объектов. Их можно можно использовать в окнах Отчетов, за исключением Create Frame, в окнах Карт.

Create Arc: создает дугу.

Create Ellipse: создает эллипс или окружность. (Окружность – это просто частный случай дуги, дуга с одинаковыми радиусами.)

Create Frame: создает рамку. Рамки – это объекты, существующие только в окнах Отчетов; каждая Рамка может содержать одно окно. Таким образом, чтобы разместить две карты на одной странице, надо создать две Рамки.

Create Line: создает линию.

Create Point: создает точку.

Create Pline: создает ломаную.

Create Rect: создает прямоугольник.

Create Region: создает область (многоугольник).

Create RoundRect: создает прямоугольник.

Create Text: создает текстовый объект.

164

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