Получение основных пространственных характеристик объектов в ArcGIS

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Эта страница опубликована в основном списке статей сайта
по адресу http://gis-lab.info/qa/shapecalc-ag.html


Расчеты координат, длин, площадей в таблицу через VBA


В статье рассматривается получение нескольких основных пространственных характеристик объектов без использования дополнительных расширений (extensions), с использованием стандартных возможностей пакета ArcGIS.

Примечание: Рассмотренные в статье возможности начиная с версии 9.2 также доступны через меню Calculate geometry.

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

Тип объекта

Пространственная характеристика

Точка

Координата X
Координата Y

перейти

Линия

Длина

перейти

Полигон

Длина (периметр)
Площадь
Центроид

перейти

Те, кто пользовался или пользуется Mapinfo могут с недоумением отметить отсутствие в Arcview метода быстрого просмотра площади объекта или координат точки. Посмотреть основные пространственные характеристики объекта просто выбрав его в Arcview, ArcGIS в отличие от Mapinfo невозможно. Однако, несмотря на кажующееся неудобство, в этом есть своя логика.

Дело в том, что визуальная оценка параметров объекта, является, по большому счету, довольно бессмысленной задачей. Более оптимально было бы заносить пространственные характеристики объектов непосредственно в атрибутивную таблицу. При желании можно также организовать постоянный мониторинг (обновление) пространственных характеристик объектов, так, как это делает, например, Arcinfo Workstation при работе со своим форматом. Это имеет смысл если вы выполняете серию пространственных операций изменяющих пространственные характеристики объектов и вам нужно следить за их изменениями.

Пространственные характеристики объетов о которых идет речь - неотъемлимая часть их геометрии. В Arcview, ArcGIS получить геометрию объекта можно через специальное поле в таблице - Shape.

При расчете пространственной характеристики важно помнить, что единицы измерения, по умолчанию, будут соответствовать исходным единицам измерения ваших данных. То есть:

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

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

Итак, для занесения пространственной характеристики объекта (объектов), необходимо:

1. Открыть таблицу нажав правой кнопкой на нужном слое, пространственные характеристики объектов которого нужно получить. Выбрать Open Attribute Table

2. Создать в ней поле(поля) нужного формата: целочисленного или с плавающей точкой (в зависимости от типа пространственной характеристики). Options\Add Field...

3. Вызвать инструмент ввода значений всем записям в таблице щелкнув правой кнопкой мыши на заголовке поля и выбрав Calculate Values...

Shapecalc-04.gif

4. В окне Field Calculator включить режим Advanced (Расширенный)

5. В появившейся области Pre-logic VBA Script Code ввести выражение-команду, которая обратится за пространственными характеристиками объекта к полю shape, содержащему геометрию объекта.

Shapecalc-05.gif

1. Полигональный объект

Площадь (Area)

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

Dim Output as double
Dim pArea as IArea
Set pArea = [shape]
Output = pArea.area

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

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

Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Dim pSR As ISpatialReference
Set pSR = pMap.SpatialReference
Dim pPolygon As IPolygon
Dim pArea as IArea
Set pPolygon = [Shape]
pPolygon.Project pSR
Set pArea = pPolygon
Output = pArea.area

В последней области ввода, в заголовке которой значится "area =" ввести output

где Area - название поля, где будет размещен результат вычисления (название поля может быть любым).

Периметр

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

Dim Output as double
Dim pCurve as ICurve
Set pCurve = [shape]
Output = pCurve.Length

Выражение для спроектированного вида (данные в географической системе координат, проекция вида - установлена):

Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Dim pSR As ISpatialReference
Set pSR = pMap.SpatialReference
Dim pCurve As ICurve
Set pCurve = [Shape]
pCurve.Project pSR
Output = pCurve.Length

В последней области ввода, в заголовке которой значится "perimeter =" ввести output

где Perimeter - название поля, где будет размещен результат вычисления (название поля может быть любым).

Центроид (точка - центр масс полигона)

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

Dim Output as double
Dim pArea as IArea
Set pArea = [shape]
Output = pArea.centroid.x

Выражение для спроектированного вида (данные в географической системе координат, проекция вида - установлена):

Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Dim pSR As ISpatialReference
Set pSR = pMap.SpatialReference
Dim pPolygon As IPolygon
Dim pArea as IArea
Set pPolygon = [Shape]
pPolygon.Project pSR
Set pArea = pPolygon
Output = pArea.centroid.x

В последней области ввода, в заголовке которой значится "centerx =" ввести output. Для получения координаты Y - заменить в последней строке x на y.

Сenterx, centery- название предварительно созданных полей, где будут размещены результаты вычисления (название полей могут быть любыми).

2. Линейный объект:

Длина

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

Dim Output as double
Dim pCurve as ICurve
Set pCurve = [shape]
Output = pCurve.Length

Выражение для спроектированного вида (данные в географической системе координат, проекция вида - установлена):

Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Dim pSR As ISpatialReference
Set pSR = pMap.SpatialReference
Dim pCurve As ICurve
Set pCurve = [Shape]
pCurve.Project pSR
Output = pCurve.Length

В последней области ввода, в заголовке которой значится "length =" ввести output

где Length - название поля, где будет размещен результат вычисления (название поля может быть любым).

3. Точечный объект:

Для получения координат точек, нужно создать 2 поля и ввести 2 выражения.

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

Для долготы (longitude):

Shapecalc3.gif

Dim pPoint As IPoint
Set pPoint = [Shape]
output = pPoint.x

В последней области ввода, в заголовке которой значится "lat =" ввести output

Для широты (latitude):

Dim pPoint As IPoint
Set pPoint = [Shape]
output = pPoint.y

В последней области ввода, в заголовке которой значится "lat =" ввести output

Выражение для спроектированного вида (данные в географической системе координат, проекция вида - установлена):

Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Dim pSR As ISpatialReference
Set pSR = pMap.SpatialReference
Dim pPoint As IPoint
Set pPoint = [Shape]
pPoint.Project pSR

В последнем поле, в заголовке которого значится "'long =" или "'lat =" ввести pPoint.x или pPoint.y соответственно.

где Long, Lat - название полей, где будет размещен результат вычисления (название поля может быть любым).

Для того, чтобы координаты в dd.dddddd разложить на ddmmss необходимо добавить в скрипт следующее выражение:

ff = pPoint.X

dd = Int(ff)
mm = Int((ff - dd) * 60)
ss = Round(ff * 3600 - dd * 3600 - mm * 60, 1)
sdd = Format(dd, "##")
If dd < 10 Then sdd = "0" + sdd
smm = Format(mm, "##")
If mm < 10 Then smm = "0" + smm
sss = Format(ss, "##.#")
If ss < 10 Then sss = "0" + sss
If Len(sss) = 3 Then sss = sss + "0"
DDD2DMS = sdd + "° " + smm + "' " + sss + "'

Поле куда записывается результат должно быть строковым, а в строке ff = pPoint.X ставим X или Y.

Заключение

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


Ссылки по теме