Suite

Obtenir par programme les propriétés de la source de la couche DataType avec ArcObjects ?


J'essaie d'accéder à la propriété DataType d'une couche dans la table des matières dans ArcMap. La couche est ajoutée à partir d'un service Web en tant que IMapServerRESTLayer. La propriété Type de données est répertoriée avecCalque -> Propriétés -> sourcecomme dans la capture d'écran suivante.

La couche de carte a un Type Of ICompositeLayer. C'est un fond de carte.

Des choses que j'ai essayées.

Il ne peut pas être converti en IFeatureLayer. J'ai regardé le diagramme de modèle d'objet Carto et je ne trouve pas de propriété DataLayer sur autre chose que IMobileLayerInfo. et un ServiceDataType similaire sur IImageServerLayer. J'ai essayé de faire des conversions d'interface vers ces objets, mais a échoué.

J'ai examiné l'utilisation de IComProperty Sheets… j'ai réussi à créer une version non remplie, mais je pense que ce n'est pas la voie à suivre.

Je programme en VB.Net (mais je peux lire C#) dans ArcGIS 10.2 à l'aide de VS2010

Des idées?


Voici le code que j'ai utilisé pour tester, récupérer la couche et la tester. Il s'agit de la méthode au clic pour un bouton de commande dans un complément ArcMap. Cela fait partie d'une plus grande barre d'outils. Il y a des commentaires sur le résultat de diverses parties du code.

Protected Overrides Sub OnClick() Const csProceedureName As String = "cmdListBaseMap_OnClick" MsgBox("In " & csProceedureName & vbNewLine & My.ThisAddIn.Name & vbNewLine & " Version " & My.ThisAddIn.Version & vbNewLine & " Date " & My. ThisAddIn.Date) Essayez 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 ' fonctionne resturl = "http://services.thelist.tas.gov.au/arcgis/rest/services/Basemaps/Topographic/ImageServer/?f=lyr" ' v2 ' fonctionne ' resturl = "http://services.thelist.tas.gov.au/arcgis/services/Basemaps/Topographic/ImageServer" ' v3 ' ne fonctionne pas, ne laisse pas de connexion ' il y a eu un problème pour obtenir l'interface pour travailler. ' En plus de carto nécessaire pour inclure ESRI.ArcGIS.DataSourceRaster Dim RESTLayer As IMapServerRESTLayer RESTLayer = New MapServerRESTLayer Dim pLayer As ILayer Dim pFLayer As IFeatureLayer Dim pGenProperties As ILayerGeneralProperties Dim Mouse_cursor.C Set Mouse_cursor As New Mouse(2)Cursor ArcMap.Application pMxDoc = pApp.Document pMap = pMxDoc.FocusMap pView = pMxDoc.ActiveView ' Utilisez le Web HttpWebRequest pour voir si la connexion est correcte et ainsi récupérer le fichier Dim request_json_url As String = "http://services.thelist.tas.gov. au/arcgis/rest/services/Basemaps/Topographic/ImageServer/?f=json" Dim request As HttpWebRequest = DirectCast(HttpWebRequest.Create(request_json_url), HttpWebRequest) Dim response As HttpWebResponse = DirectCast(request.GetResponsponsponse) ("Faire le test " & response.StatusCode.ToString & " " & response.StatusDescription & " " & HttpStatusCode.OK.ToString) Si response.StatusCode = HttpStatusCode.OK Then ' connection et respon se OK 'MsgBox("Status Code " & response.StatusCode & vbNewLine & " Status description " & response.StatusDescription & vbNewLine & " Encoding " & response.CharacterSet) ' c'est une méthode pour obtenir le fichier 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)"utiliser un client Web pour vérifier la connexion, le cast d'essai gère les exceptions 'Dim wc As WebClient = New WebClient 'Dim response_client As String ' response_client = wc.DownloadString(request_json_url) ' MsgBox(response_client) ' Get fondmap RESTLayer.Connect(resturl) RESTLayer.TransparentBackground( True) ' ce cast fonctionne pLayer = TryCast(RESTLayer, ILayer) If pLayer Is Nothing Then MsgBox("Le cast de MapServerRESTLayer vers Ilayer a échoué") Else MsgBox("Cast from MapServerRESTLayer to Ilayer OK") End If 'Dim pDataLayer As IDataLayer" ce casting fonctionne 'pDataLa yer = TryCast(RESTLayer, IDataLayer) 'Si pDataLayer n'est rien, alors ' MsgBox("La diffusion de MapServerRESTLayer vers IDataLayer a échoué") 'Else ' MsgBox("La diffusion de MapServerRESTLayer vers IDataLayer OK -" & pDataLayer.DataSourceName--NameStr ) ' Le nom est vide "la diffusion ici échoue : donc aucun chemin vers IIMageserver ' Dim pServerLayer As IImageServerLayer ' pServerLayer = TryCast(pDataLayer, IImageServerLayer) ' Si pServerLayer n'est rien, alors ' MsgBox("Cast from MapServerRESTLayer I") vers IData'Layer a échoué Else ' MsgBox("Cast de MapServerRESTLayer à IDataLayer à IImageServerLayer OK " & pServerLayer.ServiceInfo.ServiceDataType.ToString) ' End If 'End If" ce cast échoue 'Dim pServerLayer As IImageServerLayer 'pServerLayer = TryCast,'Image Is Nothing Then ' MsgBox("La diffusion de MapServerRESTLayer vers IImageServerLayer a échoué") 'Else ' MsgBox("Diffusion de MapServerRESTLayer vers IImageServerLayer OK " & pServerLayer.ServiceInfo.ServiceDataType.ToStr ing) 'End If" ce cast échoue également 'Dim pServerLayerA As IImageServerLayer 'pServerLayerA = TryCast(pLayer, IImageServerLayer) 'If pServerLayerA Is Nothing Then ' MsgBox(" Cast de ILayer vers IImageServerLayer a échoué ") 'Else( ILayer vers IImageServerLayer OK " & pServerLayerA.ServiceInfo.ServiceDataType.ToString) 'End If ' Cette séquence de cast échoue au premier cast 'Dim pMapServerLayer As IMapServerLayer 'pMapServerLayer = TryCast(RESTLayer, IMapServerLayer) 'If pMapServerLayer Nothing de MapServerRESTLayer à IMapServerLayer a échoué") 'Else ' MsgBox("Cast de MapServerRESTLayer à IMapServerLayer OK") ' Dim pImageServerLayerC As IImageServerLayer ' pImageServerLayerC = TryCast(pLayer, IImageServerLayerLayerBox) ' Then IImageServerLayer a échoué") ' Else ' MsgBox("* Cast de IMapServerLayer vers IImageServerLayer OK " & pImageServerLayerC.ServiceInfo.ServiceDataType.ToString) ' End If 'En d If ' cast failed 'Dim ImageServiceInfo As IImageServiceInfo 'ImageServiceInfo = TryCast(pLayer, ImageServiceInfo) 'If ImageServiceInfo n'est rien alors ' MsgBox("La diffusion de ILayer vers IImageServiceInfo a échoué") 'Else ' MsgBox("La diffusion de ILayer vers IImageServiceInfo OK " & vbNewLine & _ ' " Type de données de service " & ImageServiceInfo.ServiceDataType & vbNewLine & _ ' " Type de source de service " & ImageServiceInfo.ServiceSourceType & vbNewLine & _ ' " Propriétés de service par défaut " & ImageServiceInfo.DefaultServiceProperties) ' Fin si ' Cela fonctionne ' Renvoie la description ' cela renvoie une chaîne avec ' "Tasmania Topographic base map", "LIST web service" ' pour les services et les conditions voir URL vers les services et les consitions pdf"pGenProperties = TryCast(pLayer, ILayerGeneralProperties) 'If pGenProperties Is Nothing Then ' MsgBox("Pas de propriétés générales") 'Else ' MsgBox("Properties -" & pGenProperties.LayerDescription & "-") 'End If"Cette distribution fonctionne 'Dim pCompositeLayer As ICompositeLayer2 'pCompositeLayer = Tr yCast(pLayer, ICompositeLayer2) 'Si pCompositeLayer n'est rien, alors ' MsgBox("La conversion de ILayer vers ICompositeLayer a échoué") 'Else ' MsgBox("Cast de ILayer vers ICompositeLayer OK " & pCompositeLayer.Count.ToString") 'EndThis fonctionne également 'Dim pCompositeLayerA As ICompositeLayer2 'pCompositeLayerA = TryCast(RESTLayer, ICompositeLayer2) 'If pCompositeLayerA Is Nothing Then ' MsgBox("La diffusion de ReST vers ICompositeLayer a échoué") 'Else ' MsgBox de Rest. Count.ToString) 'End If' add layer to map pMap.AddLayer(pLayer) pView.Refresh() ' les deux versions du calque importé sont ILayer, IDataLayer, ICompositeLayer MsgBox("player " & pLayer.Name & " est de type " & LayerType(pLayer)) MsgBox("RESTLayer " & pLayer.Name & " est de type " & LayerType(pLayer)) pMxDoc.ActiveView.Refresh() MsgBox("Base map layer " & pLayer.Name & "a été ajouté") Else MsgBox("ERREUR ( " & 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 Protected Overrides Sub OnUpdate() End Sub Public Function LayerType(ByVal pLayer As ILayer) As String ' return layer TypeOf LayerType = "" If TypeOf pLayer Is ILayer Then LayerType = LayerType & " " & "ILayer" End If If If TypeOf pLayer Is IACAcetateLayer Then LayerType = LayerType & " " & "IACAcetateLayer" End If If Si TypeOf pLayer IACImageLayer Then LayerType = LayerType & " " & "IACImageLayer" End If If If TypeOf pLayer IACFeatureLayer Then LayerType = LayerType & " " & "IACFeatureLayer" End If If If TypeOf pLayer IACFeatureLayer Then LayerType = LayerType & " " & "IACFeatureLayer" End If If Si TypeOf pLayer IACLayer Then LayerType = LayerType & " " & "IACLayer" End If Si TypeOf pLayer Is IAnnotationLayer Then LayerType = LayerType & " " & " IAnnotationLayer" End If If Si TypeOf pLayer Is IAnnotationSublayer Then LayerType = LayerType & " " & " IAnnotationSublayer" End If If Type de pLayer Is ICadastralFabricLayer Then LayerType = LayerType & " " & " ICadastralFabricLayer " End If If Si TypeOf pLayer Is ICadLayer Then LayerType = LayerType & " " & " ICadLayer " End If If TypeOf pLayer Is ICompositeGraphicsLayer Then LayerType = LayerType & " " & " ICadLayer " End If If TypeOf pLayer Is ICompositeGraphicsLayer " Fin si si TypeOf pLayer est ICompositeLayer Then LayerType = LayerType & " " & " ICompositeLayer " Fin si si TypeOf pLayer est ICoverageAnnotationLayer Then LayerType = LayerType & " " & " ICoverageAnnotationLayer " Fin si si TypeOf pLayer Is IDataLayer Then " LayerType = LayerType & " " & " ICoverageAnnotationLayer " Fin si si TypeOf pLayer Is IDataLayer & " & "IDataLayer" End If If If TypeOf pLayer Is IDimensionLayer Then LayerType = LayerType & " " & "IDimensionLayer" End If If If TypeOf pLayer Is IFDOGraphicsLayer Then LayerType = LayerType & " " & "IFDOGraphicsLayer" End If If Si TypeOf pLayer Is IFeatureLayer Then LayerType = LayerType & " " & "IFeatureLayer" End If If If TypeOf pLayer Is IGdbRasterCatalogLayer Then LayerType = LayerType & " " & "IGdbRasterCatalogLayer" End If If TypeOf pL ayer Is IGeoFeatureLayer Then LayerType = LayerType & " " & "IGeoFeatureLayer" End If If If TypeOf pLayer Is IGraphicsLayer Then LayerType = LayerType & " " & "IGraphicsLayer" End If If If TypeOf pLayer Is IGroupLayer Then LayerType = LayerType & " " & " IGroupLayer" End If If Si TypeOf pLayer Is IIMSMapLayer Then LayerType = LayerType & " " & " IIMSMapLayer " End If If Si TypeOf pLayer Is IIMSSubLayer Then LayerType = LayerType & " " & " IIMSSubLayer " End If If Si TypeOf pLayer Is IImageServerLayer Then LayerType = LayerType & " " & "IImageServerLayer" End If If If TypeOf pLayer Is IImageServerLayer2 Then LayerType = LayerType & " " & "IImageServerLayer2" End If If If TypeOf pLayer Is IImageServerLayer3 Then LayerType = LayerType & " " & " IImageServerLayer3 " End If If Si TypeOf pLayer Is Then IMap LayerType & " " & " IMapServerLayer " End If If Si TypeOf pLayer Is IMapServerSublayer Then LayerType = LayerType & " " & " IMapServerSublayer " End If If If TypeOf pLayer Is INetworkLayer Then LayerType = LayerType & " " & " INetworkLayer " End If If If TypeOf pLayer Is IRasterCatalogLayer Then LayerType = LayerType & " " & " IRasterCatalogLayer " End If If If TypeOf pLayer Is IRasterLayer Then LayerType = LayerType & " " & " IRasterLayer " End If If TypeOf pLayer Is ITemporaryLayer Then LayerType = LayerType & " " & " ITemporaryLayer" End If If Si TypeOf pLayer Is ITerrainLayer Then LayerType = LayerType & " " & "ITerrainLayer" End If If TypeOf pLayer Is ITinLayer Then LayerType = LayerType & " " & "ITinLayer" End If If TypeOf pLayer Is ITopologyLayer Then LayerType = LayerType & " " & "ITopologyLayer" End If If Si TypeOf pLayer IWMSGroupLayer Then LayerType = LayerType & " " & " IWMSGroupLayer " End If If TypeOf pLayer Is IWMSLayer Then LayerType = LayerType & " " & " IWMSLayer" End If If TypeOf pLayer Is IWMSMapLayer Then LayerType = LayerType & " " & "IWMSMapLayer" End If 'Else ' LayerType = "UnKnown" 'End If End Function

Je peux vérifier l'URL dans votre instantané et dire que la couche avec laquelle vous essayez de travailler est une couche ImageServer.

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

Vous ne pouvez pas accéder à une couche de serveur d'images en tant que couche d'entités.

Vous ne pouvez accéder qu'aux couches de serveur de carte pour lesquelles « Accès aux entités » est activé, en tant que couche d'entités. (par exemple, transmettez-les à IFeatureLayer)