lunes, 24 de diciembre de 2012

Creando funciones en Postgres


En este mes, vamos hacer funciones para usarlos en el Postgres y eventualmente en el Postgis, haremos un par de ejemplos para ver como es su funcionamiento.

 

1)      Crear una función que concatena dos celdas horizontales de tipo “text” o “string” de una tabla.

2)      Crear una función que sume horizontalmente dos celdas de tipo “numérico” de una tabla

 
a)      Primero creamos una función que se llame “__concatenacolumnas” que concatenara dos columnas de texto, hacemos un click derecho en la parte de funciones y seleccionamos “new function…”.



b)      Aparecerá una ventana con varias pestañas para crear la función. La primera que se muestra es la de “Properties” En el aparto de Name ponemos el nombre de la función, en este ejemplo es “__concatenacolumnas”, en el apartado de Owner seleccionamos en la pestaña desgozable “postgres”, en el apartado de Return Type seleccionamos “text” (ya que la concatenación de dos textos es otro texto) y en el apartado de Language seleccionamos “plpsql” (que será el lenguaje que estará escrito nuestra funcion).



c)       En la pestaña Options, y en el apartado Volatily seleccionamos “VOLATILE”.



d)      En la pestaña Parameters definiremos las variables para la función. Se definirá dos variables de tipo texto llamados columna1 y columna2.

 

Para lo cual, en el apartado Datatype seleccionamos “text” (que es el tipo de variable texto), en el apartado Argument name ponemos el nombre de la variable, que será columna1 y presionamos el botón “add”. Hacemos lo mismo para la variable columna2

 

e)      Finalmente en la pestaña Definition escribimos la función en si, hay que respetar los nombres de las variables y el tipo de resultado que devolverá la función (si en el principio se definió que el resultado de la función en la pestaña Properties en el apartado Return Type como “text”, la función debe devolver un text)



Repetimos lo mismo para la función que sumara dos columnas numéricas


 



Luego vemos nuestras funciones creadas en la seccion Functions
 
Luego probamos estas funciones, para eso creamos una tabla llamada “TABLA_INGEOGRAFOS”.


Probamos la función “__concatenacolumnas”
 
 

Probamos la función “__sumacolumnas”

 
Esperando que sea de utilidad este post y también deseándoles a todos ustedes una Feliz Navidad 2012 y un próspero año 2013, hasta el próximo mes.

 

sábado, 24 de noviembre de 2012

Desde Excel a Google Earth


En este post compartiré una Hoja de Calculo que permite exportar coordenadas de puntos, polilíneas y polígonos de Excel a Google Earth. Solo tenemos que poner las coordenadas UTM en WGS84 de lo que queremos graficar.

Esta Hoja deCalculo puede exportar las coordenadas de un polígono cerrado, como se muestra en la imagen debajo de la siguiente forma:

Ponga las coordenadas X UTM en WGS84 del polígono desde la celda “G14”, las coordenadas Y UTM desde la celda “H14”, y la altura en la celda “I14”, luego  presionamos el botón “Ruta” y seleccionamos el directorio y nombre del archivo kml a crear, esta ruta estará en la celda “D10”, después ponemos un nombre  al polígono en la celda “L10” y en la pestaña que esta junto a “Geometría” seleccionamos la opción “Poligono”. Podemos darle un Ancho de borde en la celda “L8” Luego presionamos el botón guardar y guardara el archivo el archivo en la ruta descrita en la celda “D10”.  (ver figura siguiente)

 
Para exportar las coordenadas de una polilínea, siga el mismo  procedimiento anterior (Ancho de Polilínea y colocación de coordenadas), solo que en la pestaña “Geometría” seleccione la opción “Polilinea”

Para exportar una serie de puntos siga el mismo procedimiento (en vez de Ancho de borde  o Ancho de Polilínea, será Tamaño de Punto y colocación de coordenadas), aunque acá aparecerá una nueva cabecera en la celda “F13” para que ponga un identificador de cada punto y seleccione en la pestaña de “Geometría” la opción “Punto”

Para ver  los archivos exportados, solo los abrimos en el Google Earth para ver los resultados. Acá unas imagenes explicando lo anterior.

 

 

 
 
 
 
 

Esperando que este post sea de mucha ayuda, si tienen un comentario, por favor escriban a info@ingeografos.com.pe para alguna consulta al respecto. Saludos y hasta el próximo mes.

NOTA: (26-06-2013): El formato de las coordenadas que trabaja el Google Earth es:
Coordenada X.000,Coordenada Y.000, Altura.000
donde:
Coordenada X: parte entera de un numero que corresponde a la coordenada X
Coordenada Y: parte entera de un numero que corresponde a la coordenada Y
Altura: parte entera de un numero que corresponde a la altura
000: que representa la parte decimal de las coordenadas y la altura, separadas por el "punto" (.)decimal.
La coma separa las coordenadas y la altura entre si, se quiere decir que existe tres terminos para ubicar un punto.
Para mayor informacion, vease: http://www.ingeografos.com.pe/2011/04/descripcion-tecnica-de-un-archivo-kml-y.html

Para el correcto uso de esta Hoja de Calculo, la computadora donde se ejecuta debe tener como separador decimal al "punto" (.) ya que si se usa a la "coma" (,) como separador decimal ocurrira esto:
Coordenada X,000,Coordenada Y,000, Altura,000
y habria 6 terminos para ubicar un punto, cosa que es erronea. Esperando que sea de utilidad, sera hasta la proxima.
 

martes, 2 de octubre de 2012

Transformación de Coordenadas UTM - TM


En este mes, comparto una nueva hoja de cálculo (es una nueva versión de la que aparece en http://www.ingeografos.com.pe/2010/03/transformacion-de-coordenadas-utm.html) para transformar coordenadas de diferentes datums. Con respecto a la hoja de calculo anterior, ahora tiene mas zonas de proyección UTM (las 60 zonas UTM para el hemisferio Norte y Sur) y también tiene zonas TM para Argentina (las 7 fajas que cubren Argentina) y Colombia (los 5 Orígenes de Colombia), y adicionalmente se puede adicional hasta 3 nuevas zonas de proyección según nuestros requerimientos.

También se agregó mas datums, entre los cuales están: Bogotá, Campo Inchauspe, Corrego Alegre, NAD 27, NAD 83, PSAD 56, SAD 69, European 1950, European 1979, GRS 67, GRS 80, Pico de las Nieves, Beijing 1954, ARC 1950, Indian, Tokyo, Australian Geodetic 1966, Australian Geodetic 1984, Chua Astro, Cape, SIRGAS, WGS 60, WGS 66, WGS 72, WGS 84 y Yacare

Y el interface cambio mostrando los parámetros de transformación de datum y las del eliposide asociado a cada datum (27 Elipsoides + 3 que el usuario puede definir)

Tiene como base las formulas que aparecen en el documento del EPSG http://www.ihsenergy.com/epsg/guid7.pdf ,en la paginas 29 y 30 y explicadas en el post
http://www.ingeografos.com.pe/2012/05/proyeccion-universal-transversal.html  , para mas detalles ver la pestaña “ACERCA DE” de la misma hoja de calculo. Usa la formulas de Gauss Kruger para dichas transformaciones que se muestran en las referencias arribas descritas.

Acá unos imágenes de esta nueva hoja de cálculo
 
 






Esperando que sea de utilidad que la hoja de calculo anterior, sera hasta el proximo mes. Saludos

domingo, 2 de septiembre de 2012

DraftSight y los archivos *.SCR


DraftSight es una gran herramienta libre de diseño asistido por computadora, pero lamentablemente esta herramienta no tiene la posibilidad de crear rutinas lisp y automatizar algunos procesos, dibujos y comandos. La parte buena es que se puede ejecutar archivos con extensión *.SCR y ejecutar comandos y también crear dibujos fácilmente.

Los archivos con extensión *.SCR son archivos que contienen comandos de línea que tanto el AutoCad como el DraftSight los ejecutan como si un usuario humano los realiza. Pueden ser creados por un editor de texto como el Block de notas de Windows (Notepad.exe) o el RJ Texted y guardarlos con la extensión *.SCR. Cabe señalar que esta extensión *.SCR en algunas PC’s pueda ser reconocido como Screen Saver.


Sintaxis de un archivo *.SCR:

Para el caso del DraftSight, algunos de los comandos se ejecutan de esta manera:
Ejemplo de crear una capa


Donde:                                                                                                                          

Explicación:

En la línea 01, se invoca la función Capa con “-Capa”, y luego en la línea 02 seleccionamos la opción “N” de nuevo para crear una nueva capa, en la línea 03 colocamos el nombre de la capa nueva que se llama “PRUEBA”, en línea 04 si queremos que esta nueva capa sea la activa, seleccionamos la opción “E”, y en la línea 05 ponemos el nombre de la capa “PRUEBA”, en la línea 06 para escoger un color para la capa seleccionamos la opción “ORL” y en la línea 07 ponemos el color “rojo” y en la línea 08 ponemos la capa a colorear “PRUEBA”, la línea 09 simula un “enter” que es para salir del comando y en la línea 10 del archivo *.SCR esta el cursor luego del “enter” ejecutado en la línea 09.

 

Ejemplo de crear un círculo

Donde:

Explicación:

En la línea 01, se invoca la función Círculo con “C” e inmediatamente se ponen las tres coordenadas X, Y, Z que en nuestro ejemplo serán 100, 100, 0. En la línea 02 se coloca el valor del radio que es 25. No tiene un “enter” para salir de la función.

 Ejemplo de crear un polígono cerrado
 
Donde:

Explicación:

En la línea 01, se invoca la función Polígono con “pl” y desde la línea 02 hasta la línea 05 se ponen los cuatro vértices del cuadrado en la forma X, Y, Z, y en la línea 06 cerramos el polígono con la letra “c”.

Ejemplo de crear un polígono abierto



Donde:

Explicación:

En la línea 01, se invoca la función Polígono con “pl” y desde la línea 02 hasta la línea 05 se ponen los cuatro vértices del cuadrado en la forma X, Y, Z, y la línea 06 simula un “enter” que es para salir del comando y en la línea 07 del archivo *.SCR esta el cursor luego del “enter” ejecutado en la línea 06.

 
Ejemplo de crear una línea



Donde:

 

Explicación:

En la línea 01, se invoca la función Línea con “LÍNEA” (fijarse bien en el acento sobre la I), y desde la línea 02 hasta la línea 03 se ponen los dos vértices de la línea en la forma X, Y, Z, y la línea 04 simula un “enter” que es para salir del comando y en la línea 05 del archivo *.SCR esta el cursor luego del “enter” ejecutado en la línea 06.

 
Ejemplo de crear puntos

Donde:
 

Explicación:

Desde la línea 01 hasta la línea 04, se invoca la función Punto con “PUNTO” y se ponen los respectivos cuatro puntos en la forma X, Y, Z.


 
Ejemplo de poner un texto



Donde:

 

Explicación:

En la línea 01 se llama la función Texto con “dt” y en la línea 02 se escoge la opción “j” para justifica el texto y en la línea 03 lo justificamos en el medio y a la derecha, que es la opción “MD”, en la línea 05 ponemos la ubicación en coordenadas de la forma X,Y. En la línea 06 ponemos la altura del texto que es “20” y en la línea 06 esta la rotación del texto que es 0 y en la línea 07 finalmente esta el texto a colocar que es “INGEOGRAFOS”.

 
Como ejecutar un archivo *.SCR en DraftSight :

Para ejecutar un archivo *.SCR, hacemos lo siguiente:

Vamos al menú Herramientas/Ejecutar script…

 

Y luego nos aparecerá la ventana mostrada abajo para seleccionar un archivo *.SCR  o script. Luego de seleccionarlo apretamos el botón “Abrir” y el archivo *.SCR será ejecutado

 

Quizá se pueda sacar más provecho de estos archivos si los creamos en una Macro de Excel o en  Calc de Open Office, y así automatizamos estos comandos mas rápidamente. En el siguiente ejemplo, crearemos una Macro enExcel donde se creara un grillado con líneas horizontales y verticales, con un acotado y todo en una capa.

La macro es la siguiente:


Sub GrilladoSCR()

    SeparacionX = Range("C5").Value
    SeparacionY = Range("C6").Value
    
    Inicio = Range("C8").Value
    Fin = Range("C9").Value
    Profundidad = Range("C10").Value
    
    AlturaTexto = Range("C12").Value
    
    Capa = Range("C14").Value
    
    NumLineasVert = Abs(1 + (Fin - Inicio) / SeparacionX)
    NumLineasHori = 1 + Abs(Profundidad / SeparacionY)
    
    Open "C:\PRUEBA_SCR\GRILLADO_PRUEBA.scr" For Output As #1
        Print #1, "-capa"
        Print #1, "N"
        Print #1, Capa
        Print #1, "E"
        Print #1, Capa
        Print #1, "ORL"
        Print #1, "rojo"
        Print #1, Capa
        Print #1, ""
        For i = 1 To NumLineasHori
            Print #1, "LÍNEA"
            Print #1, Inicio & "," & Profundidad
            Print #1, Fin & "," & Profundidad
            Print #1, ""
            Profundidad = Profundidad + SeparacionY
        Next i
        Profundidad = Range("C10").Value
        For i = 1 To NumLineasVert
            Print #1, "LÍNEA"
            Print #1, Inicio & "," & 0
            Print #1, Inicio & "," & Profundidad
            Print #1, ""
            Inicio = Inicio + SeparacionX
        Next i
        'Print #1, ""
        Inicio = Range("C8").Value
        For i = 1 To NumLineasHori 
            Print #1, "dt"
            Print #1, "j"
            Print #1, "MD"
            Print #1, Inicio & "," & Profundidad
            Print #1, Trim(AlturaTexto)
            Print #1, "0"
            Print #1, Trim(Profundidad)
            Profundidad = Profundidad + SeparacionY
        Next i
        Profundidad = Range("C10").Value
        For i = 1 To NumLineasVert
            Print #1, "DT"
            Print #1, "J"
            Print #1, "SC"
            Print #1, Inicio & "," & Profundidad
            Print #1, Trim(AlturaTexto)
            Print #1, "0"
            Print #1, Trim(Inicio)
            Inicio = Inicio + SeparacionX
        Next i
        'Print #1, ""
        'Print #1, ""
    Close #1
End Sub


Donde:


separacionX: separación de líneas del grillado en el eje X

separacionY: separación de líneas del grillado en el eje y

Inicio: inicio del grillado

fin: fin del grillado

profundidad: profundidad del grillado

Alturatexto: la altura del texto a dibujar

Capa: nombre de la capa a crear

Línea 17: ubicación del archivo en una carpeta llamada "PRUEBA_SCR"

Líneas 18 - 26  se crea la capa definida en la variable Capa

Líneas 27-33       se crean las líneas horizontales

Líneas 35-41       se crean las líneas verticales

Líneas 44 - 53     se crean los textos a la izquierda

Líneas 55 - 64     se crean los textos al abajo del grillado

Aunque no se pueda seleccionar una entidad, analizarla y extraer sus datos, por lo menos podemos crear entidades mas rápidamente con estos archivos *.SCR gracias a una macro. Sera hasta el próximo mes.
 

domingo, 5 de agosto de 2012

Zonas UTM Longitudinales y Zonas UTM Latitudinales


Si pensamos en Zonas UTM, nosotros automáticamente pensamos en las 60 Zonas UTM que la Tierra esta dividida, cada zona con un Meridiano Central y cada una con sus 6 grados de ancho de longitud de influencia, y hay que mencionar en que hemisferio se encuentra para ser más específicos, por ejemplo, si hablamos de un punto que se encuentra en la zona UTM 20S, sabemos que se encontraría por el centro de Sudamérica, y si hablamos de la zona UTM 20N, sabemos que se encontraría por el Caribe. La mayoría de los programas GIS dividen las zonas UTM como N (de Norte) y S (de Sur), en nuestro ejemplo UTM 20S significa que es la zona UTM 20 en el Hemisferio Sur y si es UTM 20N significa que es la zona UTM 20 en el Hemisferio Norte. Como estas zonas están referidas a la longitud, son conocidas también y no comúnmente como Zonas UTM Longitudinales.

Pero a veces encontramos zonas con la denominación UTM 20L o UTM 20M, en ese caso, estamos hablando de Zonas UTM Latitudinales. Estas Zonas UTM Latitudinales están referidas a la Latitud (en contraposición con las Zonas UTM Longitudinales) y tienen las siguientes características:

1)      Para el Hemisferio Sur, las Zonas UTM Latitudinales se extienden desde la Latitud 80° Sur hasta el Ecuador (0°). Para el Hemisferio Norte, las Zonas UTM Latitudinales se extienden desde el Ecuador (0°) hasta la Latitud 84° Norte.

2)     Cada Zona UTM Longitudinal posee 20 Zonas UTM Latitudinales (*).
3)      Para nombrar cada Zona UTM Latitudinal se usara las letras del alfabeto. En el Hemisferio Sur comprende las letras C hasta la M y para el Hemisferio Norte, desde la letra N hasta la X, no se consideran las letras I,O,Ñ quedando definidos de esta manera:


Entonces, si queremos nombrar todas las Zonas UTM Latitudinales de la Zona UTM Longitudinal 18, tendremos lo siguiente:




Como se ve en el cuadro anterior de nuestro ejemplo, existe una Zona UTM Latitudinal 18S que se encuentra en el Hemisferio Norte, la letra” S” no indica que se encuentra en el Hemisferio Sur, es solo una letra para diferenciar esa Zona UTM Latitudinal de las otras.

4)      Cada Zona UTM Latitudinal tiene un área definido por: 6 grados longitudinales y 8 grados latitudinales. (** ).




 (*) Existen Zonas UTM Latitudinales Irregulares, que no siguen estas características mencionadas. Estas zonas son:

a) Zona UTM Latitudinal 31V, que tiene un área definido por: 3 grados longitudinales y 8 grados latitudinales.

b) Zona UTM Latitudinal 32V, que tiene un área definido por: 9 grados longitudinales y 8 grados latitudinales.

c) Zona UTM Latitudinal 31X, que tiene un área definido por: 9 grados longitudinales y 12 grados latitudinales.

d) Zona UTM Latitudinal 33X, que tiene un área definido por: 12 grados longitudinales y 12 grados latitudinales.

e) Zona UTM Latitudinal 35X, que tiene un área definido por: 12 grados longitudinales y 12 grados latitudinales.

f) Zona UTM Latitudinal 37X, que tiene un área definido por: 9 grados longitudinales y 12 grados latitudinales.

No existen las siguientes Zonas UTM Latitudinales: 32X, 34X y 36X.

(**) Las Zonas UTM Latitudinales X tienen un área definido por: 6 grados longitudinales y 12 grados latitudinales.


Diferentes áreas UTM Latitudinales



Mapa Mundi con las Zonas UTM Latitudinales


Zonas UTM Latitudinales y Google Earth: Es posible visualizar en la “Barra de Estado” del Google Earth la  Zona UTM Latitudinal, para ello hacemos la siguiente secuencia:
Google Earth mostrando la Barra de Estado

a)      Si las coordenadas del Google Earth están en Longitud y Latitud, no aparecerán las Zonas UTM Latitudinales, para ello seleccionamos en el menú “Opciones\Herramientas”.

b)      Luego seleccione la pestaña “Vista3D”, y en la parte “Mostrar lat/long.” Seleccionamos “Universal Transversal de Mercator” y presionamos el botón “Aplicar” y/o “Aceptar”.

c)       Luego tendremos en la “Barra de Estado” aparecerá las coordenadas UTM y la Zona UTM Latitudinal correspondiente.
 Esperando que sea de mucha utilidad y esclarecer algunas dudas sobre estas Zonas UTM Latitudinales, será hasta el próximo mes. Saludos

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
ª