lunes, 23 de julio de 2012

Crear Carpetas y Capas / Layers / Shapes en Memoria con Arcobjects

En este mes, vamos a crear una carpeta y un shape, layer, capa (o como uno le guste llamar) en memoria o de manera virtual con Arcobject. La finalidad de crear una capa en memoria seria en no crear un shape “físico” que ocupe un espacio en el disco duro de nuestra computadora y solo existiría hasta que cerramos el ArcMap, en otras palabras es una capa temporal.

Para el ejemplo, crearemos una capa de puntos que representaran las capitales de Sudamerica en memoria desde cero. El código seria el siguiente:
Public Sub CrearShapeVirtual()


  Dim MiIFeatureWorkspace As IFeatureWorkspace
  Set MiIFeatureWorkspace = MiCarpetaVirtual("Mi Carpeta Virtual")

  Dim MiSR As ISpatialReference
  Set MiSR = MiRerefenciaEspacial(esriSRGeoCS_WGS1984)
  
  
  Dim MisCampos As IFields
  Dim MisCamposEditados As IFieldsEdit
  Set MisCampos = New Fields
  Set MisCamposEditados = MisCampos
  
  Dim MiCampo As IField
  Dim MiCampoEditado As IFieldEdit
  

  Set MiCampo = New Field
  Set MiCampoEditado = MiCampo
  MiCampoEditado.Name = "Shape"
  MiCampoEditado.Type = esriFieldTypeGeometry


  Set MiCampoEditado.GeometryDef = ConfigurarGeometria(esriGeometryPoint, MiSR)
  MisCamposEditados.AddField MiCampo


  Set MiCampo = New Field
  Set MiCampo = CreaField("PAIS", esriFieldTypeString, 50)
  MisCamposEditados.AddField MiCampo
  
  Set MiCampo = New Field
  Set MiCampo = CreaField("NOM_CAP", esriFieldTypeString, 50)
  MisCamposEditados.AddField MiCampo
  
  Dim MiIFeatureClass As IFeatureClass
  Set MiIFeatureClass = MiIFeatureWorkspace.CreateFeatureClass("Mi_Shape_Virtual", MisCampos, Nothing, _
                                           Nothing, esriFTSimple, "Shape", "")
                                           
                                           
   Call InsertaCapitales(MiIFeatureClass, "Argentina", "Buenos Aires", -58.3748, -34.607)
   Call InsertaCapitales(MiIFeatureClass, "Brasil", "Brasilia", -47.9295, -15.7787)
   Call InsertaCapitales(MiIFeatureClass, "Bolivia", "La Paz", -68.1451, -16.4973)
   Call InsertaCapitales(MiIFeatureClass, "Colombia", "Bogotá", -74.0752, 4.59826)
   Call InsertaCapitales(MiIFeatureClass, "Chile", "Santiago", -70.6435, -33.4667)
   Call InsertaCapitales(MiIFeatureClass, "Ecuador", "Quito", -78.5166, -0.217118)
   Call InsertaCapitales(MiIFeatureClass, "Guyana", "Georgetown", -58.1552, 6.79948)
   Call InsertaCapitales(MiIFeatureClass, "Guyana Francesa", "Cayena", -52.3259, 4.92577)
   Call InsertaCapitales(MiIFeatureClass, "Paraguay", "Asunción", -57.6364, -25.2836)
   Call InsertaCapitales(MiIFeatureClass, "Perú", "Lima", -77.0618, -12.0468)
   Call InsertaCapitales(MiIFeatureClass, "Surinam", "Paramaribo", -55.1729, 5.80919)
   Call InsertaCapitales(MiIFeatureClass, "Uruguay", "Montevideo", -56.186, -34.8908)
   Call InsertaCapitales(MiIFeatureClass, "Venezuela", "Caracas", -66.884, 10.3891)
   
 
   Call VisualizaShapeVirtual(MiIFeatureClass)
End Sub
Function MiCarpetaVirtual(NombreCarpetaVirtual As String) As IFeatureWorkspace
  
  Dim MiIWorkspaceFactory As IWorkspaceFactory
  Set MiIWorkspaceFactory = New InMemoryWorkspaceFactory
  Dim MiName As IName
  Set MiName = MiIWorkspaceFactory.Create("", NombreCarpetaVirtual, Nothing, 0)
  
  Dim MiIWorkspace As IWorkspace
  Set MiIWorkspace = MiName.Open
  
  Set MiCarpetaVirtual = MiIWorkspace
  
End Function
Function ConfigurarGeometria(TipoGeo As Long, MiSR As ISpatialReference) As IGeometryDef

  Dim MiIGeometryDef As IGeometryDef
  Dim MiIGeometryDefEdit As IGeometryDefEdit
  Set MiIGeometryDef = New GeometryDef
  Set MiIGeometryDefEdit = MiIGeometryDef
  With MiIGeometryDefEdit
    .GeometryType = TipoGeo
    Set .SpatialReference = MiSR
  End With
  
  Set ConfigurarGeometria = MiIGeometryDef
  
End Function

Function MiRerefenciaEspacial(TipoProy As Long) As ISpatialReference

    Dim MiISpatialReference As ISpatialReference
    Dim MiISpatialReferenceFactory2 As ISpatialReferenceFactory2
    Set MiISpatialReferenceFactory2 = New SpatialReferenceEnvironment
    Set MiISpatialReference = MiISpatialReferenceFactory2.CreateGeographicCoordinateSystem(esriSRGeoCS_WGS1984)
    MiISpatialReference.SetDomain -180, 180, -90, 90
    
    Set MiRerefenciaEspacial = MiISpatialReference
    
End Function
Function CreaField(Nombre As String, Tipo As Long, Optional Tamaño As Integer) As IField

  Dim MiIField As IField
  Dim MiIFieldEdit As IFieldEdit
  
  Set MiIField = New Field
  Set MiIFieldEdit = MiIField
  With MiIFieldEdit
    If Tamaño <> 0 Then
        .Length = Tamaño
    End If
      .Name = Nombre
      .Type = Tipo
  End With
  Set CreaField = MiIFieldEdit
  
End Function
Sub VisualizaShapeVirtual(MiFeatureClass As IFeatureClass)

    Dim MiIFeatureLayer As IFeatureLayer
    Set MiIFeatureLayer = New FeatureLayer
    Set MiIFeatureLayer.FeatureClass = MiFeatureClass
    MiIFeatureLayer.Name = MiFeatureClass.AliasName
    Dim MiIMxDocument As IMxDocument
    Set MiIMxDocument = ThisDocument
    MiIMxDocument.FocusMap.AddLayer MiIFeatureLayer

End Sub

Sub InsertaCapitales(MiFC As IFeatureClass, NombPais As String, NombCapital As String, Longitud As Double, Latitud As Double)
 
 Dim MiIFeatureBuffer As IFeatureBuffer
 Dim MiIFeatureCursor As IFeatureCursor


 Set MiIFeatureCursor = MiFC.Insert(True)
 Set MiIFeatureBuffer = MiFC.CreateFeatureBuffer

 Dim miPunto As IPoint
 Set miPunto = New Point
 
 miPunto.X = Longitud
 miPunto.Y = Latitud
 
 Set MiIFeatureBuffer.Shape = miPunto
 MiIFeatureBuffer.Value(1) = NombPais
 MiIFeatureBuffer.Value(2) = NombCapital

 MiIFeatureCursor.InsertFeature MiIFeatureBuffer

End Sub







Ahora se explicara el código. La función principal es CrearShapeVirtual y la que crea una carpeta virtual donde estara la capa / layer / shape en la memoria se llama MiCarpetaVirtual y esta comprendido entre las líneas 60 y 72:
Línea 60: Cabecera de la Funcion MiCarpetaVirtual de tipo IFeatureWorkspace y necesita de una variable de tipo string como nombre de esta carpeta virtual.
Línea 62: creo un objeto IWorkspaceFactory llamado MiIWorkspaceFactory.
Línea 63: configuro el objeto MiIWorkspaceFactory como un objeto InMemoryWorkspaceFactory
Línea 64: creo un objeto IName llamado MiName.
Línea 65: en el objeto MiName configuro  MiIWorkspaceFactory.Create("", NombreCarpetaVirtual, Nothing, 0), donde:
                "": En esta parte se pone la ruta de una carpeta, pero como es un layer virtual, se deja  vacio
                  NombreCarpetaVirtual: nombre de la carpeta virtual
Línea 67: creo un objeto IWorkspace llamado MiIWorkspace  
Línea 68: “Abro” el objeto MiIWorkspace  con MiName.Open
Línea 70: igualo el objeto MiIWorkspace con el objeto MiCarpetaVirtual para ser usado en el programa principal (CrearShapeVirtual )
Línea 72: fin de la función

Luego en la función CrearShapeVirtual  prosigue asignando una referencia espacial con la función MiRerefenciaEspacial, crea las entidades y en la linea 39 crea la capa / layer / shape virtual llamado "Mi_Shape_Virtual" en la carpeta "Mi Carpeta Virtual".
En seguida unas imagenes de la capa / layer /  shape virtual creado (que muestra los capitales de sudamerica):

Mostrando la tabla con sus registros y columnas

Mostrando las columnas creadas en el programa de ejemplo

Mostrando la referencia espacial. Abajo se muestra el detalle de la misma

Data Type:                                  InMemory Feature Class
Location:                                     Mi Carpeta Virtual
Feature Class:                            Mi_Shape_Virtual
Feature Type:                             Simple
Geometry Type:                          Point

Geographic Coordinate System: GCS_WGS_1984
Datum:                                        D_WGS_1984
Prime Meridian:                          Greenwich
Angular Unit:                               Degree


En donde:
InMemory Feature Class : es el tipo de dato, un layer / capa / shape virtual o en memoria
Mi Carpeta Virtual: es el nombre de la carpeta virtual que le dimos anteriormente
Mi_Shape_Virtual: es qel nombre del layer / capa / shape que creamos
GCS_WGS_1984: es el datum que le asignamos

Esperando que sea de su ayuda, sera hasta el proximo mes. Saludos
ª