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