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

MB60UG

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

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

Кроме того, оператор AutoLabel позволяет создавать подписи (т.е. текстовые объекты) в

окне Карты. Оператор AutoLabel соответствует команде MapInfo 3.0 КÀÐÒÀ > ÐАЗМЕСТИТЬ

ПОДПИСИ и создает текстовые объекты.

Функции создания объектов

Следующие функции языка MapBasic возвращают значения типа Object:

CreateCircle( ): возвращает окружность.

CreateLine( ): возвращает линию.

CreatePoint( ): возвращает точечный объект.

Âнекотором смысле функции создания графических объектов мощнее, чем соответствующие им операторы, поскольку эти функции можно встраивать в сложные операторы. Например, следующий оператор Update использует функцию CreateCircle( )

для создания окружностей, соответствующих каждой записи таблицы:

Update sites

Set obj = CreateCircle(lon, lat, 0.1)

В данном примере предполагается, что таблица sites содержит колонки "lon" со значениями долготы (координата X) и "lat" со значениями широты (координата Y).

Создание объектов с переменным числом узлов

Области и ломаные линии устроены сложнее, чем другие графические объекты. Такие объекты могут иметь произвольное число узлов (до 32,763 узлов в каждом объекте).

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

Создавать области и полилинии (ломаные) в программе можно в два этапа:

1.Выполнить оператор Create Region èëè Create Pline, чтобы создать пустой графический объект (объект без узлов).

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

165

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

Следующий пример иллюстрирует эту процедуру:

Include "mapbasic.def" Type Point

x As Float

y As Float End Type

Dim objcoord(5) As Point

Dim numnodes, i As Integer, myobj As Object numnodes = 3

set CoordSys Earth

objcoord(1).x = -89.213 objcoord(1).y = 32.017 objcoord(2).x = -89.204 objcoord(2).y = 32.112 objcoord(3).x = -89.187 objcoord(3).y = 32.096

Create Pline Into Variable myobj 0

For i = 1 to numnodes

Alter Object myobj Node Add (objcoord(i).x,objcoord(i).y)

Next

Insert Into cables (obj) Values (myobj)

Сохранение графических объектов в таблице

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

Чтобы сохранить графический объект в таблице, следует выполнить оператор Insert или оператор Update. Какой из двух операторов использовать, зависит от того, следует ли сопоставить графический объект уже существующей записи таблицы или надо создать новую запись.

Оператор Update используется для добавления графического объекта в уже существующую запись таблицы. Если этой записи уже соответствовал графический объект, новый объект будет вставлен вместо него. Оператор Update можно применять к любой колонке таблицы; чтобы работать с графическими объектами, надо указать название специальной колонки "Obj". Например, следующий оператор сохраняет точечный объект в колонку "Obj" первой записи таблицы SITES:

Update sites

Set Obj = CreatePoint(x, y)

Where RowID = 1

Оператор Insert используется для добавления новой записи в таблицу. Insert позволяет добавлять за один раз одну запись в указанную таблицу или вставлять группу строк из другой таблицы. Следующий оператор вставляет одну новую запись в таблицу SITES, причем в колонку "Obj" этой записи помещается графический объект "линия":

Insert Into sites (Obj)

Values (CreateLine(x1, y1, x2, y2))

166

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

Программа TEXTBOX из набора примеров содержит как операторы Insert, òàê è Update. Программа TEXTBOX рисует квадрат (графический объект "прямоугольник") вокруг каждой выбранной текстовой подписи; каждый квадрат записывается с помощью оператора Insert. Кроме того, если пользователь устанавливает флажок "Сделать одинаковыми цвета текста и рамки", то программа также изменяет цвет выбранного текстового объекта и с помощью оператора Update обновляет информацию о текстовом объекте в таблице.

Операторы Insert è Update представляют собой мощное и гибкое средство работы с таблицами. В приведенных примерах эти операторы применялись только к одной колонке (колонке графических объектов "Obj"); однако, с помощью Insert è Update можно работать с любыми колонками таблиц. Подробное описание операторов Insert è Update Вы найдете в Справочнике MapBasic.

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

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

Создание буфера

Буферная область (или просто "буфер") – это область, охватывающая все возможные объекты, удаленные от заданного графического объекта не более, чем на некоторое расстояние. Например, Вы можете создать буфер вокруг трассы оптического кабеля, чтобы выяснить, какие земляные работы велись на расстоянии менее 300 метров от кабеля.

Создать буфер можно с помощью оператора Create Object. Вот пример, как создать 300– метровую буферную зону вокруг заданного сегмента кабеля, а затем найти места проведения ремонтных работ:

Dim danger_zone As Object

Create Object As Buffer

From selection

Into Variable danger_zone

Width 300 Units "m"

Select * From dig_sites Where dig_site.obj Within danger_zone

В MapBasic также есть функция Buffer( ), которая возвращает графический объект, представляющий собой буферную зону.

Объединение, пересечение и слияние

Оператор Create Object позволяет также находить объединение и пересечение областей. Если задать этот оператор в форме Create Object As Merge, то MapInfo удалит общие подобласти пересекающихся областей, создав одну результирующую область (полигон). При слиянии двух областей с единой границей (например, Московской и Тверской областей

167

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

России), результирующая область будет охватывать территорию обеих областей. Граница между соседними областями будет удалена.

Следующий пример показывает, как объединить две области из таблицы STATES:

Select *

From states

Where state ="CA" Or state = "NV"

Create Object As Merge

From selection

Into Table territory

Операция Merge (Слияние) представляет собой наложение по правилу "исключающего ИЛИ" (XOR). При слиянии двух областей, одна из которых полностью содержит другую, результатом операции будет внешняя область без той ее части, которая соответствует внутренней области (т.е. область с дырой).

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

Select * From Territory Where TerrName = "Western Territory" or

TerrName = "NV"

Delete From selection

Операторы Create Object As Union è Create Object as Intersection позволяют создавать области, являющиеся логической комбинацией двух и более областей. Эти операторы отличаются от Create Object As Merge тем, что они действуют на все фрагменты исходных областей, а не только на общие их части. Union – это объединение всех областей.

Intersection – зона пересечения областей. Графический объект, полученный в результате объединения или пересечения областей, может содержать новые узлы (т.е. такие, которых не было в исходных областях).

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

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

Общая процедура изменения графических объектов

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

1.Создается копия исходного объекта. (Как правило, для этого объявляют переменную типа Object, выполняют оператор Fetch, чтобы переместить указатель файла, а затем выполняют оператор присваивания вида

имя_переменной = имя_таблицы.obj).

2.Выполняются операторы или функции, которые изменяют графический объект. (Это обычно один или несколько операторов Alter Object.)

168

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

3.Выполняется оператор Update, чтобы сохранить измененный графический объект обратно в таблицу.

Программа TEXTBOX из набора примеров может служить иллюстрацией этого процесса. Если пользователь установил флажок "Сделать одинаковыми цвета текста и рамки", то программа TEXTBOX использует оператор Alter Object для изменения цвета выбранного объекта, а затем – оператор Update для того, чтобы сохранить измененный текстовый объект в таблице.

Перемещение объекта

Чтобы изменить значения координат графического объекта, выполните оператор Alter Object с предложением Geography. Вам может потребоваться выполнить более одного оператора Alter Object (например, один – чтобы изменить координату X, и еще один – чтобы изменить координату Y).

Изменение стилей графического объекта (Pen, Brush, Font, Symbol)

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

Include "mapbasic.def"

Dim myobj As Object, mysymbol As Symbol mysymbol = CurrentSymbol()

Fetch First From selection myobj = selection.obj

If ObjectInfo(myobj, OBJ_INFO_TYPE) = OBJ_POINT Then Alter Object myobj

Info OBJ_INFO_SYMBOL, mysymbol

Update selection Set obj = myobj Where RowID = 1 Else

Note "Выбранным объектом должна быть точка." End If

Чтобы изменить размер текстового объекта в окне Отчета, надо поменять стиль Font (оператором Alter Object с предложением Info).

Чтобы изменить размер текстового объекта в окне Карты, надо поменять координаты X и Y графического объекта (с помощью оператора Alter Object с предложением Geography).

Преобразование областей и полилиний (ломаных)

Преобразовать графический объект в область можно с помощью функции

ConvertToRegion( ).

Преобразовать графический объект в полилинию или ломаную можно с помощью функции

ConvertToPline( ).

Подробно эти функции описаны в Справочнике MapBasic.

169

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

Удаление части графического объекта

Следующие операторы и функции предназначены для удаления фрагментов (частей)

графических объектов:

Функция Overlap( ) с двумя графическими объектами в качестве аргументов возвращает значение типа Object. Результатом выполнения функции является область пересечения исходных объектов.

Функция Erase( ) с двумя графическими объектами в качестве аргументов возвращает значение типа Object. Результатом выполнения функции является первый объект, из которого удалены те элементы, которые входят во второй графический объект.

Оператор Objects Erase удаляет часть графического объекта (объектов), помеченного как "изменяемый", при этом удаляются выбранные объекты.

Оператор Objects Intersect удаляет те фрагменты графического объекта (объектов), помеченного как "изменяемый", которые не являются выбранными в текущий момент.

Оператор Objects Erase соответствует команде MapInfo ОБЪЕКТЫ > ÓДАЛИТЬ ЧАСТЬ, а оператор Objects Intersect соответствует команде ОБЪЕКТЫ > ÓДАЛИТЬ ВНЕШНЮЮ ЧАСТЬ. Обе эти операции применяются к объектам со статусом "изменяемый". Этот статус устанавливается командой Объекты > ВЫБРАТЬ ИЗМЕНЯЕМЫЙ ОБЪЕКТ или оператором Set Target языка MapBasic. Принципы редактирования графических объектов описаны в

Справочнике MapInfo.

Точки пересечения

Как уже говорилось ранее, добавить новые узлы к области или ломаной можно с помощью оператора Alter Object. Однако оператор Alter Object требует, чтобы Вы явно описывали каждый добавляемый узел. Чтобы добавить узлы в точках пересечения двух объектов, следует использовать оператор Objects Overlay или функцию OverlayNodes( ).

С помощью функции IntersectNodes( ) можно определить координаты точек пересечения двух объектов. IntersectNodes( ) возвращает ломаную, узлами которой являются все точки пересечения. С помощью ObjectInfo( ) можно определить число узлов ломаной. Получить же координаты точек перечесения можно, обратившись к функциям ObjectNodeX( ) è

ObjectNodeY( ).

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

В более ранних версиях MapInfo, подписи на Карте создавались оператором AutoLabel, который создает текстовые объекты в Косметическом слое. В MapInfo 4.0 концепция подписывания была изменена: подпись теперь обрабатывается как атрибут элемента изображения объекта Карты, а не как отдельный текстовый объект. Однако, если Вы написали приложения, использующие MapBasic 3.x, Ваши приложения будут выполняться; MapInfo 4.0 поддерживает оператор AutoLabel для совместимости.

170

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

Показ подписей

Пользователь MapInfo может настраивать режимы размещения подписей через диалоговое окно “Управление Слоями”. Программа MapBasic может выполнять те же самые операции оператором Set Map ... Label.

Set Map Layer 1 Label Auto On Visibility On

Скрытие подписей

В диалоге “Управление Слоями” сброс флажка подписывания в списке слоев выключает заданные по умолчанию подписи для этого слоя. Следующий оператор MapBasic имеет тот же самый эффект:

Set Map Layer 1 Label Auto Off

Обратите внимание: Оператор Set Map ... Auto Off выключает автоматически созданные подписи, но не воздействует на измененные подписи (подписи, которые были добавлены или изменялись пользователем). Следующий оператор временно скрывает все подписи для слоя – и заданные по умолчанию подписи, и измененные подписи:

Set Map Layer 1 Label Visibility Off

Пользователь MapInfo может восстанавливать подписи слоя к их заданному по умолчанию состоянию, выполняя команду КÀÐÒÀ > ÂОССТАНОВИТЬ ПОДПИСИ. Следующий оператор MapBasic имеет тот же самый эффект:

Set Map Layer 1 Label Default

Редактирование подписей

Пользователь MapInfo может редактировать подписи в интерактивном режиме. Например, чтобы скрыть подпись, укажите на подпись мышкой, чтобы выбрать ее, и нажмите клавишу DEL. Подпись можно также переместить мышкой.

Чтобы изменять подписи, измененные пользователем, через MapBasic, используйте оператор Set Map ... Label, который включает одно или большее количество предложений

Object. Например, следующий оператор скрывает две подписи в окне Карты:

Set Map Layer 1 Label

Object 1 Visibility Off

Object 3 Visibility Off

Для каждой подписи Вы можете включать предложение Object. В этом примере, Object 1

относится к подписи для первой строки таблицы, и Object 3 – к подписи для третьей строки таблицы.

Чтобы сохранить измененные подписи, сохраните файл Рабочего Набора оператором Save Workspace.

Внимание: Упаковка таблицы может сделать неверными отредактированные подписи, предварительно сохраненные в Рабочем Наборе. Когда Вы сохраняете отредактированные подписи, сохраняя Рабочий Набор, подписи представляются как операторы Set Map ...

171

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

Object. Каждое предложение Object относится к номеру строки в таблице. Если таблица содержит строки, которые были помечены как удаленные, то упаковка таблицы устраняет удаленные строки.

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

Если удаленные строки в таблице находятся в самом конец таблицы (то есть внизу окна Окна Списка), то все будет в порядке.

Другие примеры применения оператора Set Map

Чтобы увидеть синтаксис MapBasic, который соответствует диалогу “Управление Слоями”, проделайте следующее:

1.Откройте окно MapBasic.

2.Выберите окно Карты.

3.Выполните команду КÀÐÒÀ > ÓПРАВЛЕНИЕ СЛОЯМИ.

4.Выберите нужные параметры и нажмите OK.

MapInfo отобразит оператор Set Map в окне MapBasic. Вы можете скопировать текст из окна MapBasic и вставить его в Вашу программу.

Чтобы увидеть синтаксис MapBasic, который соответствует редактированию индивидуальной подписи, проделайте следующее:

Измените подписи в окне Карты (удалите или измените подпись, измените шрифт и т.п.).

Сохраните Рабочий Набор.

Просмотрите файл Рабочего Набора в текстовом редакторе, типа MapBasic редактора (строки с оператором Set Map ... Layer ... Label ... Object ).

Разница между подписями и текстовыми объектами

Следующая таблица показывает различия между текстовыми объектами и подписями.

 

Текстовый объект

Подпись

 

 

 

Оператор MapBasic,

Create Text, AutoLabel

Set Map

используемый, чтобы создать

 

 

текст:

 

 

 

 

 

Оператор MapBasic,

Alter Object

Set Map

используемый, чтобы

 

 

изменить текст:

 

 

 

 

 

Функции MapBasic,

ObjectInfo( ),

Программы MapBasic не могут

используемые, чтобы сделать

ObjectGeography( )

сделать запрос о подписях.

запрос о тексте (например,

 

 

определить цвет):

 

 

 

 

 

172

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

 

Текстовый объект

Подпись

 

 

 

Оператор MapBasic,

Select

Программы MapBasic не могут

используемый, чтобы

 

выбирать подписи.

выбрать текст:

 

 

 

 

 

Сохранение текста в Карте:

Текстовые объекты могут

Подписи могут быть сохранены

 

быть сохранены в

только в Рабочих Наборах.

 

“картографических”

 

 

таблицах.

 

 

 

 

Сохранение текста в Отчете:

Текстовые объекты,

Не применимо. Подписи не могут

 

созданные в окне Отчета

появляться в Отчете (за

 

могут быть сохранены в

исключением того, когда в Отчете

 

Рабочем Наборе.

находится Карта).

 

 

 

Управление высотой текста

При создании

Высота текста подписи

èç MapBasic:

текстового объекта в

управляется шрифтом. Изменение

 

“картографической”

размера окна не влияет на высоту

 

таблице, Вы указываете

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

 

координаты x и y, чтобы

 

 

определить

 

 

прямоугольную

 

 

область; текст

 

 

заполняет ее. Высота

 

 

текста изменяется при

 

 

изменении размера

 

 

îêíà.

 

 

 

 

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

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

Set Map Layer 1 Label Object 1

Visibility

On

’показать подписи

Anchor (0,

85)

’координаты (x,y)

Text ”Map of World”

’текст

Position Center

’положение

Font(”Arial”,289,20,0)

’стиль подписи (20 пунктов и т.д.)

173

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

Возникающая в результате подпись выглядит так:

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

Создайте таблицу (оператором Create Table), которая содержит строковый столбец. Сделайте этот столбец достаточно широким, чтобы сохранить текст, который Вы хотите изобразить на карте. Сделайте таблицу “картографической” (оператором

Create Map).

Добавьте таблицу к Вашему окну Карты (оператором Add Map). Используйте оператор Set Map, чтобы установить параметры подписей таблицы (шрифт, Auto On, è ò.ä.).

Если Вы хотите добавить текст к Карте, вставьте точку или линию в таблицу, используя невидимый стиль символа (номер 31 в таблице символов) или невидимый стиль пера (шаблон 1). Объект будет невидим, но подпись появится. (Используйте линии, если хотите, чтобы текст можно было поворачивать. Программа из комплекта поставки COGOLINE.MB показывает, как создать объект-линию с данным углом.)

Обратите внимание на то, что Вы не должны использовать оператор Set Map ... Object, чтобы указать положение каждой подписи. Вы можете отображать подписи в позициях, заданных по умолчанию. Затем, если Вы хотите переместить подпись, переместите объект, которому она соответствует.

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

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

Прежде чем создавать, изменять или выбирать объекты из мировой карты, убедитесь, что MapBasic работает в мировых координатах. Этот режим является

174

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