jueves, 8 de diciembre de 2011

“De PDF a GIS”




Un amigo me pregunto si era posible pasar un archivo PDF (separado por capas) a un archivo GIS como shp de ArcGIS o tab de MapInfo y la respuesta no fue positiva, al menos si existe una manera directa de hacerlo. Lo que le propuse fue extraer la información de un PDF hacia un DXF y de ahí puede ser enviado a un formato GIS. Para ello usaremos el programa InkScape (programa libre que lee y edita archivos cdr de Corel Draw).

Enlace de descarga del InkScape: http://sourceforge.net/projects/inkscape/files/latest/download?source=files

1) Abrimos nuestro PDF en el InkScape.

2) Nos saldrá un mensaje de “Ajustes de Importación de PDF”.

3) Y quedara nuestro PDF visto en el InkScape.

4) Vemos que podemos trabajar por cada layer de información contenida en el PDF, como se ve en la imagen de abajo, las curvas de nivel están en un layer diferente con la de los ríos, lagunas, etc.

5) También podemos gestionar estos layer y colocarlas en capas con la función en el menú: Capas\Capas (ver imagen siguiente.

6) Aparecerá una barra mostrando el gestor de Capas y con el botón con el símbolo “+” añadimos una capa nueva, con el botón con el símbolo “-“eliminamos una capa seleccionada, etc. Para nuestro ejemplo crearemos la capa “POLIGONO”, donde estará el polígono rojo mostrado en la figura.

7) Para mover este polígono rojo a la capa “POLIGONO” y que se mantengan en su posición, seleccionamos el polígono rojo, y con el click derecho aparecerá el menú contextual y seleccionamos la opción “Cortar”.

8) Luego seleccionamos la capa “POLIGONO” (que es donde queremos que vaya el layer anteriormente cortado) y luego vamos al menú: Edición\Pegar en el sitio.

9) Y nuestro polígono rojo se pondrá en donde estaba antes pero en la capa que creamos (ósea en la capa “POLIGONO”).

10) Ya que está en una capa el polígono rojo, podemos moverlo, apagarlo y trabajar con él y que al exportarlo a DXF, mantendra las capas que creamos.

11) Para guardo en PDF, vamos a Archivo/Exportar y aparecerá una ventana donde guardamos nuestro archivo que será exportado a DXF y seleccionamos la opción “Plotér de corte de escritorio (R13)(*.DXF)”.

12) Nos apareceré una ventana para escoger el tipo de salida de las líneas (yo lo dejo como esta mostrado en la figura).

13) Y queda exportado nuestro PDF a DXF.

14) Si lo abrimos en el DraftSight o en el AutoCAD quedara separado por capas pero sin escala, queda luego georeferenciarlo con las coordenadas correctas para el toque final.

Esperando haber contestado esta pregunta, quizá sea la más realista, ya que antes vi otras opciones pero ninguna convincente, esta me pareció la menos descabellada para pasar un PDF a GIS, obviamente que habria que analizar algunas cuestiones si se deforma la forma del poligono y otras cuestiones mas acerca de la topologia . Me despido hasta el próximo mes no si antes deseando una FELIZ NAVIDAD y PROSPERO AÑO 2012. Un abrazo y gracias.

martes, 1 de noviembre de 2011

Calcular una Zona de Vida con el Sistema Holdridge


Grafico del Diagrama Bioclimatico para la clasificación de las Zonas de Vida del Mundo
(Tomado de la “Guía Explicativa del Mapa Ecológico del Perú”, Pag 3 - INRENA -
1994.)

En este mes vamos a calcular una Zona de Vida de acuerdo a las formulas del Sistema Holdridge, según unos apuntes que tenía desde la Universidad; de la “Guía Explicativa del Mapa Ecológico del Perú” (Reimpreso por el INRENA en 1994) y lo que encontré en el internet, tratando de interpretar los cálculos y resultados obtenidos, obtuve lo siguiente:
Para el cálculo necesitaremos hallar la Biotemperatura (1), la Evapotranspiración Potencial (2) y el Promedio de la Precipitación Anual Total de una zona escogida.
(1) Biotemperatura se entiende como la “Temperatura del aire, aproximadamente entre 0°C y 30°C, que determina el ritmo e intensidad de los procesos fisiológicos de las plantas (fotosíntesis de las plantas, respiración y transpiración) y la tasa de evaporación directa del agua contenida en el suelo y en la vegetación”. Tomado de la “Guía Explicativa del Mapa Ecológico del Perú”, Pag 4 - INRENA - 1994.
(2) Evapotranspiración Potencial viene a ser la cantidad de agua que sería evaporada directamente del suelo y otras superficies y la transpira por la vegetación natural en un estado estable o climax que se encuentra sobre un suelo Zonal de buenas características y con un contenido optimo de humedad. Tomado de la “Guía Explicativa del Mapa Ecológico del Perú”, Pag 7 - INRENA - 1994.
Para el cálculo de la Biotemperatura Media Mensual (BMM) se tiene 3 casos y usando la Temperatura Media Mensual (T°MM):
a) Si la T°MM está entre 6°C y 24°C, la Biotemperatura Media Mensual (BMM) es igual a la Temperatura Media Mensual (T°MM).
b) Si la T°MM es mayor a 24°C, la Biotemperatura Media Mensual es igual a la siguiente fórmula:
BMM = T°MM - |3 x Lat° x (T°MM - 24)²/100|
Donde:
Lat°: es la latitud de la zona de estudio en grados, no específica un datum en especial.
c) Si la T°MM es menor a 6°C, la Biotemperatura Media Mensual es igual a la siguiente fórmula:
BMM = T°MaxM ² /2( T°MaxM - T°MinM)
Donde:
T°MaxM: es la Temperatura Máxima Mensual
T°MinM: es la Temperatura Mínima Mensual
Tenemos por ejemplo el caso de la ciudad de Iquitos (este fue un ejercicio que hice en la universidad), del cual tenemos los siguientes datos:
Latitud / Lat° = 3.75° sur (no se especifica el Datum, puede ser PSAD56 o WGS84)
Promedio de Precipitaciones Anuales (promedios de 10 años consecutivos): 2896.5 mm
Mes
T°MM
Enero
26.5
Febrero
26.5
Marzo
26.3
Abril
26
Mayo
26
Junio
25.7
Julio
25.4
Agosto
26.1
Septiembre
26.7
Octubre
26.9
Noviembre
26.9
Diciembre
26.9
Como los valores de la Temperatura Media Mensual (T°MM) son mayores a 24°C usaremos la fórmula del caso b:
BMM = T°MM - |3 x Lat° x (T°MM - 24)²/100|
Reemplazando para el mes de Junio:
BMM = 25.7 - |3 x3.75 x (25.7 - 24)²/100|
BMM = 25.375
Completando nuestra tabla con los datos para BMM tenemos:
Mes
T°MM
BMM
Enero
26.5
25.797
Febrero
26.5
25.797
Marzo
26.3
25.705
Abril
26
25.550
Mayo
26
25.550
Junio
25.7
25.375
Julio
25.4
25.180
Agosto
26.1
25.604
Septiembre
26.7
25.880
Octubre
26.9
25.954
Noviembre
26.9
25.954
Diciembre
26.9
25.954
Biotemperatura
Media Anual

25.692
Y ponemos el promedio de las BMM.
Para calcular la Evapotranspiración Potencial, se puede usar la Barra derecha en el grafico 1 donde dice “Bio-Temperatura Media Anual en Grados Centígrados”, y buscar en esta barra el valor donde puede estar el numero 25.692, y luego hacer una línea recta hasta llegar a la barra que esta al costado de este ultimo donde dice “Potencial de Evapotranspiración Total por Año en Milímetros” (abajo esta el grafico ampliado).
O multiplicar la Biotemperatura Media Anual por el factor 58.93 y se obtiene la Evapotranspiración Potencial:
Evapotranspiración Potencial = Biotemperatura Media Anual x 58.93
Evapotranspiración Potencial = 25.692 x 58.93
Evapotranspiración Potencial = 1514.029 mm
Para finalizar, calculamos la Relación de Evapotranspiración Potencial y eso se calcula:
Relación de Evapotranspiración Potencial = Evapotranspiración Potencial / Promedio de Precipitaciones Anuales
Relación de Evapotranspiración Potencial = 1514.029 mm/ 2896.5 mm
Relación de Evapotranspiración Potencial = 1514.029 mm/ 2896.5 mm
Relación de Evapotranspiración Potencial = 0.523
Luego el valor de Relación de Evapotranspiración Potencial, ósea 0.523, lo interceptamos en el lado izquierdo del triangulo (en el lado donde dice “Relación de Evapotranspiración Potencial”). Después el valor de Promedio de Precipitaciones Anuales, ósea 2896.5 mm lo ponemos en el lado derecho del triangulo (en el lado donde dice “Promedio de Precipitación Total por año en Milimetros”) y la Intercepción nos da el Hexágono Correspondiente. Si trazamos una línea desde el punto de Intercepción hacia la Izquierda donde esta las Regiones Latitudinales, hallamos en cuál de estas está ubicado, y si trazamos una línea desde el punto de Intercepción hacia la Derecha donde esta los Pisos Altitudinales, hallamos en cuál de estas está ubicado, y si prolongamos la línea que nace en el lado de “Relación de Evapotranspiración Potencial” hacia la base del triangulo, podemos hallar en que “Provincia de Humedad” se encuentra la zona de interés. En nuestro caso, tenemos lo siguiente:
Hexágono: Bosque Húmedo
Región Latitudinal: Tropical
Piso Altitudinal: Piso Basal
Provincia de Humedad: Húmedo
La Zona de Vida entonces es: Bosque Humedo – Tropical (bh - t)
Esperando que sea muy explicativo este tema y de su agrado, me despido hasta el próximo mes.

domingo, 2 de octubre de 2011

SQL y POSTGRES

En esta oportunidad se explicara el uso de algunas sentencias en SQL en el manejo de datos dentro del POSTGRES, para lo cual, usaremos como ejemplo leer los registros de una tabla.

Nota: para este ejemplo, se uso el POSTGRES 9.0 y la referencia esta en el manual de ayuda de POSTGRES que se encuentra en:

C:\Archivos de programa\PostgreSQL\9.0\doc\postgresql\html\sql-commands.html

El “programa” o la consulta en SQL a analizar es (se dividió en secciones para un mejor entendimiento y todo texto que viene seguido de “--” es un comentario y no afecta al programa / consulta):

--Nuestra tabla "PERU_CAPITALES_DEPARTAMENTOS" tiene 4 columnas:

--name (VARCHAR), que es el nombre de las capitales de los departamentos del Perú

--type (VARCHAR), que es el tipo de capital (departamento o CAP PERU)

--longitude (NUMERIC), que es la longitud donde está ubicado cada capital de departamento

--latitude (NUMERIC), que es la latitud donde está ubicado cada capital de departamento

--usaremos un arreglo (que la declararemos FILADep) para guardar los 4 valores de cada columna

-- y usaremos un arreglo (que la declararemos TABLADep) para guardar los arreglos FILADep

--Inicio declaración de las variables--

DO $$DECLARE r record; -- declaración de una variable de tipo registro(s)

NombreCapDep VARCHAR;-- declaración de una variable de tipo texto

Tipo VARCHAR; -- declaración de una variable de tipo texto

NumRec INTEGER:=1; -- declaración de una variable de tipo entero e inicializado en 1

i INTEGER:=1; -- declaración de una variable de tipo entero e inicializado en 1

Longitud numeric; -- declaración de una variable de tipo numérico (acepta decimales)

Latitud numeric; -- declaración de una variable de tipo numérico (acepta decimales)

TMP VARCHAR; -- declaración de una variable de tipo texto

FILADep VARCHAR[]; -- declaración de una arreglo (array) de tipo texto

TABLADep VARCHAR[]; -- declaración de una arreglo (array) de tipo texto

--Fin declaración de las variables--

--Inicio del programa--

BEGIN -- palabra reservada que indica el inicio de la ejecución

FOR r IN SELECT "name", "type", "longitude" , "latitude" FROM "PERU_CAPITALES_DEPARTAMENTOS" --con esta sentencia se obtiene los registros de la consulta indicada

LOOP --inicio de la lectura de un registro, leera los registros de la variable r hasta el ultimo

FILADep[1]:= r.name;

FILADep[2]:= r.type;

FILADep[3]:= r.longitude;

FILADep[4]:= r.latitude;

TABLADep[NumRec]:=FILADep;

NumRec:= NumRec + 1;

END LOOP; --fin de la lectura de un registro

while NumRec > i loop --comienzo de la lectura del arreglo TABLADep

FILADep:=TABLADep[i];

NombreCapDep := FILADep[1];

Tipo := FILADep[2];

Longitud :=FILADep[3];

Latitud := FILADep[4];

TMP := NombreCapDep || Tipo || Longitud || Latitud;

RAISE NOTICE 'RESULTADO: %',TMP;

i := i + 1;

end loop; --fin de la lectura del arreglo TABLADep

END$$; --Fin del programa--

Ahora se explicara lo que se hizo (el codigo integro se encuentra al final de este post)

Para declarar variables se usa DO $$DECLARE, y todo lo que viene antes del BEGIN son las variables para el programa / consulta:

DO $$DECLARE r record; -- declaración de una variable de tipo registro(s)

NombreCapDep VARCHAR;-- declaración de una variable de tipo texto

Tipo VARCHAR; -- declaración de una variable de tipo texto

NumRec INTEGER:=1; -- declaración de una variable de tipo entero e inicializado en 1

i INTEGER:=1; -- declaración de una variable de tipo entero e inicializado en 1

Longitud numeric; -- declaración de una variable de tipo numérico (acepta decimales)

Latitud numeric; -- declaración de una variable de tipo numérico (acepta decimales)

TMP VARCHAR; -- declaración de una variable de tipo texto

FILADep VARCHAR[]; -- declaración de una arreglo (array) de tipo texto

TABLADep VARCHAR[]; -- declaración de una arreglo (array) de tipo texto

Después de declarar las variables, se procede a escribir el programa / consulta SQL:

BEGIN -- palabra reservada que indica el inicio de la ejecución

FOR r IN SELECT "name", "type", "longitude" , "latitude" FROM "PERU_CAPITALES_DEPARTAMENTOS" --con esta sentencia se obtiene los registros de la consulta indicada, e inmediatamente después se hace la lectura --de cada registro de esta sentencia con un LOOP

LOOP --inicio de la lectura de un registro, leera los registros de la variable r hasta el ultimo

FILADep[1]:= r.name;-- lectura de la columna “name” y se guarda en la 1ra posición del arreglo FILADep

FILADep[2]:= r.type;-- lectura de la columna “type” y se guarda en la 2da posición del arreglo FILADep

FILADep[3]:= r.longitude; -- lectura de la columna “longitude” y se guarda en la 3ra posición del arreglo FILADep

FILADep[4]:= r.latitude; -- lectura de la columna “latitude” y se guarda en la 4ta posición del arreglo FILADep

TABLADep[NumRec]:=FILADep; -- se guarda el arreglo FILADep en el arreglo TABLADep

NumRec:= NumRec + 1; -- contador de los arreglos FILADep guardados en TABLADep

END LOOP; --fin de la lectura de un registro

Ahora se lee los arreglos FILADep que están guardados en TABLADep

while NumRec > i loop --se leera las posiciones desde “i” hasta “NumRec” del arreglo TABLADep

FILADep:=TABLADep[i]; -- leo el arreglo FILADep que está en la posición “i” del arreglo TABLADep

NombreCapDep := FILADep[1]; --leo los nombres de las capitales y los guardo en NombreCapDep

Tipo := FILADep[2]; --leo los Tipos de las capitales y los guardo en Tipo

Longitud :=FILADep[3]; --leo los Longitudes de las capitales y los guardo en Longitud

Latitud :=FILADep[4]; --leo las Latitudes de las capitales y los guardo en Latitud

TMP := NombreCapDep || Tipo || Longitud || Latitud; --Acá junto los 4 datos anteriores en una sola cadena de texto

RAISE NOTICE 'RESULTADO: %',TMP; -- imprimo el valor de TMP

i := i + 1; -- aumento a una unidad el valor de “i”

end loop; --fin de la lectura del arreglo TABLADep

END$$; --Fin del programa--

El resultado es como se muestra en el siguiente dibujo (en la parte baja del mismo):

Con más detalle, se encuentra acá:

NOTICE: RESULTADO: CERRO DE PASCODepartamento-76.254902000000000-10.681626000000000
NOTICE: RESULTADO: TUMBESDepartamento-80.446455000000000-3.556674000000000
NOTICE: RESULTADO: TACNADepartamento-70.247912000000000-18.009956000000000
NOTICE: RESULTADO: MOQUEGUADepartamento-70.941361000000000-17.194016000000000
NOTICE: RESULTADO: PIURADepartamento-80.611527000000000-5.192492000000000
NOTICE: RESULTADO: CHICLAYODepartamento-79.826663000000000-6.768909000000000
NOTICE: RESULTADO: TRUJILLODepartamento-79.023801000000000-8.100448000000000
NOTICE: RESULTADO: HUARÁZDepartamento-77.534741000000000-9.528399000000000
NOTICE: RESULTADO: LIMACAP PERU-77.040211000000000-12.088541000000000
NOTICE: RESULTADO: ICADepartamento-75.724155000000000-14.070739000000000
NOTICE: RESULTADO: AREQUIPADepartamento-71.585255000000000-16.418539000000000
NOTICE: RESULTADO: IQUITOSDepartamento-73.254509000000000-3.746301000000000
NOTICE: RESULTADO: CAJAMARCADepartamento-78.496204000000000-7.158952000000000
NOTICE: RESULTADO: CHACHAPOYASDepartamento-77.842963000000000-6.216036000000000
NOTICE: RESULTADO: MOYOBAMBADepartamento-76.973934000000000-6.026461000000000
NOTICE: RESULTADO: HUÁNUCODepartamento-76.236927000000000-9.926996000000000
NOTICE: RESULTADO: HUANCAYODepartamento-75.204273000000000-12.073146000000000
NOTICE: RESULTADO: HUANCAVELICADepartamento-74.976647000000000-12.787557000000000
NOTICE: RESULTADO: PUERTO MALDONADODepartamento-69.191816000000000-12.598876000000000
NOTICE: RESULTADO: PUNODepartamento-70.033639000000000-15.836606000000000
NOTICE: RESULTADO: ABANCAYDepartamento-72.874359000000000-13.634084000000000
NOTICE: RESULTADO: AYACUCHODepartamento-74.225872000000000-13.162889000000000
NOTICE: RESULTADO: PUCALLPADepartamento-74.552291000000000-8.381353000000000
NOTICE: RESULTADO: CUSCODepartamento-71.971511000000000-13.519884000000000
NOTICE: RESULTADO: CALLAODepartamento-77.138198000000000-12.053769000000000

Esta en forma desordenada, pero se nota los resultados de las 4 columnas mencionadas

El codigo sin comentarios es:

DO $$DECLARE r record;
NombreCapDep VARCHAR;
Tipo VARCHAR;
NumRec INTEGER:=1;
i INTEGER:=1;
Longitud numeric;
Latitud numeric;
TMP VARCHAR;
FILADep VARCHAR[];
TABLADep VARCHAR[];
BEGIN
FOR r IN SELECT "name", "type", "longitude" , "latitude" FROM "PERU_CAPITALES_DEPARTAMENTOS"
LOOP
FILADep[1]:= r.name;
FILADep[2]:= r.type;
FILADep[3]:= r.longitude;
FILADep[4]:= r.latitude;
TABLADep[NumRec]:=FILADep;
NumRec:= NumRec + 1;
END LOOP;
while NumRec > i loop
FILADep:=TABLADep[i];
NombreCapDep:= FILADep[1];
Tipo:= FILADep[2];
Longitud:=FILADep[3];
Latitud:=FILADep[4];
TMP := NombreCapDep || Tipo || Longitud || Latitud;
RAISE NOTICE 'RESULTADO: %',TMP;
i := i + 1;
end loop;

END$$;

Esperando que sea útil el tema de este mes, nos vemos hasta noviembre, hasta la vista.

ª