<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GIS &#38; Chips &#187; benizar</title>
	<atom:link href="http://www.gisandchips.org/author/benizar/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gisandchips.org</link>
	<description>Geografía útil para llevar</description>
	<lastBuildDate>Tue, 29 Nov 2011 10:38:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>GeoFOV: Incorporando el campo de visión a una geodatabase multimedia</title>
		<link>http://www.gisandchips.org/2011/11/21/geofov-incorporando-el-campo-de-vision-a-una-geodatabase-multimedia/</link>
		<comments>http://www.gisandchips.org/2011/11/21/geofov-incorporando-el-campo-de-vision-a-una-geodatabase-multimedia/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 22:56:39 +0000</pubDate>
		<dc:creator>benizar</dc:creator>
				<category><![CDATA[Análisis]]></category>
		<category><![CDATA[Presentación]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[campo de visión]]></category>
		<category><![CDATA[EXIF]]></category>
		<category><![CDATA[field of view]]></category>
		<category><![CDATA[GIS & Chips]]></category>
		<category><![CDATA[NTS]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/?p=1937</guid>
		<description><![CDATA[Hola a todos, quiero compartir aquí el enlace de mi segunda presentación en slideshare. Es de un taller que no se llegó a realizar pero espero que os resulte interesante. En esta presentación comento un poco cómo se utilizan los metadatos de las imágenes para generar información espacial de interés o incluso cómo puede evolucionar [...]]]></description>
			<content:encoded><![CDATA[<p>Hola a todos, quiero compartir aquí el enlace de mi segunda presentación en slideshare. Es de un taller que no se llegó a realizar pero espero que os resulte interesante. En esta presentación comento un poco cómo se utilizan los metadatos de las imágenes para generar información espacial de interés o incluso cómo puede evolucionar el panorama de los geotags a corto plazo.</p>
<p>Más adelante, cuando tenga tiempo, colgaré una librería que he desarrollado en mi tesis y explicaré en detalle el código.</p>
<p>Hasta pronto.</p>
<div style="width:425px" id="__ss_10245372"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/BeniZaragoz/geofov-incorporando-el-campo-de-visin-en-una-multimedia-geodatabase" title="GeoFOV: Incorporando el campo de visión en una multimedia geodatabase" target="_blank">GeoFOV: Incorporando el campo de visión en una multimedia geodatabase</a></strong> <object id="__sse10245372" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=geofov-111120161539-phpapp01&#038;stripped_title=geofov-incorporando-el-campo-de-visin-en-una-multimedia-geodatabase&#038;userName=BeniZaragoz" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent"/><embed name="__sse10245372" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=geofov-111120161539-phpapp01&#038;stripped_title=geofov-incorporando-el-campo-de-visin-en-una-multimedia-geodatabase&#038;userName=BeniZaragoz" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/BeniZaragoz" target="_blank">Beni Zaragozí</a> </div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2011/11/21/geofov-incorporando-el-campo-de-vision-a-una-geodatabase-multimedia/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Presentación de RAPID para las Jornadas de Geografía 3.0</title>
		<link>http://www.gisandchips.org/2011/11/17/presentacion-de-rapid-para-las-jornadas-de-geografia-3-0/</link>
		<comments>http://www.gisandchips.org/2011/11/17/presentacion-de-rapid-para-las-jornadas-de-geografia-3-0/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 11:16:24 +0000</pubDate>
		<dc:creator>benizar</dc:creator>
				<category><![CDATA[Análisis]]></category>
		<category><![CDATA[Presentación]]></category>
		<category><![CDATA[AForge.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Teledetección orientada a objetos]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/?p=1867</guid>
		<description><![CDATA[En este post quiero compartir la primera presentación que subo a Slideshare En ella justifico y describo el programa RAPID que ya había introducido en un post, pero con un enfoque ligeramente distinto. Mi idea es subir otras presentaciones que tengo por ahí que puedan ser de interés para G&#38;C. RAPID: Rough Agricultural Plot IDentifier. [...]]]></description>
			<content:encoded><![CDATA[<p>En este post quiero compartir la primera presentación que subo a Slideshare <img src='http://www.gisandchips.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  En ella justifico y describo el programa RAPID que ya había introducido en un post, pero con un enfoque ligeramente distinto. Mi idea es subir otras presentaciones que tengo por ahí que puedan ser de interés para G&amp;C.</p>
<div style="width:510px" id="__ss_10197659"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/BeniZaragoz/rapid-10197659" title="RAPID: Rough Agricultural Plot IDentifier. Un contador de árboles con software libre. " target="_blank">RAPID: Rough Agricultural Plot IDentifier. Un contador de árboles con software libre. </a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/10197659" width="510" height="426" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/BeniZaragoz" target="_blank">Beni Zaragozí</a> </div>
</p></div>
<p>Espero que os guste. Cuando tenga un rato subo más!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2011/11/17/presentacion-de-rapid-para-las-jornadas-de-geografia-3-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Business card de GISchips (en LaTeX)</title>
		<link>http://www.gisandchips.org/2011/11/06/business-card-de-gischips-en-latex-3/</link>
		<comments>http://www.gisandchips.org/2011/11/06/business-card-de-gischips-en-latex-3/#comments</comments>
		<pubDate>Sun, 06 Nov 2011 18:41:06 +0000</pubDate>
		<dc:creator>benizar</dc:creator>
				<category><![CDATA[Consejo práctico]]></category>
		<category><![CDATA[Business card]]></category>
		<category><![CDATA[GIS & Chips]]></category>
		<category><![CDATA[LaTeX]]></category>
		<category><![CDATA[OpenStreetMap]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/?p=1847</guid>
		<description><![CDATA[La semana pasada estaba previsto que varios miembros de GIS&#38;Chips presentáramos un taller en una Jornada de Geografía 3.0. Además, algunos asistimos al posterior congreso nacional de geografía. Finalmente, no se pudo realizar el taller por falta de horarios, pero esperamos poder organizar algún evento propio solamente para la difusión de conocimientos de TIG libre. [...]]]></description>
			<content:encoded><![CDATA[<p>La semana pasada estaba previsto que varios miembros de GIS&amp;Chips presentáramos un taller en una Jornada de Geografía 3.0. Además, algunos asistimos al posterior congreso nacional de geografía. Finalmente, no se pudo realizar el taller por falta de horarios, pero esperamos poder organizar algún evento propio solamente para la difusión de conocimientos de TIG libre.</p>
<p>En estos eventos es habitual el intercambio de tarjetas de presentación y como no teníamos una para darnos a conocer decidimos hacer una prueba en LaTeX, que no salió del todo mal. En este post compartimos esta primera versión para que la podáis personalizar o simplemente ver como se ha hecho.</p>
<div id="attachment_1825" class="wp-caption aligncenter" style="width: 315px"><img class="size-full wp-image-1825" src="http://www.gisandchips.org/wp-content//GC_businessCard_front1.jpg" alt="" width="305" height="152" /><p class="wp-caption-text">Cara tarjeta G&amp;C, generado con el fichero &quot;G&amp;C_businessCard_front.tex&quot;.</p></div>
<p style="text-align: center">
<p><span id="more-1847"></span></p>
<h3>Características a considerar en el diseño</h3>
<p>Hace mucho tiempo di un par de cursos para el diseño de marca. Ilustrator, Freehand y Photoshop para el diseño de tarjetas, trípticos, carteles, carátulas de cds, etc. Hay que reconocer que todo esto es una profesión en sí y hay muchos detalles por conocer. En tal caso, lo que hacemos nosotros aquí es un “apaño”, por lo que nadie espere grandes cosas <img src='http://www.gisandchips.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Las características más a tener en cuenta en el diseño son el tamaño de la tarjeta, el logo, el fondo y la gama de colores. Otra cuestión a tener en cuenta es la problemática vector-raster.</p>
<p>El <strong>tamaño</strong> de la tarjeta se puede determinar por una serie de estándares, supongo que según el tamaño de los billetes de cada país <img src='http://www.gisandchips.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  (la cartera donde guardamos las tarjetas también depende de esto). Nuestra tarjeta (90x45mm) no se ajusta a ninguno de estos estándares aunque la podríamos adaptar muy fácilmente. En <a title="http://en.wikipedia.org/wiki/Business_card" href="http://en.wikipedia.org/wiki/Business_card" target="_blank">http://en.wikipedia.org/wiki/Business_card</a> encontramos los tamaños más utilizados.</p>
<p>El <strong>logo</strong> es el  que figura en el blog, diseñado por Miguel. No obstante, eliminamos el texto pues lo incluiremos entre los otros elementos de la tarjeta.</p>
<p>El <strong>fondo de la cara frontal</strong> es una nube de tags basada en la de esta página, después en Gimp le hemos añadido un degradado lineal de negro a blanco. El<strong> fondo del reverso</strong> es un mapa de <a href="http://www.openstreetmap.org/">http://www.openstreetmap.org/</a> que indica la ubicación de la sede. Para completar la ubicación se podría añadir la dirección en texto.</p>
<p>El nombre de la asociación, el lema y los datos de contacto (web y Email) aparecen en la cara frontal. El contraste blanco/negro es uno de los más recurridos y elegantes aunque esto dependerá del gusto de cada uno, además son los colores que aparecen en el blog.</p>
<p>Finalmente, la problemática raster-vector hace que no todos los programas sean igual de prácticos al combinar imágenes con texto en un marco tan pequeño. El texto podría verse mal al rasterizarse en Gimp o las imágenes verse mal por no estar bien escaladas al tamaño del papel. Para evitar problemas es recomendable preparar todos los componentes del diseño en un marco de 90x45mm. Además, conviene que el texto sea siempre vectorial.</p>
<div id="attachment_1828" class="wp-caption aligncenter" style="width: 341px"><img class="size-full wp-image-1828 " src="http://www.gisandchips.org/wp-content//GC_businessCard_back.jpg" alt="" width="331" height="165" /><p class="wp-caption-text">Reverso de la tarjeta G&amp;C, generado con el fichero &quot;G&amp;C_businessCard_back.tex&quot;.</p></div>
<h3>¿Porqué LaTeX?</h3>
<p>Seguramente, podríamos haber creado la tarjeta solamente con Gimp, Impress, Inkscape o cualquier otro software comercial… incluso en un editor de textos cualquiera. O con una máquina de escribir… No obstante, para crear la tarjeta hemos utilizado Gimp y LaTeX.</p>
<p>Básicamente, prefiero esta opción porqué es FOSS y estándar. No necesitamos conocer demasiados botones y LaTeX lleva una larga trayectoria de más de 20 años que hace pensar que la plantilla que creemos seguirá siendo funcional en el futuro. Además, ya utilizo LaTeX para hacer pósters, artículos, presentaciones, materiales docentes, el currículum y mi tesis. De este modo, la pregunta sería ¿porqué aprender otros programas?</p>
<p>Desgraciadamente, no puedo aquí hacer un tutorial de LaTeX para geógrafos pero, si necesitáis escribir un documento estructurado de grandes dimensiones (tesis) o muchos de otro tipo (informes) os animo a que le echéis un vistazo a este proyecto tan interesante pues a medio plazo os ahorrará muchos dolores de cabeza.</p>
<h3>Como está hecha</h3>
<p>Las plantillas que he encontrado en la web (buscando “Business card; LaTeX”) son más bien sosas con un estilo próximo al de la máquina de escribir y además son bastante complejas. Para evitar estos problemas hemos utilizado la clase “Beamer” de LaTeX, que permite entre otras cosas añadir una imagen de fondo y formatear el espacio de la tarjeta apropiadamente.</p>
<p>Primero, hemos utilizado Gimp para crear los fondos de la tarjeta como dos ficheros PNG. A continuación, LaTeX se ha utilizado para la composición, añadir textos y dibujos vectoriales (líneas). En el reverso de la tarjeta hemos añadido un mapa de <a href="http://www.openstreetmap.org/">http://www.openstreetmap.org/</a> para aportar una localización más detallada, aunque también se podría añadir la dirección postal.</p>
<p>La plantilla se compone de tres ficheros TeX, uno para cada cara de la tarjeta y, tras compilar las dos caras, el tercero para crear una composición de 12 tarjetas a dos caras.</p>
<p><img class="size-full wp-image-1830 alignnone" src="http://www.gisandchips.org/wp-content//GC_businessCard_x12_Página_1.jpg" alt="" width="214" height="303" /><img class="alignnone size-full wp-image-1831" src="http://www.gisandchips.org/wp-content//GC_businessCard_x12_Página_2.jpg" alt="" width="214" height="303" /></p>
<p>Esta plantilla es altamente mejorable, es una versión 0.1 para salir del paso, pero os puede dar ideas. La idea de aprovechar OSM para la localización (idea de José) es interesante y evita tener que pensar en hacer un croquis como he visto en algunas tarjetas. Además, creo que los detalles de la tarjeta (la nube de tags como fondo, el mapa…) además de quedar bastante bien aportan información extra sobre nosotros si se saben leer.</p>
<h3>Código en latex</h3>
<p>Finalmente, os paso el código de los tres ficheros de LaTeX necesarios para crear esta tarjeta. Si leéis el código veréis donde podéis introducir vuestras propias imágenes de fondo o el logo que queráis. Espero que os sea de ayuda y os genere otras ideas.</p>
<p><strong>G&#038;C_businessCard_front.tex</strong></p>
<p>
<pre class="brush: latex; title: ; notranslate">
% GIS&amp;Chips nice business card
% By Benito M. Zaragozí
% Version 0.1 released 02/11/2011
% Further releases in: www.gisandchips.org
% This template is composed by three .tex files (businessCard.tex, businessCard_back.tex and businessCardx10.tex) for preparing a basic layout.

\documentclass{beamer}
\usepackage[utf8x]{inputenc}
\usepackage[spanish]{babel}
\usepackage{hyperref}
\usepackage[absolute,showboxes,verbose,overlay]{textpos}
\usepackage{geometry}
\geometry{paperwidth=90mm, paperheight=45mm, layoutwidth=90mm, layoutheight=45mm, left=0mm, top=0mm, right=0mm, bottom=0mm}

\usetheme{default}

\setbeamertemplate{navigation symbols}{}
\setbeamertemplate{background canvas}{\includegraphics[height=\paperheight]{background.png}}

\begin{document}

\frame{
\begin{columns}
	\begin{column}{35mm}
		\includegraphics[width=44mm]{gischips_logo.png}
	\end{column}

	\begin{column}{40mm}
		\color{white}{Asociación\\ \vspace{1mm} \huge{GIS \&amp;amp; Chips}}
		\normalsize
		\vspace{1mm}
		\line(1,0){80}
		\vspace{-1mm}
		\color{white}{Geografía útil para llevar}
	\end{column}
\end{columns}

\vspace{-1mm}
\normalsize
\color{black}{\hspace{5mm}\line(1,0){220}\\ \hspace{2mm} \url{www.gisandchips.org} \hspace{3mm} \url{info@gisandchips.org}}
}
\end{document}
</pre>
</p>
<p><strong>G&#038;C_businessCard_back.tex</strong></p>
<p><strong></strong>
<pre class="brush: latex; title: ; notranslate">
% GIS&amp;Chips nice business card
% By Benito M. Zaragozí
% Version 0.1 released 02/11/2011
% Further releases in: www.gisandchips.org
% This template is composed by three .tex files (businessCard.tex, businessCard_back.tex and businessCardx10.tex) for preparing a basic layout.

\documentclass{beamer}
\usepackage[utf8x]{inputenc}
\usepackage[spanish]{babel}
\usepackage{geometry}
\geometry{margin=2mm, paperwidth=90mm, paperheight=45mm}

\usetheme{default}
\setbeamertemplate{navigation symbols}{}
\setbeamertemplate{background canvas}{\hspace{2mm} \includegraphics[height=41.5mm]{mapbackground.png}}

\begin{document}
	\frame{
		\vspace{-1.5mm}
		\colorbox{white}{GIS\&amp;amp;Chips en la Universidad de Alicante}\\
		\vspace{31mm}
		\begin{flushright}
		\colorbox{white}{\tiny {\url{www.openstreetmap.org}}}
		\end{flushright}
	}
\end{document}
</pre>
</p>
<p><strong>G&#038;C_businessCard_x12.tex</strong></p>
<p><strong></strong>
<pre class="brush: latex; title: ; notranslate">
% GIS&amp;Chips nice business card
% By Benito M. Zaragozí
% Version 0.1 released 02/11/2011
% Further releases in: www.gisandchips.org
% This template is composed by three .tex files (businessCard.tex, businessCard_back.tex and businessCardx10.tex) for preparing a basic layout.

\documentclass[10pt,a4paper]{minimal}
\usepackage{graphicx}
\usepackage[margin=1cm]{geometry}

\begin{document}
\thispagestyle{empty}
\noindent

\begin{center}
\hspace{1mm}\includegraphics[scale=1]{businessCard.pdf} \includegraphics[scale=1]{businessCard.pdf} \vspace{1mm}

\hspace{1mm}\includegraphics[scale=1]{businessCard.pdf} \includegraphics[scale=1]{businessCard.pdf} \vspace{1mm}

\hspace{1mm}\includegraphics[scale=1]{businessCard.pdf} \includegraphics[scale=1]{businessCard.pdf} \vspace{1mm}

\hspace{1mm}\includegraphics[scale=1]{businessCard.pdf} \includegraphics[scale=1]{businessCard.pdf} \vspace{1mm}

\hspace{1mm}\includegraphics[scale=1]{businessCard.pdf} \includegraphics[scale=1]{businessCard.pdf} \vspace{1mm}

\hspace{1mm}\includegraphics[scale=1]{businessCard.pdf} \includegraphics[scale=1]{businessCard.pdf} \vspace{1mm}

\pagebreak
%%%%%%Back with map
\hspace{1mm}\includegraphics[scale=1]{businessCard_back.pdf} \includegraphics[scale=1]{businessCard_back.pdf} \vspace{1mm}

\hspace{1mm}\includegraphics[scale=1]{businessCard_back.pdf} \includegraphics[scale=1]{businessCard_back.pdf} \vspace{1mm}

\hspace{1mm}\includegraphics[scale=1]{businessCard_back.pdf} \includegraphics[scale=1]{businessCard_back.pdf} \vspace{1mm}

\hspace{1mm}\includegraphics[scale=1]{businessCard_back.pdf} \includegraphics[scale=1]{businessCard_back.pdf} \vspace{1mm}

\hspace{1mm}\includegraphics[scale=1]{businessCard_back.pdf} \includegraphics[scale=1]{businessCard_back.pdf} \vspace{1mm}

\hspace{1mm}\includegraphics[scale=1]{businessCard_back.pdf} \includegraphics[scale=1]{businessCard_back.pdf} \vspace{1mm}

\end{center}
\pagebreak
\end{document}
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2011/11/06/business-card-de-gischips-en-latex-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando RSAGA para procesar un raster &#8220;grande&#8221; por partes</title>
		<link>http://www.gisandchips.org/2011/01/13/usando-rsaga-para-procesar-un-raster-grande-por-partes/</link>
		<comments>http://www.gisandchips.org/2011/01/13/usando-rsaga-para-procesar-un-raster-grande-por-partes/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 17:20:21 +0000</pubDate>
		<dc:creator>benizar</dc:creator>
				<category><![CDATA[Análisis]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[GIS libre]]></category>
		<category><![CDATA[R]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/?p=1692</guid>
		<description><![CDATA[Hola a todos, hoy propongo una de las posibles soluciones a un problema que suele aparecer trabajando con GIS: ¿qué hacer cuando queremos procesar un raster “relativamente grande” y los GIS de escritorio más populares tienen problemas de memoria o no acaban el proceso? En algunas ocasiones la solución a estos problemas sería “trocear” el [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-weight: normal;font-size: 13px">Hola a todos, hoy propongo una de las posibles soluciones a un problema que suele aparecer trabajando con GIS: ¿qué hacer cuando queremos procesar un raster “relativamente grande” y los GIS de escritorio más populares tienen problemas de memoria o no acaban el proceso?</span></p>
<p>En algunas ocasiones la solución a estos problemas sería “trocear” el raster y procesarlo por partes. Esto lo podríamos hacer con varios software y en todos ellos sería interesante poder automatizar la tarea al máximo.</p>
<div id="attachment_1695" class="wp-caption aligncenter" style="width: 250px"><a href="http://www.gisandchips.org/wp-content/mdt1.jpg"><img class="size-medium wp-image-1695 " src="http://www.gisandchips.org/wp-content/mdt1-300x300.jpg" alt="" width="240" height="240" /></a><p class="wp-caption-text">1. Modelo digital raster</p></div>
<p>En este post propongo realizar una prueba con RSAGA, que es un modulo de R que permite acceder a las funciones disponibles en la consola de SAGA GIS. Para este post he trabajado en Windows, con R 2.10.1 y SAGA 2.0.4, aunque supongo que no habrá problemas con usar otras versiones más recientes. Además, deberéis instalar en R el paquete RSAGA.<span id="more-1692"></span></p>
<div id="attachment_1696" class="wp-caption aligncenter" style="width: 248px"><a href="http://www.gisandchips.org/wp-content/municipios1.jpg"><img class="size-medium wp-image-1696 " src="http://www.gisandchips.org/wp-content/municipios1-298x300.jpg" alt="" width="238" height="240" /></a><p class="wp-caption-text">2. Shapefile de polígonos con que trocearemos el raster</p></div>
<p>Para esta práctica podéis <a title="descargar ficheros de prueba" href="http://dl.dropbox.com/u/17558342/rsaga_tests.rar" target="_blank">descargar dos ficheros</a> (Imagenes 1 y 2), uno raster y otro vectorial (polígonos). A efectos didácticos se utilizan ficheros pequeños, pero esto resultaría más útil en caso de necesitar fragmentar más el raster. Por ejemplo, en artículos anteriores he presentado código para trabajar imágenes a nivel de parcelas agrícolas. En aquellos artículos trabajábamos las imágenes de una en una y ya estaban recortadas, pero las parcelas podrían ser miles y no queremos hacer eso a mano.</p>
<h3>Conociendo SAGA GIS</h3>
<p>Lo principal, como en tantos otros casos, sería conocer como se trocea un fichero raster con SAGA GIS. Para ello abrimos la GUI de SAGA y vamos a la pestaña “modules” que tiene forma de TOC, generalmente se encuentra a la izquierda de la ventana principal. En esta pestaña podemos encontrar las distintas librerías que agrupan módulos que se relacionan por algún motivo. Explorar estas librerías y practicar con ellas es el mejor modo de estar seguro de lo que se quiere hacer.</p>
<div id="attachment_1697" class="wp-caption aligncenter" style="width: 148px"><a href="http://www.gisandchips.org/wp-content/toc.jpg"><img class="size-medium wp-image-1697" src="http://www.gisandchips.org/wp-content/toc-172x300.jpg" alt="" width="138" height="240" /></a><p class="wp-caption-text">3. TOC de SAGA GIS donde podemos explorar las librerías y los módulos disponibles. </p></div>
<p>Finalmente, he decidido que lo mejor es empezar por separar el shapefile original por polígonos (shapes-tools/separate shapes) y después realizar un recorte por cada uno de los nuevos shapefiles (shapes-grid/clip grid with polygon). Practicar con el interfaz gráfico es un bueno modo de estar seguros de los parámetros que nos pide cada módulo.</p>
<p>Antes de empezar a usar RSAGA he tenido que averiguar los nombres exactos de los módulos y los parámetros que aceptan. Esto lo he hecho con los métodos rsaga.get.modules() y rsaga.get.usage(). Aunque generalmente se puede averiguar también viendo los nombres en el SAGA GUI o mirando en la carpeta donde se contienen las *.dll.</p>
<h3>Trabajando con RSAGA</h3>
<pre class="brush: bash; title: ; notranslate">
## Abrimos la consola de R y cargamos la librería
library(RSAGA)

## Seleccionamos el fichero raster que queremos trocear y una capa vectorial que queramos usar como límites. También especificamos el directorio donde van los outputs. Para trabajar con Windows recomiendo rutas sin espacios.
raster&lt;- file.choose()
poligonos&lt;- file.choose()
directorio &lt;-choose.dir()

## Consultamos hasta encontrar la herramienta que nos separa un shapefile en varios, obteniendo un shapefile por cada polígono, o lo que quisiéramos. Por ejemplo:
## rsaga.get.modules(&quot;shapes_grid&quot;)
## rsaga.get.usage(&quot;shapes_tools&quot;, 7)
## Se ejecuta el método con los parámetros necesarios.
rsaga.geoprocessor(lib=&quot;shapes_tools&quot;, module=7, param=list(SHAPES=poligonos, PATH=directorio, NAMING=0, FIELD=6))
</pre>
<p>Una vez ejecutado este proceso ya disponemos de un shapefile por cada polígono, esto significa que aunque el shapefile original tuviera miles de registros solamente cargaremos en memoria uno a la vez. Esto ya supone un ahorro importante de recursos.</p>
<pre class="brush: bash; title: ; notranslate">
# Listamos los nuevos shapefiles
shapefiles &lt;- list.files(directorio, full.names=T, pattern=&quot;\\.shp&quot;)
## Por último utilizamos RSAGA para realizar tantos recortes del raster como polígonos habíamos extraído
for(i in 1:length(shapefiles)){
select &lt;- shapefiles[i]&lt;/code&gt;
rsaga.geoprocessor(lib=&quot;shapes_grid&quot;, module=7, param=list(OUTPUT=select, INPUT=raster, POLYGONS=select))
}#fin bucle
</pre>
<h3>Conclusiones</h3>
<p>Tras ver este ejemplo nos queda más claro el uso de RSAGA y se visualiza bien como se podrían automatizar gran número de tareas habituales en los GIS. Intentar realizar estas tareas herramientas básicas y generales podría ser algo trabajoso.</p>
<p>En nuestro fichero de prácticas había 18 polígonos por lo que nuestro resultado es una carpeta donde encontramos guardados 18 shapefiles y 18 ficheros raster. Los recortes quedan como se puede ver en la siguiente imagen:</p>
<div id="attachment_1702" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.gisandchips.org/wp-content/recorte.jpg"><img class="size-medium wp-image-1702" src="http://www.gisandchips.org/wp-content/recorte-300x289.jpg" alt="" width="300" height="289" /></a><p class="wp-caption-text">4. Uno de los 18 raster resultantes de los recortes y al fondo el shapefile original</p></div>
<p>En caso de ser necesario, se podría realizar más tareas sobre todos estos ficheros, con este software o con otros programas. Incluso se plantea la posibilidad de usar multithreading en R para ejecutar tareas con RSAGA. Proximamente haremos alguna demostración de esto.</p>
<p>Antes de acabar, solo quiero recordar quando trabajamos con RSAGA en Windows es posible que nos afecten algunas particularidades sobre el modo en que se forman las rutas (espacios, barras de directorios…) y los mensajes de error que aparecen no son de gran ayuda.</p>
<p>——————————————————————</p>
<p>Si queréis contactar podéis enviarme un email (asunto: gisandchips):</p>
<p>Benito M. Zaragozí</p>
<p>benito.zaragozi@ua.es</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2011/01/13/usando-rsaga-para-procesar-un-raster-grande-por-partes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La ciencia de los suelos (I). Creación de triángulos texturales directamente desde una Geodatabase.</title>
		<link>http://www.gisandchips.org/2010/09/08/la-ciencia-de-los-suelos-i-creacion-de-triangulos-texturales-directamente-desde-una-geodatabase/</link>
		<comments>http://www.gisandchips.org/2010/09/08/la-ciencia-de-los-suelos-i-creacion-de-triangulos-texturales-directamente-desde-una-geodatabase/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 04:44:54 +0000</pubDate>
		<dc:creator>benizar</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[gráficas]]></category>
		<category><![CDATA[pl/R]]></category>
		<category><![CDATA[PostGIS]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[R]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/?p=1629</guid>
		<description><![CDATA[Llevo un tiempo ocupado pero ya es hora de enseñar en GIS&#38;Chips algunas de las demos que realicé para mi Trabajo Fin de Master (TFM) sobre SIG. En este artículo os muestro la demo nº2 que consiste en la creación de triángulos texturales directamente desde una Geodatabase que diseño y creo previamente dentro del TFM. [...]]]></description>
			<content:encoded><![CDATA[<p>Llevo un tiempo ocupado pero ya es hora de enseñar en GIS&amp;Chips algunas de las demos que realicé para mi Trabajo Fin de Master (TFM) sobre SIG.</p>
<p>En este artículo os muestro la demo nº2 que consiste en la creación de triángulos texturales directamente desde una <strong>Geodatabase </strong>que diseño y creo previamente dentro del TFM. Pero más adelante añadiré algunos comentarios de las otras demos.</p>
<div id="attachment_1630" class="wp-caption aligncenter" style="width: 277px"><a href="http://www.gisandchips.org/wp-content/clasificacion_textural.png"><img class="size-medium wp-image-1630" src="http://www.gisandchips.org/wp-content/clasificacion_textural-267x300.png" alt="" width="267" height="300" /></a><p class="wp-caption-text">Triángulo textural</p></div>
<h3><span id="more-1629"></span>El TFM</h3>
<p>Es interesante comentar que el TFM es una pequeña parte de otra investigación que estoy realizando en el contexto de la comarca de la Marina Baja (Alicante-España) y los datos que se muestra en las distintas demos son parte de un muestreo para entender mejor el potencial nutritivo de los suelos de la comarca.</p>
<p>El título del TFM es “Diseño de una base de datos geográfica orientada al estudio de los suelos”. Evidentemente, en el espacio de un TFM no cabía desarrollar toda la idea, que podría ser muy trabajosa para una sola persona, del mismo modo que aquí no cabe desarrollar todo el TFM ya que hay algunas partes que no tienen que ver con lo que queremos contar en G&amp;C.</p>
<p>Si entráis en la página principal del la Web de demostraciones podéis leer un poco más sobre la intención y contenidos del TFM ( <a href="http://www.gisandchips.org/demos/suelosTFM/">http://www.gisandchips.org/demos/suelosTFM/</a> ). Además en esta página se explican los detalles de la tecnología utilizada y del método de trabajo (<strong>PostgreSQL</strong>, <strong>PostGIS</strong>, R, <strong>pl/R</strong>&#8230;).</p>
<p>Considero que las demos 2 y 3 son más interesantes, puesto que la primera es solo una función de clasificación que cada uno podría hacer a su gusto, pero si a alguien le interesa la explicaré más adelante.</p>
<div id="attachment_1645" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.gisandchips.org/wp-content/tritex_1.jpg"><img class="size-medium wp-image-1645" src="http://www.gisandchips.org/wp-content/tritex_1-300x232.jpg" alt="" width="300" height="232" /></a><p class="wp-caption-text">Página de la Demo</p></div>
<h3>Los triángulos texturales</h3>
<p>El estudio de los suelos es una disciplina tremendamente amplia, por lo que aquí nos limitaremos a dar, de un modo más breve, las explicaciones necesarias para entender los gráficos resultantes.</p>
<p>Los <strong>triángulos texturales</strong> son gráficos que facilitan la interpretación de la granulometría del suelo. Así pues, habitualmente la textura del suelo se puede representar en un diagrama ternario. En dicho diagrama ternario se emplean reglas trigonométricas para representar en el plano coordenadas tridimensionales que se refieren a distintas combinaciones de clases granulométricas (clases texturales) cuya suma es constante (100). Por último, las clases texturales son convenientes para representar a la textura del suelo en mapas ya que resulta más sencillo representar una variable que no tres, y su uso es bastante amplio en descripciones y clasificaciones del suelo.</p>
<p>A pesar de todas las ventajas de estos gráficos, aparece la dificultad de que existen gran número de triángulos texturales que permiten la clasificación de los suelos, lo que implica que en caso de querer incluir herramientas relacionadas en una BDGS (Geodatabase de suelos) se deba considerar tal variedad de criterios. En este caso se ha creado un gráfico de texturas según las especificaciones del USDA (1951) en castellano.</p>
<p>Pese a que existe cierta variedad de programas pensados para la elaboración de los triángulos de texturas parece interesante que una BDGS que almacene los datos de textura de suelos sea capaz de generar este tipo de gráficos. Además, los otros software suelen ser difíciles de encontrar y poco flexibles. Aquí podemos modificar nuestro gráfico a placer.</p>
<div id="attachment_1643" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.gisandchips.org/wp-content/tritex_results.jpg"><img class="size-medium wp-image-1643" src="http://www.gisandchips.org/wp-content/tritex_results-300x188.jpg" alt="" width="300" height="188" /></a><p class="wp-caption-text">Página de resultados de la demo</p></div>
<h3>Demostración  Triángulo Textural</h3>
<p>En la propia página Web (<a href="http://www.gisandchips.org/demos/suelosTFM/paginas/demo_tritex1.php">http://www.gisandchips.org/demos/suelosTFM/paginas/demo_tritex1.php</a> ) se explica como interactuar con la demo, seleccionando las muestras que se desee, si se desea etiquetar las muestras y con que símbolo se van a representar. Como se puede ver, los datos han sido previamente ordenados según una consulta espacial usando funciones de <strong>PostGIS</strong>, por lo que la gráfica que vamos a generar se ve enriquecida por esta posibilidad. A partir de los datos seleccionados se ejecuta una función escrita en pl/R que usa la librería &#8220;Plotrix&#8221; de R para generar un triángulo textural personalizado y guardarlo como un fichero PNG en el servidor. La función que se usa en este ejemplo puede ser personalizada en muchos sentidos para obtener otros triángulos texturales (hay decenas), en otros idiomas, clasificando los símbolos por algún atributo de la base de datos&#8230;</p>
<p>El uso de la función resulta muy sencillo,</p>
<pre class="brush: sql; title: ; notranslate">
SELECT  _plr_clasif_textural ( 'arenas' , 'limos' , 'arcilla' , 'submuestra' , 'simbolo' , 'etiquetas') ;
</pre>
<p>y a continuación podemos ver el código que hemos usado para crearla, y algunos comentarios:</p>
<pre class="brush: sql; title: ; notranslate">
-- Function: _plr_clasif_textural(text, text, text, text, text, text)
-- DROP FUNCTION _plr_clasif_textural(text, text, text, text, text, text);
CREATE OR REPLACE FUNCTION _plr_clasif_textural(text, text, text, text, text, text)
RETURNS text AS
$BODY$
</pre>
<pre class="brush: bash; title: ; notranslate">
# Cargamos las librerias necesarias
library(Cairo)
library(plotrix)
# Definimos la funcion
clasif.textural = function (soiltexture = NULL, at = seq(0.1, 0.9, by = 0.1),
axis.labels = c(&quot;% arena (entre 0,05 y 2 mm)&quot;, &quot;% limo (entre 0,05 y 0,002 mm)&quot;, &quot;% arcilla (menor de 0,002  mm)&quot;),
tick.labels = list(l = seq(10, 90, by = 10), r = seq(10,
90, by = 10), b = seq(10, 90, by = 10)), show.names = TRUE,
show.lines = TRUE, col.names = &quot;black&quot;, bg.names = par(&quot;bg&quot;),
show.grid = TRUE, col.axis = &quot;black&quot;, col.lines = &quot;black&quot;,
col.grid = &quot;gray&quot;, lty.grid = 3, show.legend = FALSE, label.points = FALSE,
point.labels = '', col.symbols = &quot;blue&quot;, pch = par(&quot;pch&quot;),
...)
{
par(xpd = TRUE)
plot(0.5, type = &quot;n&quot;, axes = FALSE, xlim = c(0, 1), ylim = c(0,
1), main = NA, xlab = NA, ylab = NA)
triax.frame(at = at, axis.labels = axis.labels,
tick.labels = tick.labels, col.axis = col.axis, show.grid = show.grid,
col.grid = col.grid, lty.grid = lty.grid)
arrows(0.12, 0.41, 0.22, 0.57, length = 0.15)
arrows(0.78, 0.57, 0.88, 0.41, length = 0.15)
arrows(0.6, -0.1, 0.38, -0.1, length = 0.15)
if (show.lines) {
triax.segments &lt;- function(h1, h3, t1, t3, col) {
segments(1 - h1 - h3/2, h3 * sin(pi/3), 1 - t1 -
t3/2, t3 * sin(pi/3), col = col)
}
h1 &lt;- c(85, 70, 80, 52, 52, 50, 20, 8, 52, 45, 45, 65,
45, 20, 20)/100
h3 &lt;- c(0, 0, 20, 20, 7, 0, 0, 12, 20, 27, 27, 35, 40,
27, 40)/100
t1 &lt;- c(90, 85, 52, 52, 43, 23, 8, 0, 45, 0, 45, 45,
0, 20, 0)/100
t3 &lt;- c(10, 15, 20, 7, 7, 27, 12, 12, 27, 27, 55, 35,
40, 40, 60)/100
triax.segments(h1, h3, t1, t3, col.lines)
}
if (show.names) {
xpos &lt;- c(0.5, 0.7, 0.7, 0.73, 0.73, 0.5, 0.275, 0.275,
0.27, 0.27, 0.25, 0.135, 0.18, 0.07, 0.49, 0.72,
0.9)
ypos &lt;- c(0.66, 0.49, 0.44, 0.36, 0.32, 0.35, 0.43, 0.39,
0.3, 0.26, 0.13, 0.072, 0.032, 0.024, 0.18, 0.15,
0.06) * sin(pi/3)
snames &lt;- c(&quot;arcillosa&quot;, &quot;arcillosa&quot;, &quot;limosa&quot;, &quot;franco arcillosa&quot;, &quot;limosa&quot;,
&quot;franco arcillosa&quot;, &quot;arcillosa&quot;, &quot;arenosa&quot;, &quot;franco arcillosa&quot;, &quot;arenosa&quot;,
&quot;franco arenosa&quot;, &quot;arenosa&quot;, &quot;franca&quot;, &quot;arenosa&quot;, &quot;franca&quot;, &quot;franco limosa&quot;,
&quot;limosa&quot;)
boxed.labels(xpos, ypos, snames, border = FALSE, col = col.names,
cex=0.8, xpad = 0.5)
}
par(xpd = FALSE)
if (is.null(soiltexture))
return(NULL)
soilpoints &lt;- triax.points(soiltexture, show.legend = show.legend,
label.points = label.points, point.labels = point.labels,
col.symbols = col.symbols, pch = pch, ...)
invisible(soilpoints)
}
# Definimos la imagen
CairoPNG(&quot;…/images/clasificacion_textural.png&quot;, width=500, height=560)
# Construimos las consultas
select = 'select '
arena = paste(arg1, ',', sep=' ');
limo = paste(arg2, ',', sep=' ');
arcilla = paste(arg3, ' ');
from = ' from '
tabla = arg4
selection = paste(select, arena, limo, arcilla, from, tabla, sep='');
selectgids = paste('select gid', from, tabla, sep='');
# Ejecutamos las consultas
texturas &lt;- pg.spi.exec(selection)
gids&lt;- pg.spi.exec(selectgids)
# Ejecutamos la funcion creada mas arriba
soiltex.return&lt;-clasif.textural(texturas,
pch=arg5, point.labels = gids[,], label.points=arg6)
dev.off()
# Damos permisos de lectura
system('chmod go+r …/images/clasificacion_textural.png');
# Una comprobacion para asegurarnos de que se ha creado la grafica, pero no afecta para nada.
if (file.exists('…/images/clasificacion_textural.png')) {
print ('Grafico realizado. Se llama …/images/clasificacion_textural.png')};
</pre>
<pre class="brush: sql; title: ; notranslate">
$BODY$
LANGUAGE 'plr' VOLATILE
COST 100;
ALTER FUNCTION _plr_clasif_textural(text, text, text, text, text, text) OWNER TO postgres;
</pre>
<h3>Algunas notas sobre todo esto:</h3>
<p>(1) En el TFM se apunta que en breve aparecerá una librería creada por Julien Moeys ( <a href="https://r-forge.r-project.org/projects/soiltexture/">https://r-forge.r-project.org/projects/soiltexture/</a> ) que hará innecesario tener que crear la función por nosotros mismos como hemos hecho en esta demostración. Será interesante comentar con los miembros del proyecto la posibilidad de compartir las funciones de su proyecto en una Web completamente dedicada al cálculo de triángulos texturales, donde los usuarios puedan añadir sus propios datos.</p>
<p>(2) Los datos de ejemplo están un poco modificados pero se aproximan a la realidad.</p>
<p>(3) La función tiene muchos aspectos mejorables, por lo menos en cuanto a la legibilidad. Otra posibilidad sería la de que no todos los argumentos de entrada fuesen de tipo texto. Esto lo veremos plasmado en el código de la demo 3.</p>
<p>(4) Si en la página  inicial de la demo no se ve una lista con las muestras disponibles (como en la segunda imagen) será porqué el servidor de la base de datos ha caído y lo deberemos reiniciar en breve. Solo ha pasado una vez, pero quien sabe…</p>
<p>(5) Este artículo destaca la potencia de pl/R a la hora de crear gráficos de lo más complejos.</p>
<h3>Agradecimientos:</h3>
<p>El TFM de que he estado hablando ha sido dirigido por Toni Hernández, en el Máster en Sistemas de Información Geográfica y Teledetección de la Universitat de Girona (UNIGIS), y fue presentado en Mayo de 2010. Les estoy muy agradecido a todos los miembros, tanto alumnos como profesores, por estos últimos años disfrutando y aprendiendo SIG.</p>
<p>Especialmente, quiero agradecer a los compañeros de G&amp;C por la ayuda con instalaciones, creación de la Web y otros dolores de cabeza.</p>
<p>——————————————————————</p>
<p>Si queréis contactar podéis enviarme un email (asunto: gisandchips):</p>
<p>Benito M. Zaragozí</p>
<p>benito.zaragozi@ua.es</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2010/09/08/la-ciencia-de-los-suelos-i-creacion-de-triangulos-texturales-directamente-desde-una-geodatabase/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extracción de características estructurales de una imagen ( II ) (Semi-variograma de una imagen usando R).</title>
		<link>http://www.gisandchips.org/2010/01/28/extraccion-de-caracteristicas-estructurales-de-una-imagen-ii-semi-variograma-de-una-imagen-usando-r-2/</link>
		<comments>http://www.gisandchips.org/2010/01/28/extraccion-de-caracteristicas-estructurales-de-una-imagen-ii-semi-variograma-de-una-imagen-usando-r-2/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 12:45:08 +0000</pubDate>
		<dc:creator>benizar</dc:creator>
				<category><![CDATA[Análisis]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Fields]]></category>
		<category><![CDATA[Mineria de datos espacial]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[Teledetección orientada a objetos]]></category>
		<category><![CDATA[Variograma]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/?p=1303</guid>
		<description><![CDATA[En este artículo usaremos una librería de R (“fields”), que contiene métodos para calcular el semi-variograma empírico de una imagen, lo cual quiere decir que calcularemos el semi-variograma de una gran cantidad de puntos. Y a partir de ahí, analizaremos la existencia de patrones espaciales en tres parcelas agrícolas arbóreas. Figura 1: Parcelas estudiadas en [...]]]></description>
			<content:encoded><![CDATA[<p>En este artículo usaremos una librería de R (“fields”), que contiene métodos para calcular el semi-variograma empírico de una imagen, lo cual quiere decir que calcularemos el semi-variograma de una gran cantidad de puntos. Y a partir de ahí, analizaremos la existencia de patrones espaciales en tres parcelas agrícolas arbóreas.</p>
<h5><strong>Figura 1: Parcelas estudiadas en este artículo.</strong></h5>
<p><strong><a href="http://www.gisandchips.org/wp-content/parcelas.jpg"><img class="aligncenter size-medium wp-image-1238" src="http://www.gisandchips.org/wp-content/parcelas-300x115.jpg" alt="" width="415" height="158" /></a></strong></p>
<p><span id="more-1303"></span></p>
<p>Espero que este sea el primero de varios posts donde aprendamos a estudiar las ortoimagenes, extrayendo características de distintos tipos como ya hicimos en un post anterior (<a href="../2009/11/11/procesamiento-de-imagenes-digitales-con-c-y-una-aplicacion-para-el-analisis-de-parcelas-agricolas/">http://www.gisandchips.org/2009/11/11/procesamiento-de-imagenes-digitales-con-c-y-una-aplicacion-para-el-analisis-de-parcelas-agricolas/</a> ). En aquel caso, se extrajeron algunas sencillas frecuencias a partir del cálculo de la Transformada de Hough que nos proporcionaba AForge.NET, lo cual nos servía para automatizar la decisión de si una parcela era una plantación arbórea y realizar un conteo automático del número de árboles que contenía. En dicho post, se ofrece una aplicación llamada RAPID, que incorpora una galería de imágenes de parcelas agrícolas. Hemos extraído tres de ellas para realizar los siguientes análisis. Son las siguientes:</p>
<p>Al estudiar las 3 parcelas que aparecen en la <strong>Figura 1</strong> con el RAPID: La primera es identificada totalmente como agrícola y nos permite contar con bastante certidumbre el número de árboles de un modo automático. En el caso de la segunda, su estructura en hileras no permite el conteo de árboles pues están muy juntos. Y por último, en los olivos de la tercera no se cumplía la regla de una estructura normal, aunque sí que podíamos contar los árboles. Este último caso era el único donde RAPID no podía “acertar” pues identificaba la parcela como no agrícola debido a que la diferencia angular entre las direcciones principales de la Transformada de Hough no se aproximaba a 90º.</p>
<p><strong>¿Qué es un variograma experimental?</strong> (una breve explicación para entender los resultados)</p>
<p>Los variogramas se utilizan para caracterizar la posible estructura espacial de un conjunto de datos. Podemos distinguir dos tipos de variogramas, el experimental y el modelizado. De estos nos interesa más el experimental. Este último se usa para describir los datos de una muestra, habitualmente una nube de puntos (xyz)</p>
<p>Matemáticamente el semi-variograma, o variograma/2, se puede definir como la mitad del promedio de las diferencias al cuadrado.</p>
<h5><strong><strong>Figura 2: Fórmula para calcular el semi-variograma</strong></strong></h5>
<p><strong><strong><a href="http://www.gisandchips.org/wp-content/formula_vario.jpg"><img class="aligncenter size-full wp-image-1342" src="http://www.gisandchips.org/wp-content/formula_vario.jpg" alt="" width="254" height="46" /></a><br />
</strong></strong></p>
<p>Donde Np(h) es el número de pares a la distancia h, h es el incremento.</p>
<p>Z(xi) son los valores experimentales.</p>
<p>xi localizaciones donde son medidos los valores z(xi).</p>
<p>Aplicado a imágenes, el semi-variograma (o variograma/2), mide el grado de correlación espacial entre los píxeles de una imagen. Podemos comentar varios conceptos (ver <strong>Figura 3</strong>):</p>
<ul>
<li>Sill o meseta: representa la varianza máxima.</li>
<li>Range, rango o alcance: muestra la distancia (en nuestro caso en píxeles) a la que el semi-variograma alcanza la meseta.</li>
<li>Nugget o “efecto pepita”, es la discontinuidad en el origen. Ésta es debida a que el semivariograma, en la práctica, no es nulo en el origen.</li>
</ul>
<h5><strong><strong>Figura 3: Interpretación del semivariograma</strong></strong></h5>
<p><strong><strong><a href="http://www.gisandchips.org/wp-content/variogram.jpg"><img class="aligncenter size-medium wp-image-1343" src="http://www.gisandchips.org/wp-content/variogram-300x184.jpg" alt="" width="300" height="184" /></a><br />
</strong></strong></p>
<p><strong>Ejemplos de cálculo en R</strong></p>
<p>Os aviso de que las imágenes referidas en el código estan en formato *.ppm aunque R tiene muchas librerías capaces de convertir a este formato. También podéis utilizar OpenOffice.</p>
<p>En este post, aplicamos el siguiente código para calcular el semi-variograma empírico de cada una de estas imágenes:</p>
<pre class="brush: bash; title: ; notranslate">
&lt;pre&gt;# Instalo los packages necesarios:

#-------------------------------------------------

install.packages(&quot;pixmap&quot;, dependencies= T)

install.packages(&quot;fields&quot;, dependencies= T)

# Cargo las librerias:
#-------------------------------------------------
library(pixmap)

library(fields)

# Hago una lista con las imagenes de las parcelas y las cargo todas:
#-------------------------------------------------
imag_dir &lt;- list.files(&quot;C:\\ ... \\Articulos Gisandchips\\ parcelas_ppm\\&quot;, full.names=T)

parcela1 &lt;- read.pnm(imag_dir[1])

parcela2 &lt;- read.pnm(imag_dir[2])

parcela3 &lt;- read.pnm(imag_dir[3])

# Aislamos una banda...
#-------------------------------------------------
matriz1&lt;-parcela1@green

matriz2&lt;-parcela2@green

matriz3&lt;-parcela3@green

# Calculamos el semivariograma (si queremos podemos acabar antes cambiando el alcance de 40  a 10, por ejemplo, pero los resultados pueden cambiar y quedará menos bonito (-: )
#-------------------------------------------------
vgram1_40&lt;-vgram.matrix( matriz1, R=40) # esto llevará un poco de tiempo

vgram2_40&lt;-vgram.matrix( matriz2, R=40) # esto llevará un poco de tiempo

vgram3_40&lt;-vgram.matrix( matriz3, R=40) # esto llevará un poco de tiempo

# Añadimos al Plot las matrices que acabamos de calcular
#-------------------------------------------------
plot.vgram.matrix(vgram1_40)# La matriz del variograma

plot.vgram.matrix(vgram2_40)# La matriz del variograma

plot.vgram.matrix(vgram3_40)# La matriz del variograma

# Creamos una curva que ajuste bien sobre la muestra y la añadimos al variograma
#-------------------------------------------------
polyfit1_40_20 &lt;- lm(vgram1_40$vgram ~ poly(vgram1_40$d, 20));

plot(vgram1_40$d, vgram1_40$vgram)

lines(sort(vgram1_40$d), polyfit1_40_20$fit[order(vgram1_40$d)], col=2, lwd=4)

polyfit2_40_20 &lt;- lm(vgram2_40$vgram ~ poly(vgram2_40$d, 20));

plot(vgram2_40$d, vgram2_40$vgram)

lines(sort(vgram2_40$d), polyfit2_40_20$fit[order(vgram2_40$d)], col=2, lwd=4)

polyfit3_40_20 &lt;- lm(vgram3_40$vgram ~ poly(vgram3_40$d, 20));

plot(vgram3_40$d, vgram3_40$vgram)

lines(sort(vgram3_40$d), polyfit3_40_20$fit[order(vgram3_40$d)], col=2, lwd=4)
</pre>
<p>El plot que obtenemos es el siguiente, o similar si es que hemos preferido cambiar algún parámetro:</p>
<h5><strong><strong>Figura 4: Panel donde mostramos los resultados</strong></strong></h5>
<p><strong><strong><a href="http://www.gisandchips.org/wp-content/variograma_3parcelas_polyfit.jpg"><img class="aligncenter size-medium wp-image-1344" src="http://www.gisandchips.org/wp-content/variograma_3parcelas_polyfit-299x299.jpg" alt="" width="327" height="327" /></a><br />
</strong></strong></p>
<p>En la imagen vemos las parcelas, la matriz de su variograma y el variograma, con una curva que ajustamos mucho al los datos. Es fácil interpretar que en la estructura de las parcelas se llega a apreciar cierta &#8220;ciclicidad&#8221;, ya que encontramos mesetas a distintas distancias. Cada meseta se  corresponde aproximadamente a las hileras de árboles. El alcance es el que hemos definido (40, en este caso 40 píxeles; puede que unos 20 m. en la realidad).</p>
<p>Viendo estas imágenes nos podemos dar cuenta de que es más fácil determinar una regla de clasificación que cuando lo hacíamos en el caso del RAPID. En este caso, nos fijamos en el número de máximos relativos de la función polinómica de ajuste del variograma. A simple vista, la primera parcela tiene unos 4, la segunda apenas 1 y la última 3 o 4. <strong>En este caso, podríamos citar una nueva regla para nuestro programa según la que a partir de 2 o 3 máximos relativos una parcela puede ser considerada una plantación arbórea.</strong></p>
<p>Como nos interesa automatizar la tarea creamos una función que nos cuente los máximos relativos. Aquí viene el ejemplo aplicado a la primera parcela:</p>
<pre class="brush: bash; title: ; notranslate">

# Encontrar máximos relativos en la función 1

#--------------------------------------------------

maxRelativos1=0

hMaxRelativos1=0

for(i in 1:(length(polyfit1_40_20$fitted.values)-1))

{

if (polyfit1_40_20$fitted.values[i] &gt; polyfit1_40_20$fitted.values[i+1] &amp;&amp; polyfit1_40_20$fitted.values[i] &gt; polyfit1_40_20$fitted.values[i-1])

{maxRelativos1[i]&lt;- polyfit1_40_20$fitted.values[i]

hMaxRelativos1[i]&lt;- vgram1_40$d[i]}

}

MaxRelativos1&lt;-data.frame(hMaxRelativos1,maxRelativos1)

MaxRelativos1&lt;- na.omit(MaxRelativos1)

NumMaxRelat1_40&lt;-length(rownames(MaxRelativos1))
</pre>
<p>Consultamos los vértices de la curva que hemos dibujado mediante un bucle, de modo que si el vértice <strong>i</strong> tiene un valor superior al vértice anterior y también al vértice posterior entonces es considerado un máximo relativo y queda almacenado en la lista.</p>
<h3>Algunos comentarios sobre todo esto:</h3>
<p>(1) El semivariograma implica un gran esfuerzo de cálculo por parte del ordenador. Esto hace que aún habiendo varias librerías en R que obtienen el semivariograma de una nube de puntos, sean significativamente más lentas que <strong>Fields. </strong>Además, <strong>Fields</strong> hace directamente lo que necesitábamos. No obstante, en un futuro no muy lejano, intentaré desarrollar una librería en C# para reproducir un análisis de este tipo y otras cosillas relacionadas.</p>
<p>(2) Por cuestiones de tiempo no he tratado de crear funciones para las distintas etapas de la demostración. Puede ser un buen ejercicio tratar de implementar todo esto en funciones que permitan entre sus parámetros especificar la banda con la que trabajar, el alcance del semivariograma…</p>
<p>(3) Existen más posibilidades a la hora de establecer reglas, por ejemplo podríamos explorar la distancia que separa los máximos relativos para distinguir los cultivos más intensivos de los más tradicionales. Se me ocurren muchas más posibilidades.</p>
<p>(4) Por último, aunque no le doy mucha importancia, deciros que el número de máximos relativos no es del todo correcto pues el cero siempre aparece en el conteo (sale 5, 2, 5 y no 4, 1, 4 como he dicho más arriba), esto es porqué no he trabajado bastante el bucle, pero es fácil restar 1 a la lista final.  Mi idea principal es la de explorar el concepto y dar unos ejemplos de código a modo de ideas.</p>
<h3>Referencias:</h3>
<p>Para entender bien todo esto creo que es interesante ver mi artículo anterior&#8230;</p>
<p>Solamente os remito al siguiente tutorial de Surfer. Es bastante didáctico. <a href="http://www.goldensoftware.com/variogramTutorial.pdf">http://www.goldensoftware.com/variogramTutorial.pdf</a></p>
<p>De todos modos la red está llena de materiales, apuntes de clase, libros en PDF… No tendréis problemas en encontrar información sobre los variogramas.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Si quereis contactar podeis enviarme un email (asunto: gisandchips):</p>
<p>Benito M. Zaragozí</p>
<p>benito.zaragozi@ua.es</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2010/01/28/extraccion-de-caracteristicas-estructurales-de-una-imagen-ii-semi-variograma-de-una-imagen-usando-r-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Procesamiento de imágenes digitales con C# (y una aplicación para el análisis de parcelas agrícolas).</title>
		<link>http://www.gisandchips.org/2009/11/11/procesamiento-de-imagenes-digitales-con-c-y-una-aplicacion-para-el-analisis-de-parcelas-agricolas/</link>
		<comments>http://www.gisandchips.org/2009/11/11/procesamiento-de-imagenes-digitales-con-c-y-una-aplicacion-para-el-analisis-de-parcelas-agricolas/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 13:05:28 +0000</pubDate>
		<dc:creator>benizar</dc:creator>
				<category><![CDATA[Análisis]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[AForge.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Mineria de datos espacial]]></category>
		<category><![CDATA[Procesamiento digital de imagenes]]></category>
		<category><![CDATA[RAPID]]></category>
		<category><![CDATA[Teledetección orientada a objetos]]></category>
		<category><![CDATA[Transformada de Hough]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/?p=1038</guid>
		<description><![CDATA[En este artículo voy a exponer una aplicación de ejemplo que he realizado con C# utilizando Aforge.NET. Dicha aplicación trata (y a veces lo consigue    ) de distinguir si una parcela dada puede ser una plantación  agrícola arbórea mediante el análisis de la Transformada de Hough, y luego se posibilita el conteo automático de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">En este artículo voy a exponer una aplicación de ejemplo que he realizado con C# utilizando Aforge.NET. Dicha aplicación trata (y a veces lo consigue  <img src='http://www.gisandchips.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />   ) de distinguir si una parcela dada puede ser una plantación  agrícola arbórea mediante el análisis de la  Transformada de Hough, y luego se posibilita el conteo automático de los árboles. Al tratarse de un programa con finalidad didáctica los análisis se realizan para una sola parcela y por pasos muy definidos. No obstante, cabe pensar que su mayor utilidad vendría de un análisis masivo de parcelas.</p>
<h4 style="text-align: center"><a href="http://www.gisandchips.org/wp-content/hough_direcciones.jpg"><img class="size-full wp-image-1041 aligncenter" src="http://www.gisandchips.org/wp-content/hough_direcciones.jpg" alt="hough1" width="392" height="314" /></a>Imagen1</h4>
<p style="text-align: justify"><span id="more-1038"></span>En primer lugar, Aforge.NET es un Framework con distintas librerías que abarcan un amplio rango de campos relacionados con el tratamiento digital de imágenes. Se trata de un proyecto GNU GPL disponible en <a href="http://code.google.com/p/aforge/">http://code.google.com/p/aforge/</a> . Es un proyecto consolidado pero también muy prometedor, en el que Andrew Kirillov tiene un gran trabajo realizado.</p>
<p style="text-align: justify">Según vemos en la página Web entre sus librerías se encuentran:</p>
<ul style="text-align: justify">
<li><strong>AForge.Imaging</strong> &#8211; library with image      processing routines and filters;</li>
<li><strong>AForge.Vision</strong> &#8211; computer vision library;</li>
<li><strong>AForge.Neuro</strong> &#8211; neural networks computation      library;</li>
<li><strong>AForge.Genetic</strong> &#8211; evolution programming      library;</li>
<li><strong>AForge.Fuzzy</strong> &#8211; fuzzy computations library;</li>
<li><strong>AForge.MachineLearning</strong> &#8211; machine learning library;</li>
<li><strong>AForge.Robotics</strong> &#8211; library providing support of      some robotics kits;</li>
<li><strong>AForge.Video</strong> &#8211; set of libraries for video      processing</li>
<li>etc…</li>
</ul>
<p style="text-align: justify">Se me ocurre que alguien se podría plantear un <strong>AForge.GIS</strong>. Pensaremos en ello…</p>
<p style="text-align: justify">Nosotros hemos trabajado únicamente con Aforge.Imaging, pero salta a la vista la potencialidad que prácticamente todas las librerías tendrían para realizar análisis espaciales.</p>
<p style="text-align: justify">
<h3 style="text-align: justify">Introducción</h3>
<p style="text-align: justify">Actualmente, al trabajar en cuestiones de teledetección aplicada a fotografías aéreas e imágenes de satélite se esta aplicando cada vez más el paradigma del Análisis Orientado a Objetos (AOO), pasando de hablar de los valores de los píxeles, a las propiedades de los objetos. Podríamos resumirlo como: teledetección orientada a objetos.</p>
<p style="text-align: justify">No voy a tratar de hablar de análisis orientado a objetos, pues considero que hay abundante información en Internet.</p>
<p style="text-align: justify">Solamente por sentar el ejemplo que vamos a trabajar en este artículo, “Objeto” sería una parcela agrícola que podría tener múltiples “propiedades” como un área, perímetro, otros índices de forma… pero también tendría propiedades basadas en la respuesta espectral de la superficie que encierra, por ejemplo los valores de un índice de vegetación. También serían propiedades muy descriptivas de la parcela aquellas que describan la estructura generada por la distribución de los píxeles. Así pues, para una sola parcela podríamos tener muchísimas propiedades que la describieran, claro está, siempre unas lo harían mejor que otras.</p>
<p style="text-align: justify">En AForge.Imaging están disponibles distintas funciones de análisis para la extracción de estas propiedades o características a partir de una imagen, como por ejemplo la Transformada de Fourier, distintos algoritmos de detección de bordes y la que nos interesa aquí: La <strong>Transformada</strong><strong> de Hough</strong>.</p>
<p style="text-align: justify">En definitiva, hemos elaborado una aplicación de escritorio que calcula la transformada de Hough para la imagen aérea de una parcela, y después de aplicar unas sencillas reglas para decidir si se trata de una parcela agrícola y arbórea, permite contar automáticamente los árboles de dicha parcela.</p>
<p style="text-align: justify">
<h3 style="text-align: justify">La Transformada de Hough</h3>
<p style="text-align: justify">Se trata de una técnica utilizada para extraer elementos, con una forma particular, a partir de una imagen. Es comúnmente aplicada para encontrar y describir líneas rectas en una imagen, aunque también se pueden hallar círculos y otras formas. En la carpeta de ejemplos de AForge podéis encontrar el ejemplo en el que me he basado, en el cual se aplica Hough para hallar líneas y círculos dentro de una imagen.</p>
<p style="text-align: justify">Aquí no vamos a explicar los fundamentos de cálculo, sino la interpretación que podemos hacer de los resultados en nuestro caso del análisis de parcelas.</p>
<p style="text-align: justify">En concreto uno de los datos que obtenemos aplicando Hough es la inclinación de cada una de todas las líneas rectas halladas, como también la intensidad de cada línea (en nuestro caso tendrán mayor intensidad las líneas que más árboles atraviesen).</p>
<p style="text-align: justify">Solamente viendo la <strong>imagen1</strong> podríamos intuir cuales serían las inclinaciones/direcciones de las dos líneas de mayor intensidad halladas por Hough, pero como se ve en la imagen no hay una coincidencia exacta debido a pequeños detalles (los árboles no están homogéneamente separados, la parcela no es cuadrada…).</p>
<p style="text-align: justify"><strong>Nota: las líneas rojas no son las de mayor intensidad, solamente muestran las direcciones.</strong></p>
<p style="text-align: justify">En la <strong>Imagen2</strong> vemos como las direcciones principales son muy similares, y esto nos indica que difícilmente la parcela tendrá la estructura necesaria para realizar el conteo de árboles.</p>
<h4 style="text-align: center"><a href="http://www.gisandchips.org/wp-content/hough_direcciones2.jpg"><img class="size-full wp-image-1043 aligncenter" src="http://www.gisandchips.org/wp-content/hough_direcciones2.jpg" alt="hough_direcciones2" width="417" height="274" /></a>Imagen2</h4>
<h3 style="text-align: justify">Reglas de decisión</h3>
<p style="text-align: justify">Una vez calculado Hough usamos algunas estadísticas de las líneas halladas para crear reglas de decisión que ayuden a distinguir automáticamente la estructura de la parcela.</p>
<p style="text-align: justify">De un modo arbitrario a partir de las pocas parcelas vistas he decidido que serán agrícolas – arbóreas aquellas parcelas cumplan lo siguiente:</p>
<ul style="text-align: justify">
<li>aquellas parcelas que tengan una diferencia angular entre las dos direcciones principales comprendida entre 80 y 120,</li>
<li>o que el % de líneas en la 1ª dirección no sea mucho mayor que el % de la 2ª (&lt;2x)</li>
</ul>
<p style="text-align: justify">Estas reglas deberían ser más complejas y basadas en algún clasificador estadístico o matemático. Pero para ser didáctico es más que suficiente.</p>
<p style="text-align: justify">
<h3 style="text-align: justify">Rough Agricultural Plots IDentifier (RAPID)</h3>
<p style="text-align: justify">RAPID es el nombre que le hemos dado a nuestra aplicación de ejemplo. Es un identificador “basto” de parcelas agrícolas. No hay que esperar maravillas, pero veréis que acierta bastante.</p>
<p style="text-align: center"><a href="http://www.gisandchips.org/wp-content/RAPID.jpg"><img class="aligncenter size-medium wp-image-1448" src="http://www.gisandchips.org/wp-content/RAPID-300x176.jpg" alt="" width="300" height="176" /></a></p>
<h4 style="text-align: center">Imagen3</h4>
<p style="text-align: justify">La aplicación muestra una barra de tareas donde se secuencian los pasos de análisis y a medida que se realiza cada paso se activan nuevos botones.</p>
<p style="text-align: justify">Los botones son:</p>
<ul style="text-align: justify">
<li>OpenImage: permite añadir imágenes propias.</li>
<li>Binarize: binariza la imagen aplicando el umbral especificado en el cuadro de texto.</li>
<li>Calc Hough: calcula la transformada de Hough para la imagen binaria y muestra algunas estadísticas en es cuadro de la derecha. También muestra un mensaje sobre la adecuación, o no, de la parcela.</li>
<li>Count Trees: realiza el recuento de árboles de la imagen binaria y muestra el resultado en el cuadro “Trees estimation”. Este último no debería activarse en caso de que no se cumplieran las condiciones establecidas en nuestras reglas, pero se activa para facilitar todo tipo de pruebas.</li>
</ul>
<p style="text-align: justify">Por último, y para ahorrar tiempo se ha añadido una galería de imágenes de parcelas extraídas del visor del SIGPAC (<a href="http://sigpac.mapa.es/fega/visor/">http://sigpac.mapa.es/fega/visor/</a> ). He intentado que haya cierta variedad. Hay algunas parcelas donde resulta fácil el recuento (1, 2, 6, 8 ), pero también es muy interesante ver como se rechazan las otras parcelas. En algunos casos el conteo de árboles sería difícil incluso manualmente sobre la imagen.</p>
<p>En el caso de la parcela 8 de los ejemplos, vemos que RAPID hace un recuento bastante preciso de los olivos de la parcela 8 de los ejemplos (SIGPAC = 148; RAPID +/- 150, según el Threshold). Por supuesto que seríamos más precisos si elimináramos los ruidos que los bordes de la parcela introducen en el análisis.</p>
<p><a href="http://www.gisandchips.org/wp-content/parcela8_sigpac.jpg"><img class="size-medium wp-image-1449   alignleft" src="http://www.gisandchips.org/wp-content/parcela8_sigpac-242x300.jpg" alt="" width="199" height="246" /></a><a href="http://www.gisandchips.org/wp-content/parcela8_rapid.jpg"><img class="aligncenter size-medium wp-image-1450" src="http://www.gisandchips.org/wp-content/parcela8_rapid-241x300.jpg" alt="" width="202" height="251" /></a></p>
<p style="text-align: center">
<h5 style="text-align: center">Imagenes 4 y 5</h5>
<p style="text-align: justify">Podéis ajustar el umbral, y veréis como el recuento mejora en algunas imágenes. Esto también se podría automatizar.</p>
<p style="text-align: justify">Otra cuestión es que hemos trabajado sobre una imagen RGB, pero es evidente que la distinción de los árboles mejoraría mucho si dispusiéramos de una banda de infrarrojo próximo y la combináramos con las otras antes de realizar la binarización.</p>
<p style="text-align: justify">
<h3 style="text-align: justify">Algunas cosas sobre el código</h3>
<p style="text-align: justify">
<p style="text-align: justify">La mayor parte del código que he escrito se corresponde con aspectos del UI, lo que da una idea de cómo de bueno es AForge.</p>
<p style="text-align: justify">He organizado el código en un fórmulario y tres clases. Hay una clase para binarizar una imagen aplicando unos pocos filtros, otra para obtener las estadísticas de Hough y la última realiza el recuento de “blobs”, en este caso árboles.</p>
<p style="text-align: justify">Solamente me interesa destacar el uso de FilterSequence que permite predefinir el uso de varios filtros, lo cual resulta muy práctico.</p>
<pre class="brush: csharp; title: ; notranslate">

// binarization filtering sequence

FiltersSequence filter = new FiltersSequence(

new ContrastCorrection(),

new Mean(),

new GrayscaleBT709(),

new Threshold()

);
</pre>
<p style="text-align: justify">Por otra parte, si usando filtros y otras herramientas notáis que hacen justo lo contrario de lo que deberían, es porque justamente están haciendo lo contrario <img src='http://www.gisandchips.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  . Deberéis aplicar un Invert() al Bitmap. Esto me pasaba con el BlobCounter(), pues me devolvía la cuenta de todo lo que no eran árboles. También deberéis invertir la imagen si queréis usar filtros del tipo Erosion() o Dilatation().</p>
<p style="text-align: justify">
<p style="text-align: justify"><strong>El codigo fuente lo podeis obtener haciendo un checkout del siguiente repositorio subversion: </strong>svn co http://www.gisandchips.org/svn/rapid/</p>
<h3 style="text-align: justify">Referencias</h3>
<ul style="text-align: justify">
<li>De nuevo la página del proyecto: <a href="http://code.google.com/p/aforge/">http://code.google.com/p/aforge/</a></li>
</ul>
<ul style="text-align: justify">
<li>Para entender mejor esta técnica podéis consultar <a href="http://en.wikipedia.org/wiki/Hough_transform">http://en.wikipedia.org/wiki/Hough_transform</a></li>
</ul>
<ul style="text-align: justify">
<li>Antes del verano asistí a un curso en Valencia (Esp.) donde aprendí bastante de este tema. Como me gustó bastante os adjunto la referencia por si lo repiten de nuevo el año que viene: Teledetección aplicada a la actualización de cartografía de ocupación del suelo: técnicas de clasificación orientada a objetos. Curso teórico-práctico. <a href="http://cgat.webs.upv.es/bigfiles/c_objetos/index.html">http://cgat.webs.upv.es/bigfiles/c_objetos/index.html</a></li>
</ul>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Si quereis contactar podeis enviarme un email (asunto: gisandchips):</p>
<p>Benito M. Zaragozí</p>
<p>benito.zaragozi@ua.es</p>
<p style="text-align: justify">
<p style="text-align: justify">
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2009/11/11/procesamiento-de-imagenes-digitales-con-c-y-una-aplicacion-para-el-analisis-de-parcelas-agricolas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Integración de R en PostgreSQL. Mi primera función en pl/R.</title>
		<link>http://www.gisandchips.org/2009/09/24/integracion-de-r-en-postgresql-mi-primera-funcion-en-plr/</link>
		<comments>http://www.gisandchips.org/2009/09/24/integracion-de-r-en-postgresql-mi-primera-funcion-en-plr/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 08:49:58 +0000</pubDate>
		<dc:creator>benizar</dc:creator>
				<category><![CDATA[Análisis]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[pl/R]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[R]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/?p=165</guid>
		<description><![CDATA[En primer lugar, y para que ninguno de vosotros tenga impresión que no voy a hablar nunca de GIS, me gustaría tranquilizaros, y recordaros que en próximos artículos, yo o a quien le apetezca participar en este hilo, pasaremos a comentar usos de todo esto que estamos viendo orientado al tratamiento de la información espacial. [...]]]></description>
			<content:encoded><![CDATA[<p>En primer lugar, y para que ninguno de vosotros tenga impresión que no voy a hablar nunca de GIS, me gustaría tranquilizaros, y recordaros que en próximos artículos, yo o a quien le apetezca participar en este hilo, pasaremos a comentar usos de todo esto que estamos viendo orientado al tratamiento de la información espacial. Si hay alguien que quiera compartir sus experiencias con temas de R será bien recibido.</p>
<p>Este segundo artículo sobre tecnologías útiles para explotar toda la potencia de R se centra en el uso de R desde el PostgreSQL.</p>
<p>Como todos sabéis, tradicionalmente los Sistemas Gestores de Bases de Datos (SGBD), como PostgreSQL, Oracle, MySQL o Access han sido diseñados para guardar y gestionar gran cantidad de datos, por ello las posibilidades de análisis y salidas gráficas se han delegado mayormente en otros softwares como hojas de cálculo, paquetes estadísticos como SPSS, R o en nuestro caso en softwares SIG&#8230; pero eso se acabó  <img src='http://www.gisandchips.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />   .</p>
<p>pl/R es un lenguaje de programación procedural que permite contar con toda la potencia de cálculo y salidas gráficas del paquete estadístico R, así como de su lenguaje de programación desde dentro de funciones de PostgreSQL.</p>
<p><span id="more-165"></span></p>
<p>Los <span style="text-decoration: underline">requisitos básicos</span> para comenzar a trabajar con pl/R son, como no, tener instalado PostgreSQL (he trabajado sin demasiados problemas con las versiones 8.2 y 8.3), tener pl/R instalado, y crear una base de datos en PostgreSQL donde añadimos el nuevo lenguaje procedural.</p>
<p>Todo lo que necesitamos para iniciarnos lo podemos encontrar en la página WEB del creador de pl/R, <strong>Joe Conway</strong> (<a href="http://www.joeconway.com/plr/">http://www.joeconway.com/plr/</a> ), donde nos descargaremos los ficheros para la instalación tanto para Windows como para Linux. También hay documentación para dar los primeros pasos y unos cuantos más. Esta presentación os ayudará bastante (<a href="http://www.joeconway.com/oscon-pres-2003-1.pdf">http://www.joeconway.com/oscon-pres-2003-1.pdf</a> ). Os recomiendo leer todo lo que podáis, incluso su Curriculum que está en la página principal no tiene desperdicio.</p>
<p>Hay mucha documentación en Internet y ejemplos de funciones básicas. Nosotros para trabajar con algo que ya conocemos, volveremos a utilizar la función hist() de R para obtener el histograma de cualquier campo numérico que podamos tener en una tabla de nuestra base de datos.</p>
<p>Cualquiera que haya trabajado bien con R, bien con funciones de PostgreSQL en general encontrará rápidamente los primeros problemas o desventajas, si es que se pueden llamar así, de usar pl/R. En cualquiera de los dos casos, normalmente tendremos que aprender a usar una nueva herramienta (PostgreSQL o R), lo cual es un nuevo mundo. Depurar las funciones de pl/R puede ser engorroso si se hace directamente, y normalmente los procesos serán más lentos, proporcionalmente, que si trabajásemos solamente en uno de los dos lados del espejo.  Pero ahora os diré las ventajas que puedo destacar más rápidamente:</p>
<ul>
<li>Podemos ejecutar nuestras nuevas funciones mediante una      sencilla expresión de SQL,</li>
<li>las funciones estarán siempre junto con los datos      (acabando con la importación-exportación),</li>
<li>tenemos la posibilidad de usar las funciones desde PHP      y</li>
<li>un potente SGBD se encargará de gestionar el manejo de      los datos, lo cual es muy bueno cuando se trabaja con grandes volúmenes de      información.</li>
</ul>
<p>Hay más ventajas, pero creo que para empezar no está nada mal.</p>
<h3>Mi primera función en pl/R</h3>
<p>Una vez lo tenemos todo instalado, os recomiendo empezar probando que todo funciona bien desde el GUI de R, ya que desde pl/R nos será más complicada la depuración.</p>
<p>La función que paso a detallar está pensada para usarla en local y que la probéis con vuestros propios datos (numéricos; si no lo son veréis un mensaje de error). Se trata de crear un histograma y guardarlo como imagen.</p>
<p>Como os podéis dar cuenta parece una función de pl/pgSQL solo que cambiamos el lenguaje al final y metemos directamente código de R entre $BODYs o comillas simples, aunque resulta más práctico el $ por si dentro de la función necesitamos usar comillas de dos tipos.</p>
<p>Los comentarios de la función pueden ir con # igual que en R.</p>
<p>A continuación tenemos el código para crear la nueva función:</p>
<pre class="brush: sql; title: ; notranslate">

CREATE OR REPLACE FUNCTION _plr_hist(text, text)
RETURNS text AS
$BODY$
select = 'select '
campo = arg1
from = ' from '
tabla = arg2
selection = paste(select, campo, from, tabla, sep='');

## Ejecutamos la consulta y la almacenamos en el objeto &quot;sql&quot;;
sql &lt;- pg.spi.exec (selection);

## Lo que obtengamos a partir de aquí se imprimirá en un pdf...
dir='c:/temp/';
nam= arg1;
ext='.png';
newfile=paste(dir,nam,ext, sep='')
png(newfile);

hist(sql[,1], xlab = campo, ylab='frecuencias', main= campo, col='blue', ylim=c(0,20));

## Hasta aquí
dev.off();

## Si trabajamos en linux querremos hacer algo como lo siguiente
## para asignar privilegios de lectura a todos los usuarios de linux
##sys1='chmod go+r'
##sys2=paste(sys1, '', newfile)
##system(sys2)

## Esto devuelve un mensaje al terminar la función
print1='¡¡¡Ya está!!!, ¡¡¡mira que gráfico más chulo en'
print2=paste(print1, '', newfile, sep='')
print (print2);

$BODY$
LANGUAGE 'plr' VOLATILE
</pre>
<p>Dentro de la función hay que destacar el empleo de pg.spi.exec(),  para uso de los desarrolladores de PostgreSQL, que ejecuta una expresión dada.</p>
<p>Una vez creada nuestra función la podremos ejecutar de un modo muy sencillo. Fijaos que bueno que es esto  <img src='http://www.gisandchips.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />    :</p>
<pre class="brush: sql; title: ; notranslate">

select _plr_hist('un campo numérico', 'tabla');
</pre>
<p>Y obtenemos nuestra gráfica en la carpeta especificada.</p>
<h3>Algunos comentarios sobre todo esto:</h3>
<p>Viéndolo ya funcionar parece que nada “malo” pueda pasarnos. A este respecto, uno de los aspectos que más problemas me creó en su día es lo relacionado con los derechos del usuario Postgres en el SO, tanto en Linux como en Windows. La solución en linux viene dada y comentada en el código de más arriba. Con “chmod go+r” damos derechos de lectura a todos los usuarios. Lo que no me imaginaba nunca es que en Windows también iba a tener problemas. Resulta que el usuario que ejecuta el postmaster de Postgresql es “postgres”, que no dispone de derechos de escritura (no se si hay otros problemas) en “c:\”. Cuando se trata de crear una salida gráfica a c:\, el interprete de pl/R indica que no se puede iniciar el device(). Esto me llevó algún dolor de cabeza pues en Windows suelo hacer todas mis primeras pruebas directamente en c:\. En el ejemplo de antes trabajamos en un directorio creado a propósito. Sobre esto último podemos consultar en <a href="http://pgfoundry.org/pipermail/plr-general/2009-June/000264.html">http://pgfoundry.org/pipermail/plr-general/2009-June/000264.html</a> .</p>
<h3>Referencias:</h3>
<p>Solamente recordaros lo esencial de la página de Joe Conway (<a href="http://www.joeconway.com/plr/">http://www.joeconway.com/plr/</a> ). También os recomiendo entrar en <a href="http://www.bostongis.com/">http://www.bostongis.com/</a> donde hay un hilo de 3 artículos explicando distintos temas relacionados con pl/R. El primero es una introducción bastante detallada, el segundo es trata la creación de polígonos de Voronoi en PostgreSQL usando PostGIS y pl/R (muy recomendable, y avanzado), y el último es un ejemplo de uso de RGDAL.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Si quereis contactar podeis enviarme un email (asunto: gisandchips):</p>
<p>Benito M. Zaragozí</p>
<p>benito.zaragozi@ua.es</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2009/09/24/integracion-de-r-en-postgresql-mi-primera-funcion-en-plr/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Integración de R en aplicaciones de escritorio. R, Rcom y C#</title>
		<link>http://www.gisandchips.org/2009/09/21/integracion-de-r-en-aplicaciones-de-escritorio-r-rcom-y-c/</link>
		<comments>http://www.gisandchips.org/2009/09/21/integracion-de-r-en-aplicaciones-de-escritorio-r-rcom-y-c/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 12:06:06 +0000</pubDate>
		<dc:creator>benizar</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[Rcom]]></category>
		<category><![CDATA[WinForms]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/wordpress/?p=66</guid>
		<description><![CDATA[Hola a todos. Con este artículo espero escribir el primero de una larga serie de artículos sobre el mundo de R. A nuestro juicio, y el de mucha más gente éste es uno de los proyectos GNU con mayor repercusión y también uno de los más prometedores para los usuarios de información geográfica (sigue siendo [...]]]></description>
			<content:encoded><![CDATA[<p>Hola a todos. Con este artículo espero escribir el primero de una larga serie de artículos sobre el mundo de R. A nuestro juicio, y el de mucha más gente éste es uno de los proyectos GNU con mayor repercusión y también uno de los más prometedores para los usuarios de información geográfica (sigue siendo prometedor, aunque ya es toda una realidad).</p>
<p>Para aquellos que no conozcan R ( <a href="http://cran.r-project.org/">http://cran.r-project.org/</a> ), podemos decir que es un lenguaje de programación a la vez que un paquete estadístico de software, desarrollado bajo licencia GNU GPL de la Free Software Foundation. Lo más interesante de R es que se puede adaptar fácilmente a nuestros intereses mediante la instalación de nuevos paquetes. Hay muchos, y suelen englobar funciones comunes a una misma área de conocimiento. En nuestro caso, existen paquetes relacionados con el tratamiento de la información espacial y más directamente, otros que se relacionan con software GIS. Por poner algunos ejemplos, podemos interactuar desde el GUI de R con SAGA GIS, Grass6, GDAL&#8230; y utilizar muchas de sus herramientas, o bien trabajar con otros paquetes propios de R.</p>
<p>En este artículo no trabajaremos desde el GUI de R. Queremos mostrar como integrar R en nuestras aplicaciones de escritorio de .NET mediante objetos COM.</p>
<p><span id="more-66"></span></p>
<p>Para poder comenzar, deberemos instalar un servidor COM disponible en <a href="http://cran.r-project.org/">http://cran.r-project.org/</a>. Entramos en la sección de software/otros/ e instalamos  <a href="http://cran.r-project.org/contrib/extra/dcom/">R-(D)COM Interface</a>. Por supuesto, también necesitamos tener instalado R 2.8.1. Por otra parte puede ser conveniente instalar un paquete de R llamado rcom con todas sus dependencias.</p>
<p>A partir de aquí, <span style="text-decoration: underline">este artículo está dividido en tres partes</span> por motivos didácticos. Primero se habla de cómo se trabaja con Rcom, después describimos cómo se usa el visor de histogramas (que es el ejemplo propuesto), y por último entramos en algunos detalles del código.</p>
<p>Para descargar el código fuente de R2csharp  podéis hacer un <em>checkout </em>del siguiente repositorio Subversion de GIS&amp;Chips:</p>
<p style="padding-left: 30px"><code>svn co http://www.gisandchips.org/svn/r2csharp</code></p>
<p style="padding-left: 30px">
<h3>Uso básico de Rcom</h3>
<p>Una vez instalado el servidor COM agregamos todas las referencias a un proyecto WindowsForm  en nuestro IDE de C# y sus correspondientes using (aquí hemos trabajado con Visual C# Express Edition).</p>
<p class="MsoNormal" style="text-align: justify;line-height: 150%">
<pre class="brush: csharp; title: ; notranslate">
using STATCONNECTORCLNTLib;
using StatConnectorCommonLib;
using STATCONNECTORSRVLib;
</pre>
<p>Con lo que podemos crear nuestro primer objeto de conexión a R, e iniciar una sesión</p>
<pre class="brush: csharp; title: ; notranslate">

//Conexión a R
StatConnector sc1 = new STATCONNECTORSRVLib.StatConnectorClass();
sc1.Init(&quot;R&quot;);
</pre>
<p>A partir de aquí trabajaremos con tres métodos para interactuar con la sesión de R. Estos son:</p>
<ul>
<li>sc1.EvaluateNoReturn(&#8220;código de R&#8221;);</li>
</ul>
<ul>
<li>sc1.Evaluate(&#8220;código de R&#8221;);</li>
</ul>
<ul>
<li>sc1.GetSymbol(&#8220;nombre de un objeto de R&#8221;);</li>
</ul>
<p>He observado que en ocasiones es indistinto el uso de las dos primeras, pero también podemos recibir una excepción en tiempo de ejecución, por lo que utilizaremos la primera para ejecutar código de R que no tiene porqué devolver ningún resultado (por ejemplo setwd(&#8216;C:/&#8217;) , asigna el directorio de trabajo de R), mientras que el resultado de sc1.evaluate() habitualmente querremos almacenarlo en un objeto para poder consultarlo (no tiene sentido hacer un getwd() para después no mostrar su valor, sc1.Evaluate(&#8220;wd&lt;-getwd()&#8221;), con esto almacenamos el wd en un objeto, el cual podemos consultar desde nuestra aplicación).</p>
<p>Por último, sc1.GetSymbol(&#8220;wd&#8221;) nos sirve para consultar un objeto creado en nuestra sesión de R y manipularlo. Por ejemplo, podríamos querer mostrar en una etiqueta lblWD la ruta del directorio de trabajo.</p>
<pre class="brush: csharp; title: ; notranslate">

string wd = (string)sc1.GetSymbol(&quot;wd&quot;);
lblWD.Text = wd;
</pre>
<p>Hasta aquí ya hemos visto todo lo necesario para interactuar con R. Pero la complejidad puede ser mayor debido a las diferencias entre tipos de datos de R y de .NET. Mientras que en R hablamos entre otros de vectores, listas, matrices y dataframes (de números, caracteres&#8230;), en .NET tendremos arrays de distintos tipos o tipos simples. Deberemos consultar el tipo antes de almacenar los datos en estructuras de .NET. Esto lo podemos hacer mediante:</p>
<pre class="brush: csharp; title: ; notranslate">

txtType.Text = sc1.GetSymbol(&quot;wd&quot;).GetType().ToString();
</pre>
<p class="MsoNormal" style="text-align: justify;line-height: 150%"><span style="font-size: 11pt;line-height: 150%;font-family: Arial">donde averiguamos que la función getwd() devuelve un string de .NET. Utilizaremos GetType() muy amenudo. Solamente hay que pensar que estructuras como un dataframe tendrán una estructura en .NET de array de arrays de&#8230; por lo que deberemos tener muy en cuenta los tipos de cada vector miembro del dataframe (podemos entender un dataframe como un conjunto de vectores relacionados; cada vector puede ser un campo de la &#8220;tabla&#8221; que es un dataframe).</span></p>
<h3>R2csharp_histoviewer</h3>
<p>Nuestra aplicación es algo más que un &#8220;!Hola mundo ¡ &#8220;. Tiene ejemplos básicos de distintas tareas habituales en R, pero en este caso realizadas desde nuestra aplicación. En esta demostración creamos un visor de histogramas con Windows Forms, que organiza la información de R de un modo claro y permite crear, mostrar, editar y eliminar dataframes de R, ejecutar una sencilla función de R (<em>&#8220;hist</em>( )<em>&#8220;</em>), y también crear y eliminar ficheros en el sistema operativo (imágenes, directorios&#8230;).</p>
<p>Podemos simular una sesión de trabajo con este visor siguiendo estos pasos (también vemos la correspondencia de las acciones en comandos de R):</p>
<p>1. Seleccionar cargar objeto para añadir uno a uno los tres ficheros de ejemplo  ( bichos.txt, spatstat.txt y usos.txt)</p>
<p align="center"><strong>read.table()</strong></p>
<p align="center"><strong> </strong></p>
<p>2. Seleccionar el objeto bichos y borrarlo <strong> </strong></p>
<p align="center"><strong>rm(bichos)</strong></p>
<p>3. Seleccionar un campo en el segundo listbox y crear su histograma      presionando el botón Hist.</p>
<p align="center"><strong>hist(objeto$campo)</strong> / nos ahorra hacer un <strong>attatch()</strong> en R</p>
<p>4. Editar una celda del campo &#8220;incendio&#8221; del objeto usos. Cambiar algún 0 por    100, y creamos de nuevo el histograma. Vemos como ha cambiado el objeto de R sin necesidad de conocer la posición del dato dentro del dataframe. (para   saber que estamos editando en el row del datagridview deberá verse un lapiz sobre el &#8220;row head&#8221;)</p>
<div id="attachment_76" class="wp-caption aligncenter" style="width: 282px"><a href="http://www.gisandchips.org/wp-content/rcom_histoviewer.jpg"><img class="size-full wp-image-76" src="http://www.gisandchips.org/wp-content/rcom_histoviewer.jpg" alt="Vista de la aplicación en funcionamiento" width="272" height="271" /></a><p class="wp-caption-text">Vista de la aplicación en funcionamiento</p></div>
<p>Evidentemente, sin que el usuario lo sepa se están realizando varios list(), se aplican filtros, se obtienen los rownames() y colnames(), y otras operaciones habituales en R que aquí no se necesitará teclear y cuyos resultados estarán siempre visibles. Lo cual hace que nuestro interfaz sea más amigable solo por esto.</p>
<h3>Algunas notas sobre el código:</h3>
<p>Entre las tareas más interesantes en el código podemos ver un ejemplo de lectura y escritura de un dataframe en un datagridview, teniendo en cuenta los dos tipos de datos devueltos (enteros y dobles). El fichero de ejemplo spatstat.txt intercala columnas de datos dobles y enteros, claro que también podría haber String [] u otros, pero confiamos en que estas mejoras las puedan realizar nuestros lectores.</p>
<p>En el flujo de trabajo habitual hay dos tipos de objetos, los que contienen nuestros datos y los que utilizamos para interactuar con R. Estos últimos los ocultamos al usuario mediante condiciones &#8220;if&#8221;.</p>
<p>A la hora de crear imágenes temporales podemos hacer que se muestren en el device de R si no especificamos ningún dispositivo de salida para hist(). Aunque me ha parecido más interesante integrar la gráfica en el formulario. Para esto hay que decir que existe un problema al usar el portapapeles de Windows para almacenar un metafile, que es el único formato que R nos permite. Se trata de una incompatibilidad del SO que no nos permitirá recuperar la imagen del clipboard para mostrarla en el picbox (podemos consultar algo acerca de esta cuestión en <a href="http://support.microsoft.com/?scid=kb%3Ben-us%3B323530&amp;x=11&amp;y=12">http://support.microsoft.com/?scid=kb%3Ben-us%3B323530&amp;x=11&amp;y=12</a> ) Por este motivo, recurrimos a crear nuestro propio directorio temporal, el cual eliminamos al cerrar el formulario.</p>
<p>Hay que decir que Rcom aporta muchas posibilidades más directas para mostrar o trabajar con los datos de R. No obstante, considero que ya es mucho trabajo conocer un lenguaje de .NET y tener conocimientos de R, como para también especializarse en todas las opciones de Rcom. Para empezar está muy bien, pero en caso de trabajar a menudo con estas herramientas debería explorarse los ejemplos de Rcom, por si resultan más funcionales.</p>
<p>Una consideración que puedo transmitir a los lectores es que no existe ningún &#8220;binding&#8221; para C# /.NET que nos evite tener que embeber código de R en nuestra aplicación, así como existe rJava (<a href="http://cran.r-project.org/web/packages/rJava/index.html">http://cran.r-project.org/web/packages/rJava/index.html</a> ). En caso de disponer de tal posibilidad la hubiésemos utilizado por múltiples motivos, sobretodo por el uso de un solo lenguaje de programación, lo que facilita la comprensión y sencillez del código y también la depuración de la aplicación.</p>
<p>No es necesario advertir que un buen conocimiento de R y las funciones que se quiera aplicar es fundamental para diseñar el mejor interfaz de usuario posible. Pero en determinados casos donde se debe efectuar análisis exploratorios de los datos el esfuerzo se verá compensado por la comodidad y la rapidez en el trabajo. Incluso pensándolo bien, en equipos de trabajo donde haya investigadores o técnicos que no dominen R la creación de un interfaz de este tipo puede ser más que interesante.</p>
<h3>Algunas referencias:</h3>
<p>En <a href="http://www.codeproject.com/">www.CodeProject.com</a> existe un ejemplo de aplicación para C# (<a href="http://www.codeproject.com/KB/cs/RtoCSharp.aspx">http://www.codeproject.com/KB/cs/RtoCSharp.aspx</a> ) donde se repasan las posibilidades básicas para interactuar con R. También hay varios ejemplos de código disponibles para VB6 en la carpeta donde se nos instala el COM Server (por defecto &#8220;C:\Archivos de programa\R\(D)COM Server\samples&#8221;). Por último, la lista de distribución de Rcom donde se tratan muchas cuestiones relacionadas está en <a href="http://mailman.csd.univie.ac.at/pipermail/rcom-l/">http://mailman.csd.univie.ac.at/pipermail/rcom-l/</a> .</p>
<h3>Datos de ejemplo:</h3>
<p><a href="http://www.gisandchips.org/wp-content/usos.txt">Descargar usos.txt</a></p>
<p><a href="http://www.gisandchips.org/wp-content/spatstat.txt">Descargar spatstat.txt</a></p>
<p><a href="http://www.gisandchips.org/wp-content/bichos.txt">Descargar bichos.txt</a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Si quereis contactar podeis enviarme un email (asunto: gisandchips):</p>
<p>Benito M. Zaragozí</p>
<p>benito.zaragozi@ua.es</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2009/09/21/integracion-de-r-en-aplicaciones-de-escritorio-r-rcom-y-c/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

