Реализую ILayer и изнутри добавяляю элеме

0 голосов
спросил 17 Окт, 05 от Appl (1,340 баллов) в категории Программные продукты Esri

Реализовал на c# .net свой Layer от ILayer. Столкнулся со следующей проблемой. Можно ли допустим в конструкторе Layer написать создание элементов прорисованных на самом layer?  До сих пор элементы добавлял через вызов axMapControl.ActiveView.GraphicsContainer.AddElement (смутно представляя что за слова посередине), однако теперь возникла необходимость рисовать на конкретном слое изнутри. есть ли такая возможность?

 

 

Прошу прощения если вопрос глуп или некорректен, я новичёк в ArcGIS и много чего не понимаю в нём.

1 Ответ

0 голосов
ответил 31 Окт, 05 от Grigoriy (127,020 баллов)

Если попроще описать, то GraphicsContainer - графический контейнер, принадлежит активному фрейму данных. Содержит графические примитивы и аннотации карты (немного грубовато описано). Объекты, добавляемые в графический контейнер хранятся внутри текущего проекта (файл mxd). Чем больше объектов, тем тяжелее mxd. Layer - слой также принадлежит активному фрейму данных. Хранит не сами данные, а указывает где они лежат и как отображаются. Теперь что значит "рисовать на конкретном слое изнутри" ? Редактировать данные? Или связать графические примитивы с определенным слоем? Для второго варианта необходимо использовать активную группу аннотаций. Попробуйте руками создать в ArcMap с помощью панели Рисования (Draw) новую группу аннотаций и добавьте графический примитив на карту, чтобы понять как это будет работать.

А код будет выглядеть прмерно так:

Option Explicit


Public Sub AddTextToGralayer()

Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pTextElement As ITextElement
Set pTextElement = New TextElement
Dim pElement As IElement
Set pElement = pTextElement
pTextElement.Text = "Text in a callout" & vbCrLf & "In middle of screen"
Dim dMidX As Double, dMidY As Double, pPoint As IPoint
dMidX = (pMxDoc.ActiveView.Extent.XMax + pMxDoc.ActiveView.Extent.XMin) / 2
dMidY = (pMxDoc.ActiveView.Extent.YMax + pMxDoc.ActiveView.Extent.YMin) / 2
Set pPoint = New Point
pPoint.PutCoords dMidX, dMidY
pElement.Geometry = pPoint
Dim pTextSymbol As IFormattedTextSymbol
Set pTextSymbol = New TextSymbol
Dim pCallout As ICallout
Set pCallout = New BalloonCallout
Set pTextSymbol.Background = pCallout
pPoint.PutCoords dMidX - pMxDoc.ActiveView.Extent.Width / 4, _
dMidY + pMxDoc.ActiveView.Extent.Width / 20
pCallout.AnchorPoint = pPoint
pTextElement.Symbol = pTextSymbol
' get ICompositeGraphicsLayer
Dim pMap As IMap
Set pMap = pMxDoc.ActiveView.FocusMap
Dim pCompGraLyr As ICompositeGraphicsLayer
Set pCompGraLyr = pMap.BasicGraphicsLayer

Dim pLayer As ILayer
Set pLayer = FindLayerByName(pMap, "Ваш слой")

Dim pGraLyr As IGraphicsLayer
Set pGraLyr = pCompGraLyr.AddLayer("MyLayer", pLayer)
pGraLyr.UseAssociatedLayerVisibility = True

Dim pGraphicsContainer As IGraphicsContainer
Set pGraphicsContainer = pGraLyr
pGraphicsContainer.AddElement pElement, 0
pElement.Activate pMxDoc.ActiveView.ScreenDisplay
pGraLyr.Activate pMxDoc.ActiveView.ScreenDisplay
pMxDoc.ActiveView.PartialRefresh esriViewGraphics, Nothing, Nothing

End Sub

Function FindLayerByName(pMap As IMap, sName As String) As ILayer
  Dim i As Integer
  For i = 0 To pMap.LayerCount - 1
    If pMap.Layer(i).Name = sName Then
      Set FindLayerByName = pMap.Layer(i)
    End If
  Next
End Function

 

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