Mais

Obter propriedades de origem de camada DataType programaticamente com ArcObjects?

Obter propriedades de origem de camada DataType programaticamente com ArcObjects?


Estou tentando acessar a propriedade DataType de uma camada no TOC no ArcMap. A camada é adicionada a partir de um serviço da web como um IMapServerRESTLayer. A propriedade Data Type é listada comCamada -> Propriedades -> fontecomo na captura de tela a seguir.

A camada do mapa tem um Type Of ICompositeLayer. É um mapa base.

Coisas que tentei.

Não pode ser convertido como IFeatureLayer. Eu olhei para o Carto Object Model Diagram e não consigo encontrar uma propriedade DataLayer em nada, exceto IMobileLayerInfo. e um ServiceDataType semelhante em IImageServerLayer. Tentei fazer projeções de interface para esses objetos, mas falhou.

Analisado usando folhas de IComProperty… consegui criar uma versão não preenchida, mas acho que esse não é o caminho a percorrer.

Estou programando em VB.Net (mas posso ler C #) no ArcGIS 10.2 usando VS2010

Alguma ideia?


Aqui está o código que tenho usado para testar, recuperar a camada e testá-la. Este é o método ao clicar para um botão de comando dentro de um suplemento ArcMap. Faz parte de uma barra de ferramentas maior. Existem comentários sobre o resultado de várias partes do código.

Substituições protegidas Sub OnClick () Const csProceedureName As String = "cmdListBaseMap_OnClick" MsgBox ("In" & csProceedureName & vbNewLine & My.ThisAddIn.Name & vbNewLine & "Versão" & My.ThisAddIn.Version & vbNewLine & "Date &" vbNewLine & "Date. ThisAddIn.Date) Try Dim pApp As IApplication Dim pMxDoc As IMxDocument Dim pMap As IMap Dim pView As IActiveView Dim resturl As String 'resturl = "http://services.thelist.tas.gov.au/arcgis/rest/services/Basemaps /Topographic/ImageServer/?f=lyr&v=9.3 "'v1' works resturl =" http://services.thelist.tas.gov.au/arcgis/rest/services/Basemaps/Topographic/ImageServer/?f=lyr " 'v2' funciona 'resturl = "http://services.thelist.tas.gov.au/arcgis/services/Basemaps/Topographic/ImageServer"' v3 'não funciona, não deixa uma conexão' houve um problema ao obter a interface para trabalhar. 'Além de carto, é necessário incluir ESRI.ArcGIS.DataSourceRaster Dim RESTLayer As IMapServerRESTLayer RESTLayer = Novo MapServerRESTLayer Dim pLayer As ILayer Dim pFLayer As IFeatureLayer Dim pGenProperties As ILayerGouseorCursor.New MouseCursor IMayerGouseorCursor 2 MouseCursorCursor. ArcMap.Application pMxDoc = pApp.Document pMap = pMxDoc.FocusMap pView = pMxDoc.ActiveView 'Use web HttpWebRequest para ver se a conexão está OK e assim pode recuperar o arquivo Dim request_json_url As String = "http://services.thelist.tas.gov. au / arcgis / rest / services / Basemaps / Topographic / ImageServer /? f = json "Solicitar Dim As HttpWebRequest = DirectCast (HttpWebRequest.Create (request_json_url), HttpWebRequest) Resposta Dim As HttpWebResponse = DirectCast (request.GetRWebResponse, HttpBoxResponse) ("Fazendo teste" & response.StatusCode.ToString & "" & response.StatusDescription & "" & HttpStatusCode.OK.ToString) If response.StatusCode = HttpStatusCode.OK Then 'conexão e responda se OK 'MsgBox ("Status Code" & response.StatusCode & vbNewLine & "Status description" & response.StatusDescription & vbNewLine & "Encoding" & response.CharacterSet)' este é um método para obter o arquivo json 'Dim encoding As Text .Encoding = System.Text.Encoding.GetEncoding (response.CharacterSet) 'Dim reader As New StreamReader (response.GetResponseStream (), encoding)' Dim streamtext As String = reader.ReadToEnd () 'MsgBox (streamtext) "use um webclient para verificar a conexão, o try cast faz o tratamento de exceções 'Dim wc As WebClient = Novo WebClient' Dim response_client As String 'response_client = wc.DownloadString (request_json_url)' MsgBox (response_client) 'Get basemap RESTLayer.Connect (resturl) RESTLayer.TransparentBackground ( True) 'esta conversão funciona pLayer = TryCast (RESTLayer, ILayer) If pLayer Is Nothing Then MsgBox ("Transmissão de MapServerRESTLayer para Ilayer falhou") Else MsgBox ("Transmissão de MapServerRESTLayer para Ilayer OK") End If' Dim pDataLayer como IDataLayer ") este elenco trabalha 'pDataLa yer = TryCast (RESTLayer, IDataLayer) 'If pDataLayer is Nothing Then' MsgBox ("Transmissão de MapServerRESTLayer para IDataLayer falhou") 'Else' MsgBox ("Transmissão de MapServerRESTLayer para IDataLayer OK -" & pDataLayer ".DataSourceName - "& pDataLayer ".DataSourceName -" & pDataLayer ". ) 'O nome está vazio "a conversão aqui falha: então nenhum caminho para IIMageserver' Dim pServerLayer As IImageServerLayer 'pServerLayer = TryCast (pDataLayer, IImageServerLayer)' Se pServerLayer não é nada então 'MsgBox (" Transmissão de MapServerRESTLayer para IDataLayer' falhou ' Else 'MsgBox ("Transmitir de MapServerRESTLayer para IDataLayer para IImageServerLayer OK" & pServerLayer.ServiceInfo.ServiceDataType.ToString)' End If 'End If "este elenco falhar' Dim pServerLayer As IImageServerLayer 'pServerServerLayer' pServerServerLayer 'pServerSayer = TryCayer (IImageServerLayer) Is Nothing Then 'MsgBox ("Transmissão de MapServerRESTLayer para IImageServerLayer falhou")' Else 'MsgBox ("Transmissão de MapServerRESTLayer para IImageServerLayer OK" & pServerLayer.ServiceInfo.ServiceDataType.ToStr ing) 'End If "este cast também falha' Dim pServerLayerA As IImageServerLayer 'pServerLayerA = TryCast (pLayer, IImageServerLayer)' If pServerLayerA Is Nothing Then 'MsgBox (" Cast from ILayer para IImageServerLayer falhou ")' Else 'Msg ILayer para IImageServerLayer OK "& pServerLayerA.ServiceInfo.ServiceDataType.ToString) 'End If' Esta sequência de transmissão falha na primeira conversão 'Dim pMapServerLayer As IMapServerLayer' pMapServerLayer = TryCast (RESTLerver, IMapServerSayer Nothing ' de MapServerRESTLayer para IMapServerLayer falhou ") 'Else' MsgBox (" Transmitir de MapServerRESTLayer para IMapServerLayer OK ") 'Dim pImageServerLayerC As IImageServerLayer' pImageServerLayerC = TryCast (pLayer, ThenmageServerLayer ' IImageServerLayer falhou ") 'Else' MsgBox (" * Cast de IMapServerLayer para IImageServerLayer OK "& pImageServerLayerC.ServiceInfo.ServiceDataType.ToString) 'End If' En d Se 'transmissão falhou' Dim ImageServiceInfo As IImageServiceInfo 'ImageServiceInfo = TryCast (pLayer, ImageServiceInfo)' Se ImageServiceInfo for Nothing Then 'MsgBox ("Transmissão de ILayer para IImageServiceInfo falhou")' Else 'MsgBoxS & vbNewLine & _ '"Service Data Type" & ImageServiceInfo.ServiceDataType & vbNewLine & _' "Service Source Type" & ImageServiceInfo.ServiceSourceType & vbNewLine & _ '"Default Service Properties" & ImageServiceInfo.DefaultServiceProperties)' If 'This works' Retorna a descrição 'isso retorna uma string com' "Tasmania Topographic base map", "LIST web service" 'para serviços e condições, consulte URL para serviços e consições pdf "pGenProperties = TryCast (pLayer, ILayerGeneralProperties)' If pGenProperties Is Nothing Then ' MsgBox ("Sem propriedades gerais") 'Else' MsgBox ("Propriedades -" & pGenProperties.LayerDescription & "-") 'End If "Este elenco funciona' Dim pCompositeLayer As ICompositeLayer2 'pCompositeLayer = Tr yCast (pLayer, ICompositeLayer2) 'If pCompositeLayer is Nothing Then' MsgBox ("Transmissão de ILayer para ICompositeLayer falhou") 'Else' MsgBox ("Transmissão de ILayer para ICompositeLayer OK" & pCompositeLayer.Count.ToString) 'If "End This cast.ToString) também funciona 'Dim pCompositeLayerA As ICompositeLayer2' pCompositeLayerA = TryCast (RESTLayer, ICompositeLayer2) 'Se pCompositeLayerA não for nada, então' MsgBox ("Transmitir de ReST para ICompositeLayer falhou") 'Else' MsgiteLomposite para IComposite. " Count.ToString) 'End If' adicionar camada para mapear pMap.AddLayer (pLayer) pView.Refresh () 'ambas as versões da camada importada são ILayer, IDataLayer, ICompositeLayer MsgBox ("player" & pLayer.Name & "é do tipo "& LayerType (pLayer)) MsgBox (" RESTLayer "& pLayer.Name &" é do tipo "& LayerType (pLayer)) pMxDoc.ActiveView.Refresh () MsgBox (" Camada de mapa base "& pLayer.Name &" foi adicionado ") Else MsgBox (" ERROR ("& csProceedureName &") "& response.StatusCode & vbNewLine & response.StatusDescri ption) End If Mouse_cursor.SetCursor (0) Catch ex As Exception MsgBox ("Error" & ex.Message) End Try End Sub Protegido Substituições Sub OnUpdate () End Sub Função pública LayerType (ByVal pLayer As ILayer) As String 'camada de retorno TypeOf LayerType = "" Se TypeOf jogador é ilayer Então LayerType = LayerType & "" & "ilayer" End If Se TypeOf jogador é IACAcetateLayer Então LayerType = LayerType & "" & "IACAcetateLayer" End If Se TypeOf jogador é IACImageLayer Então LayerType = LayerType & "" & "IACImageLayer" End If If TypeOf pLayer Is IACFeatureLayer Then LayerType = LayerType & "" & "IACFeatureLayer" End If If TypeOf pLayer Is IACFeatureLayer Then LayerType = LayerType & "" & "IACFeatureLayer" End If If TypeOf pLayer Is IACFeatureLayer Then LayerType = LayerType & "IACFeatayer" Then LayerType = LayerType & "" & "IACLayer" End If If TypeOf pLayer Is IAnnotationLayer Then LayerType = LayerType & "" & "IAnnotationLayer" End If If TypeOf pLayer Is IAnnotationSublayer Then "LayerType = LayerType &" IF Tipo de Player é ICadastralFabricLayer Então LayerType = LayerType & "" & "ICadastralFabricLayer" End If Se TypeOf jogador é ICadLayer Então LayerType = LayerType & "" & "ICadLayer" End If Se TypeOf jogador é ICompositeGraphicsLayer Então LayerType = LayerType & "" & "ICompositeGraphicsLayer" End If Se TypeOf jogador é ICompositeLayer Então LayerType = LayerType & "" & "ICompositeLayer" End If Se TypeOf jogador é ICoverageAnnotationLayer Então LayerType = LayerType & "" & "ICoverageAnnotationLayer" End If Se TypeOf jogador é IDataLayer Então LayerType = LayerType & "" & "IDataLayer" End If Se TypeOf jogador é IDimensionLayer Então LayerType = LayerType & "" & "IDimensionLayer" End If Se TypeOf jogador é IFDOGraphicsLayer Então LayerType = LayerType & "" & "IFDOGraphicsLayer" End If Se TypeOf jogador é IFeatureLayer Então LayerType = LayerType & "" & "IFeatureLayer" End If If TypeOf pLayer Is IGdbRasterCatalogLayer Then LayerType = LayerType & "" & "IGdbRasterCatalogLayer" End If If TypeOf pL ayer é IGeoFeatureLayer Then LayerType = LayerType & "" & "IGeoFeatureLayer" End If If TypeOf pLayer Is IGraphicsLayer Then LayerType = LayerType & "" & "IGraphicsLayer" End If If TypeOf pLayer "IGraphicsLayer Then LayerType" IGraphicsLayer & "LayerType" End If Se TypeOf jogador é IIMSMapLayer Então LayerType = LayerType & "" & "IIMSMapLayer" End If Se TypeOf jogador é IIMSSubLayer Então LayerType = LayerType & "" & "IIMSSubLayer" End If Se TypeOf jogador é IImageServerLayer Então LayerType = LayerType & "" & "IImageServerLayer" End If Se TypeOf jogador é IImageServerLayer2 Então LayerType = LayerType & "" & "IImageServerLayer2" End If Se TypeOf jogador é IImageServerLayer3 Então LayerType = LayerType & "" & "IImageServerLayer3" End If Se TypeOf jogador é IMapServerLayer Então LayerType = LayerType & "" & "IMapServerLayer" End If If TypeOf pLayer Is IMapServerSublayer Then LayerType = LayerType & "" & "IMapServerSublayer" End If If TypeOf pLayer Is INetworkLayer Then LayerType = LayerType & "" & "INetworkLayer" End If If TypeOf pLayer Is IRasterCatalogLayer Then LayerType = LayerType & "" & "IRasterCatalogLayer" End If If TypeOf pLayer Is IRasterLayer Then End LayerType = LayerType & "" & "IRasterLayer Isayer" ITemporaryLayer Then LayerType = LayerType & "" & "ITemporaryLayer" End If If TypeOf pLayer Is ITerrainLayer Then LayerType = LayerType & "" & "ITerrainLayer" End If If TypeOf pLayer Is ITinLayer Então LayerType = LayerType & "" & "ITerrainLayer" End If If TypeOf pLayer Is ITinLayer "End LayerType = LayerType &" End If If TypeOf pLayer Is ITinLayer Then LayerType = LayerType & " Se TypeOf jogador é ITopologyLayer Então LayerType = LayerType & "" & "ITopologyLayer" End If Se TypeOf jogador é IWMSGroupLayer Então LayerType = LayerType & "" & "IWMSGroupLayer" End If Se TypeOf jogador é IWMSLayer Então LayerType = LayerType & "" & " IWMSLayer "End If If TypeOf pLayer Is IWMSMapLayer Then LayerType = LayerType &" "&" IWMSMapLayer "End If 'Else' LayerType =" UnKnown "'End If End Function

Posso verificar a URL em seu instantâneo e dizer que a camada com a qual você está tentando trabalhar é uma camada ImageServer.

http://services.thelist.tas.gov.au/arcgis/rest/services/Basemaps/Topographic/ImageServer

Você não pode acessar uma camada do servidor de imagens como uma camada de feição.

Você só pode acessar as camadas do servidor de mapa que têm "Acesso à feição" habilitado, como uma camada da feição. (por exemplo, transmiti-los para IFeatureLayer)


Assista o vídeo: Aula 09 - Configuração das Propriedades das Camadas do QGIS.