Length и Area в GCS?

0 голосов
спросил 11 Авг, 09 от Ulukbek (6,020 баллов) в категории Программные продукты Esri
В чем измеряется (или в каких единицах храняться) Shape_Length и Shape_Area в слоях, созданных в географической система координат, в частности в WGS84?

Как их перевести в Метр?

5 Ответы

0 голосов
ответил 12 Авг, 09 от dsavitskiy (10,720 баллов)
Значения Shape_Length и Shape_Area, для слоев внутри БГД храняться в тех же единицах, что и СК, назначенная этому Feature Class
0 голосов
ответил 12 Авг, 09 от Ulukbek (6,020 баллов)
О, да! Длина в угловых градусах, а площадь в сдвоенных градусах!

Я поискал в форумах esri, там говорят, что надо перепроецировать слой в PCS своей зоны... и создать одно или два поля для длины и площади... и скопировать метровые значения...

Мне особо не нравиться такой подход, и в будущем хочу написать скриптик для получения метровых полей без перепроецирования. Потом выложу.
0 голосов
ответил 13 Авг, 09 от dsavitskiy (10,720 баллов)
Вас ведь не удивляет, что вы наносите линейные объекты на поверхность эллипсоида по координатам в градусах? :) Естественно, что и площадь объекта на поверхности этого эллипсоида вы считаете в тех же единицах.
А после перепроецирования в Projected CS поля, мне кажется, тоже будут пересчитаны в единицы новой СК.
На будущий скриптик посмотреть интересно, но мне кажется что он будет "немаленьким". Как бы проще не оказалось использовать готовый мат.аппарат и перепроецировать класс объектов для решения поставленной задачи.
0 голосов
ответил 13 Авг, 09 от Grigoriy (127,020 баллов)
Всё давно написано и неоднократно :).
качаем любимый калькулятор:
http://arcscripts.esri.com/details.asp?dbid=12224
создаем числовое поле для класса объектов, открываем ArcMap, выставляем проекцию, открываем таблицу
и в калькулятор ArcGIS вставляем выражение из файла
polygon_Return_Area.cal
Не забудьте поменять bSrefFromMap = False на True и выбрать единицы измерения площади.

Можно, конечно, при желании и свой инструмент создать.

0 голосов
ответил 14 Авг, 09 от Ulukbek (6,020 баллов)
Калькулятор посмотрел, да, много чего сделано! но поздно посмотрел...

Вот мое первое приближение:

Option Explicit

Private Sub UIButtonControl1_Click()
   Dim pMxDoc As IMxDocument
   Set pMxDoc = ThisDocument
   Dim pUID As New UID
   pUID = "{E156D7E5-22AF-11D3-9F99-00C04F6BC78E}" 'IGeoFeatureLayer IID
   Dim pEnumLayer As IEnumLayer
   Set pEnumLayer = pMxDoc.FocusMap.Layers(pUID, True)
   pEnumLayer.Reset
   Dim pFeatureLayer As IFeatureLayer
   Dim pFeatureSelection As IFeatureSelection
   Dim pFeatureCursor As IFeatureCursor
   Dim pFeature As IFeature, pFT2 As IFeature
   Dim pArea As IArea, pCurve As ICurve
   Dim dTotalArea As Double, dTotLen As Double
   Set pFeatureLayer = pEnumLayer.Next
   Do Until (pFeatureLayer Is Nothing)
      If (pFeatureLayer.FeatureClass.ShapeType = esriGeometryPolygon Or pFeatureLayer.FeatureClass.ShapeType = esriGeometryPolyline) Then
         Set pFeatureSelection = pFeatureLayer
         If (pFeatureSelection.SelectionSet.Count <> 0) Then
            pFeatureSelection.SelectionSet.Search Nothing, True, pFeatureCursor
            Set pFeature = pFeatureCursor.NextFeature
            Do Until (pFeature Is Nothing)
                If TypeOf pFeature.Shape.SpatialReference Is IGeographicCoordinateSystem Then
                    If (pFeatureLayer.FeatureClass.ShapeType = esriGeometryPolygon) Then
                        Set pArea = FeatureProj(pFeature)
                        dTotalArea = dTotalArea + pArea.Area
                    End If
                    If (pFeatureLayer.FeatureClass.ShapeType = esriGeometryPolyline) Then
                        Set pCurve = FeatureProj(pFeature)
                        dTotLen = dTotLen + pCurve.Length
                    End If
                End If
                Set pFeature = pFeatureCursor.NextFeature
            Loop
         End If
      End If
      Set pFeatureLayer = pEnumLayer.Next
   Loop
   MsgBox "Общая длина, М = " & CStr(dTotLen) & vbCrLf & "Общая площадь, м2 = " & CStr(dTotalArea)
End Sub

Function FeatureProj(pFeat As IFeature) As IGeometry
    Dim pSpatialReferenceEnv As SpatialReferenceEnvironment
    Set pSpatialReferenceEnv = New SpatialReferenceEnvironment
    Dim pFromSR As ISpatialReference
    Set pFromSR = pSpatialReferenceEnv.CreateGeographicCoordinateSystem(esriSRGeoCS_WGS1984)
    Dim pToSR As ISpatialReference
    'Set pToSR = pSpatialReferenceEnv.CreateProjectedCoordinateSystem(esriSRProjCS_WGS1984UTM_42N)
    Set pToSR = pSpatialReferenceEnv.CreateProjectedCoordinateSystem(GetPCS(pFeat.Shape.Envelope))
    Dim pGeo As IGeometry
    Set pGeo = pFeat.ShapeCopy
    pGeo.Project pToSR
    Set FeatureProj = pGeo
End Function

Function GetPCS(env As IEnvelope) As Long
    Dim pp As IPoint, ar As IArea
    Set ar = env
    Set pp = ar.Centroid
    Dim d As Double, ai As Long, rl As Long
    ' 32600 - esriSRProjCS_WGS1984UTM N
    ' 32700 - esriSRProjCS_WGS1984UTM S
    d = pp.X / 6
    ai = Round(d)
    rl = ai + IIf(pp.Y > 0, 32600, 32700) + 30
    GetPCS = rl
End Function


есть ошибка миллиметровая, не пойму почему!?
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...