Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MB_REF_7.pdf
Скачиваний:
25
Добавлен:
13.02.2015
Размер:
2.96 Mб
Скачать

Оператор Call

Оператор Call

Назначение:

Вызывает sub-процедуру или внешнюю процедуру (DLL, XCMD или RPC).

Предупреждение:

Вы не можете использовать этот оператор в окне MapBasic.

Синтаксис:

Call subproc [ ( [ parameter ] [, ... ] ) ]

где

subproc – имя подпрограммы;

parameter – параметр, передающий подпрограмме значение из основного модуля.

Описание:

Оператор Call используется для вызова подпрограммы. Подпрограммой может быть процедура, написанная на MapBasic, первым оператором которой является оператор Sub. Так же с помощью оператора Call в Windows может быть вызвана процедура из динамической библиотеки (DLL).

Аналогично, прикладная программа в MapInfo для Macintosh может вызывать внешние XCMDкоманды. Смотрите описание оператора Declare Sub для подробной информации о внешних процедурах.

Если вызывается sub-процедура, MapBasic начинает выполнять операторы подпрограммы, пока не встретит оператор End Sub или Exit Sub. Выполнение возвращается в программу, откуда был произведен вызов, к следующему оператору после Call. Оператор Call может обращаться только к тем процедурам, которые являются частью текста программы.

Программа MapBasic должна в главной процедуре содержать оператор Declare Sub, объявляющий имя процедуры и список ее параметров перед ее вызовом. Это требование должно выполняться как по отношению к процедурам, организованным оператором Sub, так и к внешним процедурам (DLL и XCMD).

Передача значений параметров

Подпрограмма может не иметь параметров, тогда вызов такой процедуры может выглядеть так:

Call subroutine

или

Call subroutine(_)

Если sub-процедура имеет параметры, то они могут быть объявлены двумя способами: ссылкой ("by reference") или значением ("by value"). По умолчанию параметр объявляется как "ссылка". Если параметр подпрограммы был определен таким образом, то при вызове sub-процедуры соответствующим параметром вызова должна быть переменная. Такой параметр не только передает значение переменной в процедуру, но и возвращает значение обратно. В процедуре значение параметра может быть изменено, и это измененное значение будет присвоено переменной, выступавшей в роли параметра вызова, после того, как оператор Call вернет управление в вызывавшую программу.

Объявление величины параметра как значения осуществляется при помощи ключевого слова ByVal перед именем параметра в списке операторов Sub и Declare Sub. Если один из параметров

Справочник MapBasic

57

Оператор Call

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

Sub-процедуры могут пересылать как простые параметры, так и массивы переменных. При этом в списке вызова Вы пишете только имя массива без скобок.

Вызов внешних процедур

Если оператор Call вызвал процедуру DLL, то MapBasic выполняет процедуру до тех пор, пока она не вернет управление. Сама процедура находится в отдельном файле (например, "KERNEL.EXE"). Этот файл с внешней процедурой должен быть доступен в то время, как MapBasic выполняет внешний вызов.

Аналогично, если оператор Call вызывает XCMD, то файл, содержащий XCMD, должен быть доступным.

В вызове XCMD-команд не могут участвовать массивы переменных и переменные сложных типов, составленных оператором Type, в качестве параметров.

Пример:

Подпрограмма Cube вычисляет куб (третью степень) числа. Она имеет два параметра: первый содержит само число, второй – результат.

Declare Sub Cube(ByVal original As Float,cubed As Float)

Dim x, result As Float

Call Cube( 2, result)

' переменная result равна 8 (2 x 2 x 2) x = 1

Call Cube( x + 2, result)

' переменная result равна 27 (3 x 3 x 3)

End Program

Sub Cube (ByVal original As Float, cubed As Float)

'Параметр "original"_– число,

'параметр "cubed"_– результат вычисления.

cubed = original ^ 3 End Sub

Смотрите также:

Declare Sub, Exit Sub, Global, Sub... End Sub

58

Справочник MapBasic

Функция CartesianArea( )

Функция CartesianArea( )

Назначение:

Возвращает площадь, используя вычисления в системе координат Широта/Долгота. Используется декартовый алгоритм вычислений.

Синтаксис:

CartesianArea( expr, unit_name )

unit_name это строковая величина, имя единиц измерения площади. (sq km”)

Возвращаемое значение:

Величина с плавающей запятой

Описание:

Функция CartesianArea( ) возвращает площадь географического объекта, указанного выражением obj_expr.

Функция возвращает измеренную площадь, в единицах, определенных параметром unit_name; например, чтобы получить площадь в акрах, укажите ”acre” в качестве параметра unit_name. Смотрите описание оператора Set Area Units, где описаны возможные единицы измерения.

Функция CartesianArea() всегда будет возвращать значение площади, рассчитанное по декартовым алгоритмам. Величина -1 будет возвращаться для данных в плановых координатах, поскольку такие данные не могут быть конвертированы в Широту/Долготу. Возвращаются приближенные результаты в том случае, если используется скругленный прямоугольник. MapBasic рассчитывает площадь скругленного прямоугольника как если бы объект был настоящим прямоугольником.

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

Примеры:

Следующие примеры показывают, как функция CartesianArea( ) может вычислять площадь одиночного картографического объекта. Обратите внимание, что выражение tablename.obj (как в states.obj) представляет географический объект текущей строки в указанной таблице.

Dim f_sq_miles As Float

Open Table ”states”

Fetch First From states

f_sq_miles = CartesianArea(states.obj, ”sq mi”)

Вы можете также использовать функцию CartesianArea( ) внутри оператора SQL Select как показано в следующем примере.

Select lakes, CartesianArea(obj, ”sq km”)

From lakes Into results

Смотрите также:

Функция Area (), функция SphericalArea ()

Справочник MapBasic

59

Функция CartesianBuffer( )

Функция CartesianBuffer( )

Назначение:

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

Синтаксис:

CartesianBuffer ( inputobject, resolution, width, unit_name ) inputobject это выражение объекта

resolution это короткое целое, представляющее число узлов для круга в каждом углу

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

unit_name это имя единиц измерения расстояния (наприер, ”mi” для милей, ”km” для километров) используемых для измерения ширины

Возвращаемое значение:

Объект типа полигон

Описание:

Функция CartesianBuffer( ) возвращает полигон, представляющий буферную зону.

Функция CartesianBuffer( ) оперирует с одним объектом одновременно. Для создания буфера вокруг ряда объектов, используйте оператор Create Object As Buffer.

Функция CartesianBuffer( ) будет рассчитывать буферную зону, в предположении, что объект спроецирован на плоскость и используя ширину width для расчета декартового расстояния буферной зоны вокруг объекта. Если inputobject в проекции Широта/Долгота, то сферические вычисления будут использоваться независимо от того, какая функция, связанная с буфером будет применяться. Если inputobject в плановых координатах, то будут использоваться декартовые вычисления, независимо от того, какая буферная функция вызывается.

Пример :

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

Dim o_line, o_region As Object

o_line = CreateLine( 73.5, 42.5, 73.6, 42.8) o_region = CartesianBuffer( o_line, 20, 10, ”mi”)

Смотрите также:

Функция Buffer (). Создание объектов. Функция SphericalBuffer ()

60

Справочник MapBasic

Функция CartesianDistance ( )

Функция CartesianDistance ( )

Назначение:

Возвращает расстояние между двумя точками.

Синтаксис:

CartesianDistance ( x1 , y1 , x2 , y2 , unit_name ) x1 и x2 это x-координаты (долгота)

y1 и y2 это y-координаты (широта)

unit_name это строковая величина, соответствующая имени единиц измерения расстояния (например, ”km”)

Возвращаемое значение :

Вещественное

Описание:

Функция CartesianDistance( ) вычисляет расстояние между двумя точками.

Функция возвращает измеренное расстояние в единицах, указанных параметром unit_name; например, что бы получить расстояние в милях, укажите ”mi” как параметр unit_name . Смотрите оператор Set Distance Units, там полный список возможных единиц измерения.

Функция CartesianDistance( ) всегда возвращает значение, используя для расчетов декартовый алгоритм. Будет возвращено значение -1 для данных в системе координат Широта/Долгота, поскольку система Широта/Долгота не проективная и не декартовая.

Параметры x- и y-координат должны использовать текущую систему координат MapBasic. По умолчанию, MapInfo использует координатную систему долгота/широта. Вы можете поменять систему координат MapBasic используя оператор Set CoordSys.

Если текущая система координат географическая, CartesianDistance( ) возвращает расстояние между двумя точками, измеренное по большой дуге. Расстояние по большой дуге это кратчайшее расстояние на сфере между двумя точками.

Если текущая система координат плановая, то CartesianDistance( ) возвращает декартовое расстояние.

Пример:

Dim dist, start_x, start_y, end_x, end_y As Float

Open Table ”cities”

Fetch First From cities

start_x = CentroidX(cities.obj) start_y = CentroidY(cities.obj) Fetch Next From cities

end_x = CentroidX(cities.obj) end_y = CentroidY(cities.obj)

dist = CartesianDistance(start_x,start_y,end_x,end_y,”mi”)

Смотрите также:

Математические функции,

Функция CartesianDistance (), Функция Distance ()

Справочник MapBasic

61

Функция CartesianObjectLen( )

Функция CartesianObjectLen( )

Назначение:

Возвращает географическую длиту линии или полилинии.

Синтаксис:

CartesianObjectLen( expr , unit_name ) obj_expr выражение объекта

unit_name это строковая величина, представляющая имя единиц измерения расстояния (например, ”km”)

Возвращаемое значение:

Вещественное

Описание:

Функция CartesianObjectLen( ) возвращает длину объекта. Обратите внимание, что только объекты типа линия и полилиния имеют длину большую чем ноль; для измерения периметра полигонов, эллипсов и прямоугольников, используйте функцию Perimeter( ).

Функция CartesianObjectLen( ) всегда будет возвращать значение, используя декартовый алгоритм. Величина -1 будет возвращаться для данных в системе Широта/Долгота, поскольку Широта/ Долгота не проективна и не декартова.

Функция CartesianObjectLen( ) возвращает длину, измеренную в единицах длины, определенных параметром unit_name; например, для получения длины в милях, укажите ”mi” как параметр unit_name. Смотрите описание оператора Set Distance Units там есть список возможных типов единиц измерения длины.

Пример:

Dim geogr_length As Float

Open Table ”streets”

Fetch First From streets

geogr_length = CartesianObjectLen(streets.obj, ”mi”)

geogr_length now represents the length of the

street segment, in miles

Смотрите также:

Запросы к объектам карты, функция SphericalObjectLen (), функция CartesianObjectLen(), функция ObjectLen()

62

Справочник MapBasic

Функция CartesianPerimeter( )

Функция CartesianPerimeter( )

Назначение

Возвращает периметр графических объектов.

Синтаксис

CartesianPerimeter( obj_expr , unit_name ) obj_expr это выражение для объекта

unit_name это строковая величина - имя единицы измерения расстояния (например, ”km”)

Возвращаемое значение

Вещественное

Описание

Функция CartesianPerimeter( ) вычисляет периметр объекта obj_expr object. Функция Perimeter( ) определена для следующих типов объектов: эллипсов, прямоугольников, скругленных прямоугольников и полигонов. Другие типы объектов имеют периметр равный нулю.

Функция CartesianPerimeter( ) всегда будет возвращать значение, вычисленное по декартовому алгоритму. Величина -1 будет возвращаться для денных в системе Широта/Долгота, поскольку Широта/Долгота не проективна и не декартова.

Возвращаемое значение длины периметра осуществляется в единицах длины, определенных параметром unit_name; например, для получения длины в милях, укажите ”mi” в качестве параметра unit_name. Смотрите описание оператора Set Distance Units там есть полный список возможных единиц измерения длины.

Приближенный результат возвращается при измерении периметра скругленного прямоугольника. MapBasic вычисляет периметр скругленного прямоугольника как если бы он не был скругленным.

Пример

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

Dim perim As Float Open Table ”world” Fetch First From world

perim = CartesianPerimeter(world.obj, ”km”)

The variable perim now contains the perimeter of the polygon that’s attached to

the first record in the World table.

Вы можете также использовать функцию CartesianPerimeter( ) внутри оператора SQL Select. Следующий оператор Select выбирает информацию из таблицы States, и хранит результаты во временной таблице, называемой Results. Поскольку оператор Select включает функцию Cartesian Perimeter( ), таблица Results будет включать колонку, показывающую периметр каждого штата.

Open Table ”states”

Select state, CartesianPerimeter(obj, ”mi”)

From states

Into results

Смотрите также:

Функция CartesianPerimeter (), функция SphericalPerimeter (), функция Perimeter ()

Справочник MapBasic

63

Функция Centroid( )

Функция Centroid( )

Назначение:

Возвращает центральную точку объекта (центроид).

Синтаксис:

Centroid(obj_expr)

где

obj_expr – объектное выражение

Величина, полученная в результате:

Точка. Величина типа Object.

Описание:

Функция Centroid(_) возвращает точечный объект, расположенный в центре объекта, представленного параметром obj_expr.

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

Если объект obj_expr является точечным, то функция его и вернет.

Если объект – линия, то в результате получится точка между ее концами. Если параметр obj_expr представляет объект типа "полилиния", то Centroid(_) возвращает середину среднего сегмента полилинии.

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

Пример :

Dim pos As Object

Open Table ”world”

Fetch First From world

pos = Centroid(world.obj)

Смотрите также:

CentroidX( ), CentroidY( )

64

Справочник MapBasic

Функция CentroidX( )

Функция CentroidX( )

Назначение:

Возвращает координату центральной точки (центроида) по оси X.

Синтаксис:

CentroidX(obj_expr)

где

obj_expr – объектное выражение.

Величина, полученная в результате:

Вещественное число. Величина типа Float.

Описание:

Функция CentroidX(_) возвращает X-координату (или долготу) центральной точки объекта – точечного объекта, который можно получить, используя функцию Centroid(_).

Координаты возвращаются относительно действующей координатной системы, которая была назначена до этого оператором Set CoordSys. По умолчанию MapBasic использует систему широта/ долгота.

Пример 1:

Функция CentroidX(_) возвращает долготу одного географического объекта.

Dim x As Float

Open Table "world.tab"

Fetch First From world

x = CentroidX(world.obj)

Note "Долгота: " + x + " град."

Пример 2:

В этом примере продемонстрировано использование функций CentroidX(_) и CentroidY(_) в операторе Select при формировании SQL-запроса. В результате нижеприведенных операторов получается временная таблица из трех колонок, где первая содержит названия стран, а следующие две содержат X- и Y-координаты (долготу и широту) центроида каждой страны.

Open Table "world"

Select country, CentroidX(obj), CentroidY(obj)

From world Into results

Смотрите также:

Centroid(_), CentroidY(_), Set CoordSys

Справочник MapBasic

65

Функция CentroidY( )

Функция CentroidY( )

Назначение:

Возвращает координату центральной точки (центроида) по оси Y.

Синтаксис:

CentroidY(obj_expr)

где

obj_expr – объектное выражение.

Величина, полученная в результате:

Вещественное число. Величина типа Float.

Описание:

Функция CentroidY(_) возвращает Y-координату (или широту) центральной точки объекта – точечного объекта, который можно получить, используя функцию Centroid(_).

Координаты возвращаются относительно действующей координатной системы, которая была назначена перед этим оператором Set CoordSys. По умолчанию MapBasic использует систему широта/долгота.

Пример:

Функция CentroidY(_) возвращает широту одного географического объекта.

Dim y As Float

Open Table "world"

Fetch First From world

y = CentroidY(world.obj)

Смотрите также:

Centroid(_), CentroidX(_), Set CoordSys

66

Справочник MapBasic

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