miércoles, 18 de diciembre de 2013

MapBasic (Programacion en MapInfo): Leer las Entidades que conforman un “Collection Object”


En este mes se verá como leer cada entidad que conforma un “Collection Object” (como indica el título de este post).
 
Un “Collection Object”, como su nombre lo indica, es una combinación de objetos tales como Puntos, Polilineas y Regiones. Para que exista un “Collection Object” debe estar dos de los tres tipos de objetos anteriormente dichos.

Para obtener cada objeto o entidad que compone un “Collection Object” y para extraer las coordenadas de sus vértices o nodos de dichas entidades, usaremos el siguiente código en MapBasic:


include "Mapbasic.def"

Declare Sub Main
Declare Sub Dialogo
Declare Sub NumeroNodos
Declare Sub VentanaMensaje

Dim NombreTable as string
Dim Objeto as Alias
Dim ColeccionPuntos as Object
Dim ColeccionPolilineas as Object
Dim ColeccionRegiones as Object
Dim NumPuntos as Integer
Dim NumPolilineas as Integer
Dim NumPoligonos as Integer

Dim NumeroDeEntidades as String
Dim NumeroDeEntidades as String
Dim idMap as integer

Sub Main

 idMap = FrontWindow()
 set CoordSys Window idMap
 NombreTable = SelectionInfo(SEL_INFO_TABLENAME)
 Fetch rec CommandInfo (CMD_INFO_ROWID) From NombreTable 

 Objeto = NombreTable + ".obj"

 ColeccionPuntos = ObjectInfo(Objeto, 10)
 ColeccionPolilineas = ObjectInfo(Objeto, 9)
 ColeccionRegiones = ObjectInfo(Objeto, 8)

 NumPuntos = ObjectInfo(ColeccionPuntos ,20)
 NumPolilineas = ObjectInfo(ColeccionPolilineas ,21)
 NumPoligonos = ObjectInfo(ColeccionRegiones ,21)
 NumeroDeEntidades = "Cantidad de Puntos: " & NumPuntos & ";" & "Cantidad de Polilíneas: " & NumPolilineas & ";" & "Cantidad de Regiones: " & ObjectInfo(ColeccionRegiones ,21)
 
 Call VentanaMensaje
 Call Dialogo
 
 Close Table Selection
End Sub

Sub NumeroNodos
 Dim i as integer
 Dim j as integer

 if ReadControlValue(1) = 1 then
  Print "Listado de Puntos: " & NumPuntos & " puntos"
  For i = 1 to NumPuntos 
   Print "Punto " & i & ": " & ObjectNodeX(ColeccionPuntos ,0,i) & "," & ObjectNodeY(ColeccionPuntos ,0,i)
  next
 elseif ReadControlValue(1) = 2 then
  Print "Listado de Polilíneas"
  For i = 1 to NumPolilineas 
   Print "Polilínea " & i & ": " & ObjectInfo(ColeccionPolilineas ,OBJ_INFO_NPOLYGONS + i) & " nodos"
   For j = 1 to ObjectInfo(ColeccionPolilineas ,OBJ_INFO_NPOLYGONS + i)
    Print "Vertice " & j & ": " & ObjectNodeX(ColeccionPolilineas ,i,j) & "," & ObjectNodeY(ColeccionPolilineas ,i,j)
   next
  next  
 elseif ReadControlValue(1) = 3 then
  Print "Listado de Regiones"
  For i = 1 to NumPoligonos
   Print "Región " & i & ": " & ObjectInfo(ColeccionRegiones ,OBJ_INFO_NPOLYGONS + i) & " nodos"
   For j = 1 to ObjectInfo(ColeccionRegiones ,OBJ_INFO_NPOLYGONS + i)
    Print "Vertice " & j & ": " & ObjectNodeX(ColeccionRegiones ,i,j) & "," & ObjectNodeY(ColeccionRegiones ,i,j)
   next
  next 
 end if

End Sub

Sub Dialogo

Dialog
 Title "Entidades Multiples: " & NombreTable 
 Width 160 Height 60

 Control RadioGroup
  Title NumeroDeEntidades 
  Position 5,5
  ID 1
  Value 1
  Calling NumeroNodos

End Sub

Sub VentanaMensaje
 Open Window Message
 Set Window Message
 Position (0.25,0.25)
 Width 3  Height 3
End Sub

 

Explicación del Código:

El código lo que realiza es leer las entidades que hay en un “Collection Object” según su tipo: Puntos, Polilineas y Regiones. Luego de leer estas entidades, procede a obtener sus nodos

El código está dividido en cuatro Procedimientos “Sub”, de los cuales el Procedimiento Sub Dialogo muestra el cuadro de dialogo para escoger que tipo de entidad que está contenida en el “Collection Object” escogeremos, y el Procedimiento Sub VentanaMensaje configura la ventana de salida de los datos.

Ahora nos concentraremos en los Procedimientos Sub Main y Sub NumeroNodos:

Procedimiento Sub Main:


Sub Main

 idMap = FrontWindow()
 ‘Obtengo el id de la ventana actual (debe ser una Vista)

 set CoordSys Window idMap
 ‘Configuro las unidades de salida de las coordenadas para que sean iguales a la de laVista

 NombreTable = SelectionInfo(SEL_INFO_TABLENAME)
 ‘Obtengo el nombre de la tabla (archivo de MapInfo) seleccionada

 Fetch rec CommandInfo (CMD_INFO_ROWID) From NombreTable 
 Objeto = NombreTable + ".obj"
 ‘Luego selecciono y obtengo el “Collection Object” a analizar
 
 ColeccionPuntos = ObjectInfo(Objeto, 10)
 ‘Obtengo todos los Puntos contenidos en el “Collection Object”

 ColeccionPolilineas = ObjectInfo(Objeto, 9)
 ‘Obtengo todas las Polilineas contenidas en el “Collection Object”

 ColeccionRegiones = ObjectInfo(Objeto, 8)
 ‘Obtengo todas las Regiones contenidas en el “Collection Object”

 NumPuntos = ObjectInfo(ColeccionPuntos ,20)
 ‘ Aca consigo el número de Puntos en el “Collection Object”

 NumPolilineas = ObjectInfo(ColeccionPolilineas ,21)
 ‘ Aca consigo el número de Polilineas en el “Collection Object”
 
 NumPoligonos = ObjectInfo(ColeccionRegiones ,21)
 ‘ Aca consigo el número de Regiones en el “Collection Object”


 NumeroDeEntidades = "Cantidad de Puntos: " & NumPuntos & ";" & "Cantidad de Polilíneas: " & NumPolilineas & ";" & "Cantidad de Regiones: " & ObjectInfo(ColeccionRegiones ,21)
 ‘En la variable NumeroDeEntidades estarán los títulos de las tres opciones vistas en la ventana con la cantidad de Puntos, Polilineas y Regiones

 Call VentanaMensaje
‘Llamada al Procedimiento Sub VentanaMensaje que formatea la ventana de salida de datos

Call Dialogo
‘Llamada al Procedimiento Sub Dialogo que muestra la ventana del programa con las opciones a escoger
 
Close Table Selection
‘Al finalizar el programa, se quitara la selección
End Sub



Procedimiento Sub NumeroNodos:

En el cuadro de Dialogo (que está en el Procedimiento Sub Dialogo), hay tres opciones para escoger (Puntos, Polilineas y Regiones), y dependiendo de qué opción escogemos, en la ventana del Print (que está configurada en el procedimiento Sub VentanaMensaje) aparecerán los Puntos, Polilineas y Regiones y sus nodos o vértices correspondientes. Para ello se utiliza un función IF en cada uno de las tres opciones existentes:



Sub NumeroNodos
 Dim i as integer
 Dim j as integer

 if ReadControlValue(1) = 1 then ‘Si se escoge la primera opción, entra acá
  Print "Listado de Puntos: " & NumPuntos & " puntos" ‘Imprime el número de puntos
  For i = 1 to NumPuntos ‘este FOR recorre desde 1 hasta la cantidad de Puntos
   Print "Punto " & i & ": " & ObjectNodeX(ColeccionPuntos ,0,i) & "," & ObjectNodeY(ColeccionPuntos ,0,i) ‘Se imprime la palabra “PUNTO” seguido del número del Punto y sus coordenadas
  next
 elseif ReadControlValue(1) = 2 then ‘Si se escoge la segunda opción, entra acá

  Print "Listado de Polilíneas" ‘Imprime solo el título de Inicio

  For i = 1 to NumPolilineas ‘este FOR recorre desde 1 hasta la cantidad de Polilineas

   Print "Polilínea " & i & ": " & ObjectInfo(ColeccionPolilineas ,OBJ_INFO_NPOLYGONS + i) & " nodos" ‘ Imprime el número de la Polilinea y la cantidad de nodos de dicha Polilinea
   For j = 1 to ObjectInfo(ColeccionPolilineas ,OBJ_INFO_NPOLYGONS + i)
    Print "Vertice " & j & ": " & ObjectNodeX(ColeccionPolilineas ,i,j) & "," & ObjectNodeY(ColeccionPolilineas ,i,j) ‘Se imprime la palabra “vertice” seguido del número del Vertice y sus coordenadas

   next
  next  
 elseif ReadControlValue(1) = 3 then ‘Si se escoge la tercera opción, entra acá
  Print "Listado de Regiones" ‘Imprime solo el título de Inicio
  For i = 1 to NumPoligonos ‘este FOR recorre desde 1 hasta la cantidad de Poligonos
   Print "Región " & i & ": " & ObjectInfo(ColeccionRegiones ,OBJ_INFO_NPOLYGONS + i) & " nodos" ‘ Imprime el número de la Region y la cantidad de nodos de dicha Region
   For j = 1 to ObjectInfo(ColeccionRegiones ,OBJ_INFO_NPOLYGONS + i)
    Print "Vertice " & j & ": " & ObjectNodeX(ColeccionRegiones ,i,j) & "," & ObjectNodeY(ColeccionRegiones ,i,j) ‘Se imprime la palabra “vertice” seguido del número del Vertice y sus coordenadas

   next
  next 
 end if

End Sub


Para hacer funcionar este script, primero se debe seleccionar el “Collection Object” (solo funciona con este tipo de entidades), luego compilar el script con “ctrl + k” y se ejecuta con “ctrl + u”.

 

El resultado se ve en la ventana del Print:


 



En este ENLACE hay un ejemplo de un archivo de MapInfo con un "Collection Object"

Esperando que este post sea de su agrado y ayuda, será hasta el otro año, no sin antes deseándoles una Feliz Navidad y un Próspero Año 2014, y muchas gracias por su atención en estos 12 meses… Muchas gracias

viernes, 1 de noviembre de 2013

El Programa de Transformación de Coordenadas del IGN - Perú

En este mes, se va a analizar los resultados del programa de conversión de coordenadas del Instituto Geográfico Nacional (del Perú) - IGN (que lo pueden descargar en este enlace http://sites.google.com/site/recursoswebgis/file-cabinet/PrograGeod.zip) Este programa está diseñado para hacer transformaciones de coordenadas de WGS84 a PSAD56 y viceversa y solo es válida para el Perú.



Quizá muchos han probado este programa y lo han comprobado con otros programas y utilitarios que hacen transformaciones entre datums y vieron una diferencia entre los resultados. Este post está dedicado en a que se debe esta diferencia en resultados.
Este post no analizara ni describirá el programa creado por el IGN, solo se limitara en ver cuál es la diferencia en sus transformaciones con respecto a otros programas. Si ustedes quisieran saber más del programa, como funciona, hacer un comentario directo del programa, pueden hacerlo directamente al IGN:  geodesia@ign.gob.pe (Dirección de Geodesia) o visitar su página web: http://www.ign.gob.pe/index.php

Para una mayor comprensión, usaremos este término:
Diferenciales de transformación del WGS84 – IGN PERU: que engloba los diferenciales que propone el IGN para pasar a PSAD56.

En realidad, los Diferenciales de transformación del WGS84 – IGN PERU tienen los siguientes valores:
Diferenciales de transformación del WGS84 – IGN PERU: (*)(**)

dX = 303.55
dY = -265.41
dZ = 358.42

(*)Para el caso de Diferenciales de transformación del WGS84 – IGN PERU, estos parámetros fueron tomados del siguiente documento:
http://www.ign.gob.pe/public/images/norma_tecd_4cfdb01ea1bff.pdf

Buscar en la página 6 del mismo documento para ver estos parámetros. Para la comparación de resultados se asumirán los valores de los Diferenciales proporcionados por el IGN en el documento indicado.
(**) Como se sabe, el datum WGS84 tiene sus diferenciales dX = 0, dY = 0, dZ = 0 por ser un datum Geocéntrico, luego si queremos usar estos parámetros en nuestras aplicaciones, haríamos algo así:

Diferenciales de transformación del PSAD56 – IGN PERU
dX =- 303.55
dY = 265.41
dZ = -358.42

Que son los mismos Diferenciales propuestos por el  documento mencionado del IGN pero con el signo inverso.
Cabe hacer recordar los Diferenciales de transformación del PSAD56 – Mean y PSAD56 – Perú a WGS84:

Diferenciales de transformación del PSAD56 – Mean a WGS84:
dX = -288
dY = 175
dZ = -376

Diferenciales de transformación del PSAD56 – Perú a WGS84:
dX =- 279
dY = 175
dZ = -379

El programa del IGN usa los mismos parámetros del Elipsoide WGS84.
Por lo dicho anteriormente, se deduce que existe esta diferencia en resultados por el uso de estos Diferenciales calculados por el IGN en los cálculos en el programa.

Para comprobar esto, usamos la hoja de cálculo de Ingeografos, e ingresamos los Diferenciales de transformación del PSAD56 – IGN PERU. El resultado de la transformación entre el Programa del IGN y la hoja de cálculo está en el orden de los centímetros (se asume que es por cuestiones de programación a veces hay diferencias en los decimales y usando los Diferenciales de transformación del PSAD56 – IGN PERU).



Esperando que sea útil y que se halla disipado algunas dudas sobre esta diferencia entre el programa de transformación de coordenadas del IGN y los programas y herramientas GIS que usamos, será hasta el otro mes. Hasta luego.

sábado, 12 de octubre de 2013

Exportar una tabla de Excel al Postgresql / Postgis

En este post, se va explicara una forma de exportar una tabla en Excel al Postgresql / Postgis usando una Macro (tendrá información geométrica que se visualizara en el Quantum GIS).

En este ejemplo, se intentara crear una tabla en el Postgresql / Postgis usando datos de una tabla en Excel. Esta tabla contiene información de los departamentos que está dividido el Perú y tendrá seis columnas, las cuales son:
Id: de tipo “numérico” y que es un autonumerico.

Nombre: de tipo “string” y contiene los nombres de cada departamento del Perú.

Poblacion: de tipo “numérico” y contiene la población de cada departamento del Perú.

Creacion: de tipo “date”y contiene la fecha de creación de cada departamento del Perú (*).

Long_84: de tipo “numérico” y contiene la longitud de la capital de cada departamento (**).

Lat_84: de tipo “numérico” y contiene la latitud de la capital de cada departamento (**).

(*) Es la fecha de creación del departamento y no de la capital del departamento
(**) Las coordenadas Long_84 y Lat_84 están en WGS84.

Para ello, tenemos que tener estas cinco consideraciones:
A.  Activar la referencia “Microsoft ActiveX Data Objects 2.1 Library”, para que nos reconozca el objeto ADODB.recordset en la Macro.

 















B. Verificar que “Connection String” nos será útil para conectar el Postgresql / Postgis al Excel. Para eso pueden ver el “ODBC Data Source Administrator” y ver que Drivers para Postgrsql  tienen instalados, o también pueden visitar estas páginas:
http://www.connectionstrings.com/postgresql/


 La estructura que usualmente uso es la siguiente:

 Dim TXT as string

TXT = "Driver={PostgreSQL ODBC Driver(ANSI)};Server=" & servidor & ";Port=" & port & ";Database=" & BD & ";Uid=" & usuario & ";Pwd=" & clave & ";"

 
Dónde:

TXT, es una variable de tipo string (texto) que sirve para guardar todo el “Connection String”.

servidor, el servidor con que el Postgresql trabaja (por lo general tiene el valor de “LOCALHOST”).

port, el puerto con que el Postgresql trabaja (por lo general tiene el valor de “5432”).

BD, nombre de la base de datos a que se quiere ingresar.

usuario, nombre del usuario con acceso al Postgresql (por lo general es el usuario “postgres”)

clave, clave de ingreso a la base de datos.

 El driver PostgreSQL ODBC Driver(ANSI) es obtenido del “ODBC Data Source Administrator”


 















C. La tabla que se creara en el Postgresql / Postgis tendrá la siguiente estructura de columnas:

Id: de tipo “smallint” y que es un autonumerico.

Nombre: de tipo “character varying” y contiene los nombres de cada departamento del Perú.

Poblacion: de tipo “numeric” y contiene la población de cada departamento del Perú.

Creacion: de tipo “date” y contiene la fecha de creación de cada departamento del Perú.

Long_84: de tipo “numeric” y contiene la longitud de la capital de cada departamento.

Lat_84: de tipo “numeric” y contiene la latitud de la capital de cada departamento.

The_geom: de tipo “geometry” y contendrá cada punto de las capitales departamentales.

gid serial: de tipo “NOT NULL” y es un autonumerico propio de las tablas de Postgresql / Postgis (***).

 (***) Esta columna vendría ser la “Columna clave” de la tabla a crear.

D. Para crear la tabla, columnas y hacer la inserción de los datos, se usaran comandos y sentencias SQL, los mismos que usa el Postgresql.

E. No es tan necesario declarar una variable de tipo numérico o string en una Macro de Excel.

El código de la Macro para hacer este proceso es este:
 
Sub Excel_Postgres()

     Dim MiRecordset As ADODB.Recordset
     Dim TXT As String
     Dim CamposEXCEL As String
     
    'PARTE 01: Creacion de la tabla y las columnas
     CamposEXCEL = " id smallint, nombre character varying(20), poblacion numeric(20,0), creacion date, long_84 numeric(20,16) , lat_84 numeric(20,16)"
     TXT = "CREATE TABLE excel (" & CamposEXCEL & ", the_geom geometry, gid serial NOT NULL"
     TXT = TXT & " ,CONSTRAINT " & Chr(34) & "excel_pkey" & Chr(34) & " PRIMARY KEY (gid), CONSTRAINT enforce_dims_the_geom CHECK (st_ndims(the_geom) = 2),CONSTRAINT enforce_geotype_the_geom CHECK (geometrytype(the_geom) = 'POINT'::text OR the_geom IS NULL),CONSTRAINT enforce_srid_the_geom CHECK (srid(the_geom) = 4326))"
       
     Set MiRecordset = New ADODB.Recordset
     Set MiRecordset = ConexionBaseDatos("localhost", "5432", "MI_BASE_DE_DATOS", "postgres", "MI_CLAVE", TXT) '(****) ver descripción de esta Función"
     MiRecordset.Open
     
     'PARTE 02: Inserción de los puntos a la tabla
     For i = 1 To 25
        Punto = "SRID=4326;POINT(" & Range("E" & i + 1).Value & " " & Range("F" & i + 1).Value & ")"
        TXT = "INSERT INTO " & Chr(34) & "excel" & Chr(34) & " VALUES (" & Range("A" & i + 1).Value _
                & ",'" & Range("B" & i + 1).Value & "'," & Range("C" & i + 1).Value & "," & "'" & Range("D" & i + 1).Value & "'" _
                & "," & Range("E" & i + 1).Value & "," & Range("F" & i + 1).Value & ", '" & Punto & "', " & i & ")"
                
        Set MiRecordset = ConexionBaseDatos("localhost", "5432", "MI_BASE_DE_DATOS", "postgres", "MI_CLAVE", TXT) '(****) ver descripción de esta Función"
        MiRecordset.Open
     Next
End Sub

Function ConexionBaseDatos(servidor As String, port As String, BD As String, usuario As String, clave As String, ByVal txtSQL As String) As ADODB.Recordset

    Dim cn As ADODB.Connection
    Dim MiRecordset As New ADODB.Recordset
    Dim TXT As String
    
    Set cn = New ADODB.Connection
    
    TXT = "Driver={PostgreSQL ODBC Driver(ANSI)};Server=" & servidor & ";Port=" & port & ";Database=" & BD & ";Uid=" & usuario & ";Pwd=" & clave & ";"
   
    cn.ConnectionString = TXT '
    cn.Open (TXT)

    Set MiRecordset = New ADODB.Recordset
    MiRecordset.CursorType = adOpenStatic
    MiRecordset.CursorLocation = adUseClient
    MiRecordset.LockType = adLockOptimistic
    
    MiRecordset.Source = txtSQL
    MiRecordset.ActiveConnection = cn
      
    Set ConexionBaseDatos = MiRecordset

End Function


 Dónde:

Parte 01. En este punto, se crea la tabla y las columnas en el Postgresql / Postgis.

Primero en la variable “CamposEXCEL” (de tipo string) guardo la configuración de las columnas de la tabla a crear y que están en el Excel en este momento (no están consideradas por el momento ni la columna “the_geom” ni la columna “gid serial”).

En la variable “TXT” (de tipo string) guardo la sentencia SQL que me permite crear la tabla en el Postgresql, aquí estará los valores de la columna “CamposEXCEL” y las columnas “the_geom” y “gid serial” (con la configuración de ambas includas).

Luego se sobrescribe la variable “TXT” con la configuración de la tabla, se asigna la Columna Clave (“gid serial”), el tipo de Geometría (POINT) y la referencia espacial “SRID” (4326 que es WGS84 en Latitud / Longitud).

Después se inicializa el objeto recordset llamado “MiRecordset”

Luego se guarda en el objeto “MiRecordset” se guarda el resultado de la Función “ConexionBaseDatos” (****) ver descripción de esta Función.

Ejecutamos (o abrimos) el recordset “MiRecordset” para crear la tabla.

Parte 02. En esta parte se realiza la inserción de puntos a la tabla creada

Tenemos una sentencia “For” inicializada en i=1 hasta i=25 (ya que son 25 registros a ingresar).

 Luego con una sentencia en SQL del Postgis creamos un punto desde los datos de la columna “Long_84” y “Lat_84” con la referencia espacial “SRID” 4326 que es WGS84 en Latitud / Longitud y lo guardamos en la variable “Punto” (no está inicializada, pero automáticamente lo reconoce como un string)

Después en la variable TXT escribimos la sentencia SQL que nos permite insertar los datos a la tabla desde el Excel.

 A continuacion se guarda en el objeto “MiRecordset” se guarda el resultado de la Función “ConexionBaseDatos” (****) ver descripción de esta Función.

Ejecutamos (o abrimos) el recordset “MiRecordset” para crear insertar cada registro, de acuerdo como se va moviendo la sentencia “FOR”.

(****) Función “ConexionBaseDatos”, esta función permite conectar a la base de datos para que se ejecute una función SQL. Devuelve un objeto de tipo “ADODB.Recordset” y necesita:

servidor, el servidor con que el Postgresql trabaja (por lo general tiene el valor de “LOCALHOST”).

port, el puerto con que el Postgresql trabaja (por lo general tiene el valor de “5432”).

BD, nombre de la base de datos a que se quiere ingresar.

usuario, nombre del usuario con acceso al Postgresql (por lo general es el usuario “postgres”)

clave, clave de ingreso a la base de datos.

txtSQL, que es la sentencia a ejecutar sobre la base de datos o tabla.

Luego podemos ver la tabla creada en el Postgresql














 
Y también podemos usar el Quantum GIS para visualizarlo espacialmente












Esperando que sea de utilidad, será hasta el otro mes.

domingo, 22 de septiembre de 2013

Crear o Ingresar una Proyección / Datum nueva a la tabla del spatial_ref_sys del PostGis


Antes de iniciar este post, deseo saludar al amigo Eddison Araya  de Costa Rica por la sugerencia de este tema. A veces en la tabla spatial_ref_sys del PostGis no hay Proyecciones o Datums que necesitamos como es el caso del “CRTM 05” de Costa Rica, cuyos parámetros son:

Elipsoide: WGS84
Factor de Escala: 0.9999
Falso Norte: 0
Falso Este 500000
Longitud de Origen: -84°
Latitud de Origen: 0°
Shift X : 0
Shift Y: 0
Shift Z: 0

A)  Estructura de la tabla spatial_ref_sys

 Luego veamos la estructura de la tabla spatial_ref_sys y el contenido de la nueva Proyección / Datum



COLUMNAS

CONTENIDO

COMENTARIO

srid

123456

código de la proyección, tu puedes poner un código que quieras, pero debe ser único en la tabla spatial_ref_sys

auth_name

ingeografos

nombre del autor, puedes poner tu nombre

auth_srid

123456

código de la proyección dado por el autor. Debe ser el mismo que el de la Columna srid

srtext

PROJCS["COSTA RICA (CRTM 05)", GEOGCS["CR05 / CRTM05",DATUM["CR05",SPHEROID["WGS84",6378137,298.257223563,AUTHORITY["EPSG","7030“]],AUTHORITY["EPSG","1065“]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901“]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","5367“]],UNIT["metre",1,AUTHORITY"EPSG","9001"]],

PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-84],PARAMETER"scale_factor",0.9999],PARAMETER"false_easting",500000],PARAMETER["false_northing",0],AUTHORITY["EPSG","123456"],AXIS["Easting“,EAST],AXIS["Northing",NORTH]]

Sistema de Coordenadas representado en el formato WELL KNOW TEXT (WKT)

proj4text

+proj=tmerc +lat_0=0 +lon_0=-84 +k=0.9999 +x_0=500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs

Sistema de Coordenadas según el formato de PROJ4

 






































Nota sobre la columna srtext: el valor de la columna es esta


 













  Dónde los códigos son (en el orden presentado):

a. 7030: código del esferoide (WGS 84)
b. 1065: Datum (CR05)

c. 8901: Meridiano Central (Greenwich)
d. 9122: Unidad de medida usado por el Sistema de Referencia de Coordenadas (Grados sexagesimales)

e. 5367: código del Sistema de Referencia de Coordenadas (CR05 / CRTM05)
f. 9001: Unidad de la Proyección (metros)

g. 123456: código de la Proyección / Datum ingresado

Los códigos desde la a, hasta el f, están en la base de datos que está disponible en

http://www.epsg.org/


Sistema de Referencia obtenido de la pagina http://www.epsg.org/
 Los códigos hablados anteriormente enmarcados en rojo
 

 
Datum obtenido de la pagina http://www.epsg.org/
y los códigos hablados anteriormente enmarcados en rojo

 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 

B)  Modo de ingreso de la nueva Proyección / Datum a la tabla  spatial_ref_sys

Hay dos formar de ingresar una nueva Proyección / Datum a la tabla spatial_ref_sys:

- Directamente en la tabla spatial_ref_sys: haciendo doble click en la parte final de la tabla en mención y colocar los parámetros respectivos descritos en el apartado A de este Post.
 1)    Posesionarse en la última fila de la tabla en mención, donde está el asterisco.

 2)    Luego coloca los parámetros de acuerdo al apartado A de este Post.


- Mediante una sentencia SQL de Inserción a la tabla spatial_ref_sys: para eso abrimos una consulta SQL y ponemos esta sentencia:

 
INSERT INTO spatial_ref_sys(srid, auth_name, auth_srid, srtext, proj4text)
    VALUES (123456,'ingeografos',123456,
    'PROJCS["COSTA RICA (CRTM 05)", GEOGCS["CR05 / CRTM05",DATUM["CR05",SPHEROID   ["WGS84",6378137,298.257223563,AUTHORITY["EPSG","7030“]],AUTHORITY["EPSG","1065“]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901“]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","5367“]],UNIT["metre",1,AUTHORITY"EPSG","9001"]],
PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-84],PARAMETER"scale_factor",0.9999],PARAMETER"false_easting",500000],PARAMETER["false_northing",0],AUTHORITY["EPSG","123456"],AXIS["Easting“,EAST],AXIS["Northing",NORTH]]',
 '+proj=tmerc +lat_0=0 +lon_0=-84 +k=0.9999 +x_0=500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m ');



Y luego ejecutamos la consulta y actualizamos la tabla y veremos la nueva Proyección / Datum

 
C) Verificación de la nueva Proyección / Datum ingresada a la tabla  spatial_ref_sys

Para verificarlo, hacemos otra consulta SQL tal como esta:


SELECT ST_AsEWKT(st_Transform((ST_SetSRID(ST_MakePoint(-82.94439225, 8.64435069),4326)),123456))


Dónde:
ST_MakePoint(-82.94439225, 8.64435069), crea un punto con las coordenadas Longitud -82.94439225, Latitud 8.64435069.

ST_SetSRID(ST_MakePoint(-82.94439225, 8.64435069),4326)),  crea un punto con las coordenadas Longitud -82.94439225, Latitud 8.64435069 con el datum que tiene por código 4326 en la tabla spatial_ref_sys , que es el datum WGS84, Proyección Geográfica.

(ST_Transform((ST_SetSRID(ST_MakePoint(-82.94439225, 8.64435069),4326)),123456), crea un punto con las coordenadas Longitud -82.94439225, Latitud 8.64435069 con el datum que tiene por código 4326 en la tabla spatial_ref_sys , que es el datum WGS84, Proyección Geográfica y lo transforma al Datum CR05, Proyección CRTM05, cuyo código en la misma tabla es el 123456.

SELECT ST_AsEWKT(ST_Transform((ST_SetSRID(ST_MakePoint(-82.94439225, 8.64435069),4326)),123456)), que es toda la sentencia sql, y muestra las coordenadas -82.94439225, 8.64435069 cuyo datum de origen es el WGS84 proyectadas al CRTM05 con este resultado:
 "SRID=123456;POINT(61678.33129184 955980.598525378)"

 
se puede usar el documento de este enlace:
http://www.rnpdigital.com/catastro/Documentos/GUiA_TEC_GEORREF_PLAN_AGRIM_ACT_FEBR_2013.pdf

en la pagina 18 del mismo, hay 8 coordenadas Geográficas en WGS84 y se pueden transformar a CRTM 05 para comparar los resultados, viendo que hay una diferencia desde el tercer decimal (en los milímetros), concluyendo que la transformación es aceptable.

Esperando que este post sea de ayuda y otra vez saludando al amigo Eddison Araya de Costa Rica, será hasta el otro mes. Hasta luego
 

 
ª