jueves, enero 31, 2008

Algunos datos acerca de fenómeno SMS en Argentina

.

En Argentina, este verano se ha duplicado el envío de mensajes de texto al exterior, respecto al igual periodo del año anterior. Ahora se envían cerca de 10 millones de mensajes desde la Argentina hacia 180 países.

Los mensajes representan entre un 25% y un 30% de los ingresos de las telefónicas. En Mosvistar, cada mensaje tiene un costo de 0,62 centavos final, en CTI 0,20 centavos y en Personal oscila entre 0,10 y 0,18 centavos.

Vía: www.rosario3.com

El elogio del imbecil

.
El escritor Pino Aprile es autor del libro "Elogio del imbécil". La obra trata sobre el avance de la estupidez humana frente a la inteligencia, el autor aventura que sobre el final de los tiempos la inteligencia perderá y se extinguirá. Jugando con las palabras y agregando un poco de humor mezclado con pesimismo, Pino propone algunas leyes:

  • Primera Ley "El imbécil sobrevive. El genio se extingue".
  • Corolario: "Antes tontos que muertos". Principio:" La evolución prefiere a un tonto vivo que a un genio muerto. A cambio de darnos la vida, la evolución nos pide el cerebro".
  • Segunda ley "El hombre moderno vive para volverse tonto",
  • Tercera "La inteligencia actúa en beneficio de la estupidez y contribuye a su expansión",
  • Cuarta "La imbecilidad solo puede aumentar"
  • Quinta "La unión no hace la fuerza sino la imbecilidad".
La esencia de su pensamiento acerca de la evolución del hombre puede leerse en el siguiente párrafo, tomado del blog "La Cueva de Zaratustra":

"...Sostener que la imbecilidad es un arma que la sociedad de hoy en día utiliza para la defensa y triunfo de las ideas que conservan a la propia especie, es sostener que la estupidez es consecuencia del progreso y como tal el camino al que el ser humano ha llegado a través del proceso evolutivo en una sociedad que ha eliminado la inteligencia lenta pero inexorablemente y que, como sostiene Aprile, si bien ha servido al hombre en los inicios de la historia para sobrevivir y progresar, ahora se ha vuelto un arma letal en una sociedad jerarquizada y burocratizada hasta el punto en que todo lo que salga, por leve que sea, de esa alineación, de esa balsa homogénea de ideas que pretenden igualar a todos, se convierte en un subversivo, en un peligro para la comunidad, en definitiva, en un ser inteligente que está fuera de los cánones establecidos para la convivencia plácida que nos otorga la igualdad del hombre-masa, del estúpido plácido, amodorrado y anestesiado que permanece impasible ante las cosas importantes, transcendentales y que desarrollan hacia el futuro y hacia el progreso de la vida.
En todos los cargos de poder, la imbecilidad domina, manda, y como dice Aprile el poder no necesita talento. El poder radical intenta igualar a la baja la media de la inteligencia de un país, de ahí los exilios de las mentes más brillantes, de las desapariciones, de las muertes, de la hoguera … Son para ese tipo de poderes, las mentes lúcidas las que suponen un peligro y los tachan de subversivos, de elementos rebeldes, de problemáticos. Eso de cara a la galería. Saben perfectamente que serían los únicos capaces de derrocarles por méritos propios. Y este poder déspota no sólo se da a nivel gobierno de naciones, se da a nivel empresa, trabajo, compañeros incluso, todo aquel que se ve amenazado en su imbecilidad por alguien que se ha desmarcado de la estupidez cotidiana que generalmente, todo lo inunda.

Son las personas inteligentes, o con una inteligencia notoria, las que crean en los demás los celos y los recelos, (aunque estos mediocres se aprovechan de las ventajas descubiertas por los más inteligentes y las disfrutan) así que cuanto menos usan su inteligencia más idiotas se vuelven, con lo cual, la idiotez es tropel.
Pero el estúpido se encuentra en todas las jerarquías, y son éstas precisamente las que más colaboran para que la estupidez se incremente. Un sistema burocrático no puede funcionar si no tiene como base bien fundamentada la estupidez. Hay que seguir siempre las mismas reglas, sin plantearse absolutamente nada fuera de ellas, sino el sistema se derrumbaría. Es la propia estupidez la que da consistencia formal a la sociedad.

Desde la escuela se intenta de forma machacadora, destruir todo lo que sobresalga fuera de un programa establecido como común para todos los estudiantes. La genialidad se va difuminando, por cerrársele todas la vías, desde edades muy tempranas y así llegamos a la mediocridad general desde la más tierna infancia. No se protegen ni se estimulan las dotes innatas de los individuos sino que por el contrario se las menosprecia y se intenta por todos los medios eliminarlas. Se pretende hacer una sociedad homogénea, una igualdad adormecida en la imbecilidad, un sofoco de ideas nuevas consideradas un peligro para un equilibrio social. Quizá sea esa la fórmula adecuada y sea la receta para conducir un rebaño. Pero un rebaño es fácil de manipular cuando está falto de ideas nuevas. Todo es previsible y el poder, en cualquier ámbito de la vida, maneja con facilidad ese modo de agrupamiento. Si uno entre cien se desplaza un poco de ese movimiento estupidizado será sofocado instantáneamente para que no revolucione al resto de los alineados. Las jerarquías y las burrocracias no se pueden violentar, se desmoronarían. Sería la catástrofe de una sociedad establecida. Al menos que desde el poder de una nación se abran las puertas a ciertos cambios, aunque sean considerados amenazadores, como no podría ser de otra forma, por las clases bienpensantes y los partidos clásicamente parapetados en la soberanía de la estupidez colectiva.
La estupidez es un sistema de autocracia impuesta por aquellos que pretenden la fácil manipulación de una sociedad cegada por una igualdad cada vez más reducida de miras.

Pino Aprile, va fundamentando su exposición en cinco leyes principales que son el resumen preciso de una elaboración fundamentada de su particular visión de la estupidez en una sociedad que va alcanzando cada día sus cotas máximas. Entre el humor, la ironía, la observación de los comportamientos de la sociedad actual y pasada, recorre su primigenia idea de la estupidez como modo actual de supervivencia: “Los inteligentes han construido el mundo. Pero quienes lo disfrutan y triunfan el él son los imbéciles”. Cabría preguntarse aquí cuál fue la gran semilla del error en esa terrible construcción que dio paso a este resultado tan amorfo y aniquilador de lo más preciado del ser humano para que en esta sociedad actual se convirtiera en un elemento peligroso: la inteligencia. Sea como fuere, los especialistas en el arte de la rapiña de ideas son legión y, aunque imbéciles pues solo saben copiar de los que sobresalen, es tanta su extrema especialización que se comen, para disfrutar ellos acto seguido de los resultados obtenidos, a los padres de todos los inventos o ideas favorables."

Un blog con bastante información

.
Recomiendo el blog de Eduardo Manchon, un español que supo fundar el sitio Panoramio (hoy adquirido por Google). Eduardo de vez en cuando nos regala información fresca acerca de tips del "negocio" de las webs y además ,en su tiempo libre, realiza muy buenos reportajes.

miércoles, enero 30, 2008

lunes, enero 28, 2008

Distribución geográfica de la asignación de direcciones IP

.
ÁreaNúmero de direccionesPorcentaje
Africa40.241.6641.519%
Antartica15.6200.001%
Asia371.297.01514.015%
Caribbean1.681.8660.063%
Central America2.557.3400.097%
Europe569.838.90321.510%
Middle East12.011.1310.453%
North America1.481.754.66155.932%
Oceania76.417.7112.885%
South America93.409.3043.525%
Duda ¿LLegamos tarde al reparto o tomamos lo que se cayó de la mesa?
Fuente IPligence

jueves, enero 24, 2008

Aplicación para generar archivos KML

.
"csv2kml" es una aplicación disponible en la red (no open source) que toma un archivo csv en el cual se indican las coordenadas (en grados decimales) y demás atributos que caracterizan a un punto o ruta. Como resultado, se obtiene un archivo KML que puede ser leido y representado por Google Earth.

Probá convirtiendo el siguiente archivo "localidades-arg.csv"

  • "localidad","habitantes","lati","long","provincia"
  • "Mercedes",56116,-34.66,-59.44,"Buenos Aires"
  • "Luján",88100,-34.58,-59.11,"Buenos Aires"
  • "Campana",88059,-34.16,-58.96,"Buenos Aires"
  • "Zárate",94138,-34.09,-59.04,"Buenos Aires"
  • "Chivilcoy",58075,-34.9,-60.04,"Buenos Aires"
  • "Bell Ville",36944,-32.6,-62.68,"Córdoba"
  • "Río Cuarto",160866,-33.13,-64.35,"Córdoba"
  • "Rosario",1228978,-32.94,-60.67,"Santa Fé"
  • "Villa María",97841,-32.41,-63.26,"Córdoba"
  • "Veinticinco de Mayo",26214,-35.43,-60.18,"Buenos Aires"
Luego de btener el .kml andá a Google Earth y cargalo, luego podrás ver tus punto añadidos y los atributos que seleccionaste.

miércoles, enero 23, 2008

Checklist sobre usabilidad

.
La gente del blog "Accesibilidad, Usabilidad y Estandares Web" ha publicado una exhaustiva checklist sobre usabilidad de un sitio web. Es interesante dado que toma criterios común es que muchas veces obviamos.
  1. La página funciona en los navegadores habituales (Explorer, Firefox, Opera, Netscape).
  2. La página se ve con cualquier resolución de pantalla, incluyendo los dispositivos móviles.
  3. Las paginas se cargan rápido con una conexión de un modém.
  4. El sitio cuenta con un mapa web o buscador.
  5. Se informa claramente que área o página del sitio se está visitando.
  6. Los enlaces visitados tienen diferente color que lo que aún no se han visitado.
  7. En caso de servicios o trámites en linea se informa de cuantos pasos faltan por completar.
  8. La página proporciona información y pide confirmación antes de completar una tarea importante.
  9. No hay errores durante la navegación por la web.
  10. Los campos obligatorios de un formulario aparecen destacados.
  11. Después de un error se puede volver a la página previa para intentar corregirlo.
  12. No hay enlaces rotos.
  13. Se mantiene una navegación consistente y coherente en todas las pantallas.
  14. El lenguaje es simple.
  15. No hay faltas de ortografía.
  16. La información está jerarquizada.
  17. Se usan anclas visuales.
  18. La información es corta y concisa.
  19. Existen zonas en blanco para poder descansar la vista y separar información.
  20. No hay contenido en movimiento.
  21. Hay suficiente contraste entre el fondo y el texto.
  22. La información está organizada con categorías lógicas.
  23. Se han seguido las pautas WAI para la elaboración de la página.
  24. LA página usa hojas de estilo.
  25. El HTML del sitio ha sido validado satisfactoriamente según el W3C.
  26. La ruta de la página está visible.
  27. El menú de navegación se mantiene constante.
  28. Hay un enlace a la página de inicio en una zona visible en todas las páginas.
  29. En caso de utilizar javascript, flash o cualquier otro tipo de tecnología la página sigue funcionando cuando el usuario no dispone del plugin necesario.
  30. La página de inicio refleja la identidad corporativa de la empresa.
  31. El usuario sabe quién está detrás de la página y de la empresa.
  32. Hay un número de teléfono, dirección física o correo electrónico en todo momento en una zona visible.
  33. El usuario puede ponerse en contacto con el encargado del sitio web para hacer sugerencias.
  34. Se ha comprobado que funcionan correctamente todos los formularios.
  35. Hay alguien encargado de recibir y contestar estos mensajes.
  36. El usuario recibe una copia o confirmación de envío si lo desea cuando se completa una tarea.
  37. La ayuda ofrecida está ligada a la tarea.
  38. Ofrece sección de Preguntas Frecuentes ( FAQ).
  39. Se dan ejemplos para facilitar las tareas.

martes, enero 22, 2008

En esta, como argentinos, vamos marzo !!!

.
Seguimos sin evolucionar en el ranking de percepción de la corrupción, estamos en el puesto 105 con 3 puntos sobre 10 (no se percibe corrrupción) . El problema es que me parece que si seguimos pensando que la clase dirigente es la "única corrupta" vamos mal, ellos no llegaron en barco de Europa, no son el Consejo de los Sabios Griegos, ni extraterrrestres que vinieron de algún planeta rojo. Ellos son argentinos, son nuestros parientes, vecinos, compañeros, colegas, profesores, etc, etc, etc. Lo que quiero decir, es que me parece que sin una buena reflexión por parte de cada ciudadano de este bendito país estamos fritos. Acusar a terceros solo sirve para no mirar nuestras "pequeñas corruptelas diarias" que terminan siendo "complices" de las verdaderamente grandes.

Colores oscuros indican mayor percepción de corrupción por parte de sus ciudadanos

Mapas en línea en Clarín

.
El diario Clarín se está preparando para lanzar su sistemas de mapas de Argentina en línea. Hay una demo en la cual se puede acceder a direcciones de algunas ciudades importantes del país. Creo que si le agregan georeferenciación manual y/o por API el sistema estaría completo y sería innovador en nuestro país.

lunes, enero 21, 2008

Reforzando la seguridad del servicio SSH

.
A raíz de una instalación en la cual estamos trabajando, me topé con el siguiente documento "SSH: Best Practices", el cual explica de forma clara como asegurar un servidor SSH.

Exportando shapefiles a KML

.
Estuve probando una aplicación open source de la empresa Zonums. Se trata de shp2kml y es un conversor de archivos shape de ESRI a capas KML de Google Earth. La verdad es que es simple de usar y ha logrado resultados bastante buenos. Adjunto imagen de mi ciudad a la que le agregué una capa de barrios (originalmente un shapefile) con algunos atributos.

domingo, enero 20, 2008

Reportaje a Matt Mullenweg en La Nación de hoy

.
En el diario La Nación hay un reportaje a Matt Mullenweg (creador de Wordpress) en su paso por Buenos Aires. Matt es aquel que acuñó el slogan que acompaña a Wordpress "Code is poetry" (código es poesía). Me gustó la siguiente reflexión:

–Vos no tenés una educación formal en programación, y sin embargo estás revolucionando la forma en que hacemos blogs. ¿La educación formal ya no es necesaria, en tu opinión?

–Creo que la educación formal es muy importante; me encantaría volver a la universidad y graduarme, pero no creo que sea aplicable a todo. En la música es fundamental, porque allí no hay atajos, hay que practicar todos los días. Pero en otros casos no me preocupa demasiado la educación formal, porque hay gente horrible que tiene toda clase de títulos, y gente genial que no. Busco rodearme de gente que sea curiosa, que lea mucho... Es cierto que yo no tengo una educación formal en programación, pero mis empleados sí la tienen.

sábado, enero 19, 2008

La belleza del ingenio o como el pensar atenta contra el mercado

Probando un estabilizador de cámaras fotográficas


Vía Kikades

¿Qué hay escondido detrás de del proceso svchost?

.
Siempre que analizo que procesos corren en mi S.O me queda la duda que corre enmascarado "How To Identify What Programs Started svchost.exe in Windows" me ha proporcionado el comando y su sintaxis :

tasklist /svc /FI "IMAGENAME eq svchost.exe"

Vía Watching The Net

jueves, enero 17, 2008

Según NetCraft hay 155.230.051 sitios

.
Los datos corresponden a diciembre de 2007.


Y el mercado de los servidores activos evoluciona así

Humor: El pequeño y genial Groucho ilustrado


.
Gracias al blog "Groucho Frases" puedo compartir estas pequeñas píldoras de genialidad. Tip, si son jóvenes y todavía no han visto una película de Groucho Marx les aconsejo que lo hagan, son geniales y sin tiempo.


"Disculpen si les llamo caballeros, pero es que no les conozco muy bien."

"Partiendo de la nada alcance las más altas cimas de la miseria."

"Cualquiera puede envejecer. Lo único que se necesita es vivir lo suficiente."

"El matrimonio es la principal causa de divorcio. (parece una típica frase de un científico de producción)"

"A quien va usted a creer, ¿A mí, o a sus propios ojos?"

"Él puede parecer un idiota y actuar como un idiota. Pero no se deje engañar. Es realmente un idiota."

"El secreto del éxito es la honestidad. Si puedes evitarla, está hecho."

"Es mejor estar callado y parecer tonto que hablar y despejar las dudas definitivamente."

"He pasado una noche estupenda. Pero no ha sido esta."

"No piense mal de mí, señorita, mi interés por usted, es puramente sexual."

"Nunca olvido una cara. Pero en su caso, haré gustoso una excepción."

"La televisión ha hecho maravillas por mi cultura. En cuanto alguien enciende la televisión, voy a la biblioteca y me leo un buen libro."

"Sólo hay una forma de saber si un hombre es honesto. Preguntárselo. Y si responde 'si', sabes que esta corrupto."

"Perdonen que no me levante. (Epitafio de Groucho)"

Google añadió el estado del tiempo a sus mapas

.
Google añadió el estado del tiempo a sus mapas a partir de un acuerdo con The Weather Channel. Esto se logra en base a agregar una capa con el pronóstico meteorológico. El servicio está disponible al activar el modo “My Maps” y seleccionar las nuevas características.

miércoles, enero 16, 2008

¿Cuál será el futuro de MySQL?

.
MySQL anunció oficialmente su adquisición por parte de Sun. Según esta empresa este es el futuro del motor de base de datos

"...Given Sun’s proven track record as the largest contributor to Open Source, I think MySQL users have plenty of reason to feel happy about the acquisition. There are many companies that attempt to ride the wave of positive attention towards Open Source, but in my judgement, Sun gets it right. Sun gets Open Source. Java has been released under the GPL. There’s the OpenSolaris operating system. There’s Open Office / Star Office. There’s the GlassFish application server. There’s the NetBeans IDE tool. And more.

Sun’s track record is embodied by individuals with a solid set of FOSS values, such as Simon Phipps (Sun’s Chief Open Source Officer), Ian Murdock (Debian founder, now Sun’s Chief OS Strategist), and Josh Berkus (PostgreSQL lead). I’ve met all three in various FOSS arenas, I respect their work, and I am looking forward to be working closely with them.

Anxiety on the part of MySQL users may stem from Sun’s success with Java and Solaris. Will MySQL’s support for other programming languages and operating systems now be given less attention?

Absolutely not. MySQL is still being managed by the same people, and the charter is still the same. There is no need for reducing the set of platforms or languages. It only makes sense for us to continue to support defacto Web development standards like LAMP, as well as emerging ones like Ruby and Eclipse. This deal is about addition, not subtraction.

But let’s dwell on the topic of Solaris a bit. Solaris has a special position in the heart of MySQL, as it was the first platform under which MySQL was developed. Linux came second. Internally, code coverage tests were long performed just on Sun. And with the DTrace probes planned as part of 6.0, some types of optimisation of MySQL applications are the easiest on Solaris.

I would expect that having access to the topmost Solaris and Java experts within the same company will accelerate our development for the benefit of MySQL users on the Solaris platform, and in the Java environment, respectively.

But I don’t expect that in any way to be at the cost of other popular operating systems (Linux, Windows, Mac OS/X, other Unixes etc.) or development environments (PHP, Ruby on Rails, Perl, Python, ODBC, C++, C#, VB etc.). MySQL grew with LAMP and MySQL without LAMP at its core is simply unimaginable. It was MySQLs part of LAMP that interested Sun in the first place. Hence I don’t see Sun having a platform migration strategy, but to continue to be an integral part of the dot in .com.

So while the news may be especially good for MySQL users on Solaris and/or Java, the news is definitely good irrespective of environment: As part of Sun, the MySQL database will have immediate access to technical, marketing, OSS developer relations and sales rescources that would have taken us years to build as an independent company..."

Armando un listado de coordendas de ciudades del mundo

.
EL gobierno norteamericano, a través de la National Geospatial - Intelligence Agency, pone de forma libre, para su descarga, una base de datos de localidades del mundo (gazetteer o nomenclador). denominada "Geographic Names for Geopolitical Areas" . El dato más importante es que un atributo de las localidades son sus coordenadas. En esta página hay un servicio de búsqueda sobre estos datos.

La idea es que a partir de la descarga de los datos (205 MB comprimidos, 900 MB descomprimidos y 5.563.357 registros) es posible llevarlos a una base de datos PostgiSQL para su posterior procesamiento.

La estructura de datos a utilizar apara armar la tabla es la siguiente:

CREATE TABLE gns(
RC char(1),
UFI integer,
UNI integer,
LAT numeric(11,7),
LONG numeric(11,7),
DMS_LAT integer,
DMS_LONG integer,
UTM char(4),
JOG char(7),
FC char(1),
DSG char(5),
PC char(1),
CC1 char(2),
ADM1 char(2),
ADM2 varchar(200),
DIM char(12),
CC2 char(2),
NT char(1),
LC char(2),
SHORT_FORM varchar(128),
GENERIC varchar(128),
SORT_NAME varchar(200),
FULL_NAME varchar(200),
FULL_NAME_ND varchar(200),
MOD_DATE date
);

Luego se recomienda importarla con la siguiente orden (rverificar nombre del archivo txt)

copy gns from '/downloads/geonames/geonames20050801.txt' delimiter as E'\t' null as E'' csv header quote as E'\\';

En este enlace se halla la descripción de sus campos y en esta página los códigos de paises.

Libro gratis "Geospatial Analysis:"

.
El Dr Smith ha liberado la versión web de la segunda edición del libro "Geospatial Analysis: Web site. The comprehensive independent guide to principles, techniques & software tools". Se puede acceder a su contenido en este enlace.

martes, enero 15, 2008

Hoy cumple 7 años el mayor proyecto mundial de organización del conocimiento

.
Si, hoy 15 de enero el proyecto Wikipedia cumple 7 años de existencia. A brindar por ello, que más allá de las cuestiones tecnológicas ha demostrado que juntos podemos hacerlo, y además a una escala mundial.

Funciones MySQL que operan sobre datos espaciales I

.
Siguiendo la línea temática relativa a los sistemas de información geográficos y las bases de datos relacionales como soporte de datos, presento una serie de funciones MySQL que operan sobre datos espaciales. En varios ejemplos se hará referencia a la siguiente tabla denominada "elementos"

CREATE TABLE `elementos` (
`id` int NOT NULL,
`nombre` varchar(30),
`objeto` geometry not null
) TYPE=MyISAM;


INSERT INTO elementos (`id`, `nombre`, `objeto`)
VALUES (2, 'ruta provincial 4', GeomFromText('LINESTRING(1 9, 7 9, 12 22)')),
(5, 'Parque Haz', GeomFromText('POLYGON((0 8, 0 12, 10 12, 10 8, 0 8))')),
(6, 'Sector verde',GeomFromText('POLYGON((0 0, 0 9, 9 9, 9 0, 0 0),(1 1, 1 7, 7 7, 7 1, 1 1))')),
(7, 'EGB 8', GeomFromText('POINT(3 3)')),
(9, 'Hospital', GeomFromText('POINT(5 2)'));


Dimension() Devuelve la dimensión de una geometría dada como parámetro. Sus resultados pueden ser: -1 si el objeto es vacío, 0 para un punto, 1 para una línea y 2 para un polígono.

Ejemplos
select dimension(ubicacion) from ciudades;
Devuelve 0 para todas sus filas

select dimension(area) from provincias;
Devuelve 2 para todas sus filas

select dimension(trayecto) from rutas;
Devuelve 1 para todas sus filas


Envelope() Devuelve un rectángulo con los límites de la geometría dada como parámetro.

SET @g1 = GeomFromText('Polygon((0 0, 0 4, 4 4, 4 0,0 0))');
SET @g2 = GeomFromText('Point(8 8)');
SELECT envelope(@g2);
Resultado POLYGON((8 8,8 8,8 8,8 8,8 8))

SET @g1 = GeomFromText('Polygon((0 0, 0 4, 4 4, 4 0,0 0))');
SELECT astext(envelope(@g1));
Resultado POLYGON((0 0,4 0,4 4,0 4,0 0))

SET @g1 = GeomFromText('Polygon((0 0, 3 3, 6 0,0 0))');
SELECT astext(envelope(@g1));
Resultado POLYGON((0 0,6 0,6 3,0 3,0 0))

En el último ejemplo, la geometría original g1 es un triángulo pero la función devolvió el rectángulo mínimo (bounding box) que lo envuelve. A este rectángulo se lo concoe también con las siglas MBR (minimal bounding rectangle) y se lo define como el más pequeño rectángulo que encierra a una forma geométrica. Al analizar el siguiente ejemplo este concepto será ilustrado de mejor forma:

SET @g = GeomFromText('Multipoint(3 0, 6 9, 10 12)');
SELECT astext(envelope(@g));
Resultado POLYGON((3 0,10 0,10 12,3 12,3 0))

SET @g = GeomFromText('LineString(3 0, 6 9, 10 12)');
SELECT astext(envelope(@g));
Resultado POLYGON((3 0,10 0,10 12,3 12,3 0))


La función geometrytype() retorna el tipo de geometría a la cual pertenece un objeto dado como parámetro.

select nombre, geometrytype(objeto) from elementos;

NOMBRE geometrytype(OBJETO)
Ruta provincial 4 linestring
Parque Haz polygon
Sector verde polygon
EGB 8 point
Hospital point


srid() es una función que retorna el sistema de coordenadas asociados a un objeto dado como parámetro.

select nombre, geometrytype(objeto), srid(objeto) from elementos;

NOMBRE geometrytype(OBJETO) srid(OBJETO)
Ruta provincial 4 linestring 0
Parque Haz polygon 0
Sector verde polygon 0
EGB 8 point 0
Hospital point 0

Las funciones x() e y() son solamente aplicadas a geometrías tipo punto. Dado que retornan el valor de la coordenadas X e Y de un punto dado como parámetro.

SELECT X(GeomFromText('POINT(4 6)'))
SELECT Y(GeomFromText('POINT(4 6)'))
Devuelve 4 y 6 respectivamente

SELECT localidad, x(ubicacion), y(ubicacion) FROM ciudades;

LOCALIDAD x(UBICACION) y(UBICACION)
A1 1 1
A2 2 4
B1 4 2
B2 5 1
...

La función glength() se aplica a objetos tipo LineString y devuelve el largo de una línea.

SELECT ruta, glength(trayecto) FROM rutas;

RUTA glength(TRAYECTO)
R1 6
R2 7
R3 10
R4 2
R5 8.5440037453175
R6 3

isclosed() se aplica a un objeto LineString y devuelve 1 si es cerrado o 0 en caso de ser abierto, es decir que su punto inicial sea distinto a su punto final.

SELECT ruta, isclosed(trayecto) FROM rutas;

RUTA isclosed(TRAYECTO)
R1 0
R2 0
...
Si glength() e isclosed() se aplican a objetos MultiLineString el resultado será la suma de todos los largos, para glength, y 1 en isclosed, si todas las líneas son cerradas. También aplicable a objetos LineString están las funciones numpoints() que devuelve el número de puntos de un objeto dado y startpoint() y endpoint() que devuelven el punto inicial y final de una línea respectivamente.

SELECT ruta, numpoints(trayecto), astext(startpoint(trayecto)) FROM rutas;

RUTA numpoints(TRAYECTO) startpoint(TRAYECTO)
R1 2 POINT(1 9)
R2 3 POINT(2 11)

Pointn() aplicado sobre un objeto LineString devuelve el punto numero n dado como segundo parámetro.

SELECT ruta, ASTEXT(pointn(trayecto,2)) FROM rutas;

RUTA astext(startpoint(TRAYECTO))
R1 POINT(7 9)
R2 POINT(2 6)

En polígonos se aplican las funciones area() la cual devuelve su superficie, exteriorring() que dado un polígono devuelve un objeto linestring con los puntos que conforman su exterior. Luego interiorringn(g,n) devuelve como un objeto linestring los puntos de un anillo n interior. Finalmente numinteriorrings() devuelve la cantidad de anillos internos de un polígono.

SET @g = POLYFROMTEXT('POLYGON((0 0, 0 7, 7 7, 7 0, 0 0))');
SELECT area(@g);
Devuelve 49

SET @g = geomfromtext('POLYGON((0 0, 0 7, 7 7, 7 0, 0 0),(1 1, 1 6, 6 6, 6 1, 1 1))');
SELECT area(@g);
Devuelve 24, dado que le resta el área interna que no pertenece al polígono.

SET @g = geomfromtext('POLYGON((0 0, 0 7, 7 7, 7 0, 0 0),(1 1, 1 6, 6 6, 6 1, 1 1))');
SELECT numinteriorrings(@g);
Devuelve 1

SET @g = geomfromtext('POLYGON((0 0, 0 7, 7 7, 7 0, 0 0),(1 1, 1 6, 6 6, 6 1, 1 1))');
SELECT astext(interiorringn(@g,1));
Devuelve LINESTRING(1 1,1 6,6 6,6 1,1 1)

Las siguientes funciones operan sobre objetos GeometryCollection. Geometryn(g,n) devuelve el objeto geométrico que se halla en la posición n y numgeometries() devuelve el número de objetos existentes en una colección dada como parámetro.

SET @g = GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(3 11),
POINT(4 8), LINESTRING(0 6, 9 10, 20 10))');
SELECT GLENGTH(GEOMETRYN(@g, 3));
Devuelve 20.84

lunes, enero 14, 2008

TableSeer

.
TableSeer es un buscador de corte científico que opera sobre documentos pdf. Su característica prinicipal radica en que es capaz de identificar y extraer tablas. Existe una versión operativa sobre el dominio de la química en http://chemxseer.ist.psu.edu. En el siguiente enlace se puede acceder al paper que lo describe.

domingo, enero 13, 2008

sábado, enero 12, 2008

Armando su servicio de hosting propio

.
En el sitio de VMWARE hay un artículo que habla acerca de como armar un equipo que preste servicio de hosting. Puede ser una interesante solución a bajo costo, basada en software libre, que asista a institutos de enseñanza o instituciones del gobierno a evolucionar en los servicios que prestan.

eeepa! ¿no será mucho ?"Google procesa 20 PetaBytes al día"

.
Según artículo de Inquirer donde asegurán que "...este dato proviene de un informe publicado en ACM por parte de dos de los miembros de Google, que han realizado un estudio en el que han determinado la cantidad de información que se maneja diariamente, y que pasa a través de una media de 100.000 procesos denominados MapReduce y que se gestionan en sus clusters. Este proceso es que el convierte las búsquedas en datos ‘analizables’ a partir de los cuales Google es capaz, por ejemplo, de implementar de forma exitosa su programa AdSense..."

jueves, enero 10, 2008

MySQL. Ejemplo de creación de tablas con atributos geográficos

.
Suponga que se tiene el siguiente mapa y se desea almacenar sus objetos geográficos que representan provincias, ciudades y rutas en una base de datos MySQl.

Primer paso registro de ciudades, para lo cual se crea la siguiente tabla:

CREATE TABLE `ciudades` (
`cp` int NOT NULL,
`localidad` varchar(30),
`provincia` varchar(30),
`ubicacion` point not null,
SPATIAL INDEX(ubicacion),
PRIMARY KEY (`cp`)
) TYPE=MyISAM;

Como se ve en la definición de la tabla se ha incorporado un atributo basado en una geometría “ubicación” y es de tipo punto. El formato de archivos MyISAM es el que soporta los datos geométricos en MySQL. A continuación se insertan una serie de registros que podrían definir ubicaciones de distintas localidades de distintas provincias.

INSERT INTO ciudades (`cp`, `localidad`, `provincia`, `ubicacion`)
VALUES (101, 'A1','A', GeomFromText('POINT(1 1)'));

INSERT INTO ciudades (`cp`, `localidad`, `provincia`, `ubicacion`)
VALUES (110, 'A2','A', GeomFromText('POINT(2 4)'));

INSERT INTO ciudades (`cp`, `localidad`, `provincia`, `ubicacion`)
VALUES (111, 'B1','B', GeomFromText('POINT(4 2)'));

INSERT INTO ciudades (`cp`, `localidad`, `provincia`, `ubicacion`)
VALUES (112, 'B2','B', GeomFromText('POINT(5 1)'));

INSERT INTO ciudades (`cp`, `localidad`, `provincia`, `ubicacion`)
VALUES (116, 'B3','B', GeomFromText('POINT(8 2)'));

INSERT INTO ciudades (`cp`, `localidad`, `provincia`, `ubicacion`)
VALUES (121, 'C1','C', GeomFromText('POINT(6 6)'));

INSERT INTO ciudades (`cp`, `localidad`, `provincia`, `ubicacion`)
VALUES (122, 'D1','D', GeomFromText('POINT(8 4)'));

INSERT INTO ciudades (`cp`, `localidad`, `provincia`, `ubicacion`)
VALUES (124, 'D2','D', GeomFromText('POINT(9 4)'));

INSERT INTO ciudades (`cp`, `localidad`, `provincia`, `ubicacion`)
VALUES (134, 'E1','E', GeomFromText('POINT(3 11)'));

INSERT INTO ciudades (`cp`, `localidad`, `provincia`, `ubicacion`)
VALUES (135, 'E2','E', GeomFromText('POINT(9 9)'));

La siguiente tabla se utilizará para almacenar las provincias por medio de una geometría tipo polígono. En este caso se decidió almacenar estos datos en una tabla aparte, pero si por si alguna razón se quisiera, tales datos espaciales se podrían almacenar en la tabla anterior en el atributo “ubicacion”.


CREATE TABLE `provincias` (
`id_provincia` int NOT NULL,
`provincia` varchar(30),
`area` polygon not null,
SPATIAL INDEX(`area`),
PRIMARY KEY (`id_provincia`)
) TYPE=MyISAM;

INSERT INTO provincias (`id_provincia`, `provincia`, `area`)
VALUES (22, 'A', GeomFromText('POLYGON((0 0, 0 8, 3 8, 3 0, 0 0))'));

INSERT INTO provincias (`id_provincia`, `provincia`, `area`)
VALUES (24, 'B', GeomFromText('POLYGON((4 0, 4 4, 10 4, 10 0, 4 0))'));

INSERT INTO provincias (`id_provincia`, `provincia`, `area`)
VALUES (25, 'C', GeomFromText('POLYGON((4 4, 4 8, 7 8, 8 4, 4 4))'));

INSERT INTO provincias (`id_provincia`, `provincia`, `area`)
VALUES (71, 'D', GeomFromText('POLYGON((7 4, 7 8, 8 10, 10 4, 7 4))'));

INSERT INTO provincias (`id_provincia`, `provincia`, `area`)
VALUES (85, 'E', GeomFromText('POLYGON((0 8, 0 12, 10 12, 10 8, 0 8))'));

El paso siguiente es definir una nueva tabla donde se almacenarán las rutas como objetos tipo LineString.

CREATE TABLE `rutas` (
`id_ruta` int NOT NULL,
`ruta` varchar(30),
`trayecto` linestring not null,
SPATIAL INDEX(`trayecto`),
PRIMARY KEY (`id_ruta`)
) TYPE=MyISAM;

INSERT INTO rutas (`id_ruta`, `ruta`, `trayecto`)
VALUES (2, `R1`, GeomFromText('LINESTRING(1 9, 7 9)'));

INSERT INTO rutas (`id_ruta`, `ruta`, `trayecto`)
VALUES (4, `R2`, GeomFromText('LINESTRING(2 11, 2 6, 4 6)'));

INSERT INTO rutas (`id_ruta`, `ruta`, `trayecto`)
VALUES (5, `R3`, GeomFromText('LINESTRING(8 1, 8 11)'));

INSERT INTO rutas (`id_ruta`, `ruta`, `trayecto`)
VALUES (6, `R4`, GeomFromText('LINESTRING(2 1, 4 1)'));

INSERT INTO rutas (`id_ruta`, `ruta`, `trayecto`)
VALUES (8, `R5`, GeomFromText('LINESTRING(1 3, 9 6)'));

INSERT INTO rutas (`id_ruta`, `ruta`, `trayecto`)
VALUES (9, `R6`, GeomFromText('LINESTRING(5 12, 8 12)'));

Tip: Utilizar ahora el visualizador Kosmo (presentando en un post anterior) conectarse a la base de datos y ver graficamente la geografía almacenada.



miércoles, enero 09, 2008

Algo de Einstein

.
En el blog Eliax alguien ha traducido al español una serie de frases de Einstein. Más allá del gran científico que fue, está su especial percepción de la vida . En especial rescato las siguientes que tienen que ver con la educación y la investigación:

"Alguien que nunca ha cometido errores nunca trató de hacer algo nuevo."

"La educación es lo que sobra después que a uno se le olvida lo que aprendió en la escuela"

"El valor de un hombre debe medirse por lo que da y no por lo que recibe. No trates de convertirte en un hombre de éxito sino en un hombre de valores."

"Lo importante de todo es nunca dejar de hacerte preguntas. La curiosidad tiene su propia razón de existir."


Vía BSPCN

martes, enero 08, 2008

Tipos de datos espaciales en MySQL

MySQL soporta dos formatos de datos espaciales, los cuales se emplean indistintamente para escribir consultas Sql, ellos son: el formato Well-Known Text (WKT) y el formato Well-Known Binary (WKB) .

En el formato WKT la forma de descriir una geometría es en ASCII. Así, por ejemplo un objeto punto puede especificarse como POINT(3 4). En cambio, en el formato WKB se utilizan cadenas con datos binarios para representar la información de una geometría. Se usan enteros sin signo de un byte, enteros sin signo de cuatro bytes, y números de ocho bytes de doble precisión. Por ejemplo, una equivalencia del formato ASCII para una geometría POINT(1 1) sería la siguiente cadena hexadecimal “0101000000000000000000F03F000000000000F03F”

El motor de base de datos MySQL soporta los siguientes tipos datos espaciales simples (objetos únicos) de la especificación OpenGIS:

  • POINT almacena punto
  • LINESTRING almacena una cadena de puntos
  • POLYGON almacena un polígono

En cambio los siguientes tipos de datos espaciales soportan conjuntos de objetos:

  • MULTIPOINT almacena una colección de puntos
  • MULTILINESTRING almacena una colección de objetos LineString
  • MULTIPOLYGON almacena una colección de polígonos
  • GEOMETRYCOLLECTION almacena objetos geométricos de cualquier tipo
  • GEOMETRY almacena valores de cualquier tipo

A los efectos de manejar datos espaciales en formato texto (WKT) MySQL posee una serie de funciones que como parámetros de entrada toman una cadena ASCII que representa a la geometría seleccionada, y opcionalmente se le puede añadir un identificador de sistema de referencia espacial (SRID).

Por ejemplo a la función GeomFromText() se le asocia como parámetro una cadena que define una geometría particular. La siguiente instrucción ilustra el uso de la función, ya que se añade un registro a una tabla:

INSERT INTO puntos (nombre, ubicacion)
VALUES ( 'punto A' , GeomFromText( ' POINT(23.5 44.8) ' ) )

INSERT INTO axlVALUES (GeomFromText('LINESTRING(0 0, 3 7, 9 20)'))

INSERT INTO xal VALUES (GeomFromText(
'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3))'))

SET @plg = -> 'Polygon((300 150, 310 150, 310 160, 300 160, 300 150))';
SELECT id, AsText(g) FROM alx WHERE MBRContains(GeomFromText(@poly),g);

Nótese que en la orden anterior se utilizó la función AsTex() la cual convierte un dato en formato binario a formato ASCII.

Alternativamente se pueden utilizar otras funciones de construcción, particulares a cada tipo de geometrías:

GeomCollFromText(wkt[,srid]) o GeometryCollectionFromText(wkt[,srid])
Para datos GeometryCollection .

LineFromText(wkt[,srid]) o LineStringFromText(wkt[,srid])
Para datos LineString.

MLineFromText(wkt[,srid]) , o MultiLineStringFromText(wkt[,srid])
Para datos MultiLineString

MPointFromText(wkt[,srid]) o MultiPointFromText(wkt[,srid])
Para datos MultiPoint

MPolyFromText(wkt[,srid]) ,o MultiPolygonFromText(wkt[,srid])
Para datos MultiPolygon

PointFromText(wkt[,srid])
Para Point

PolyFromText(wkt[,srid]) o PolygonFromText(wkt[,srid])
Para Polygon

Por otro lado existen un juego de funciones para manipular representaciones binarias (WKB) de datos geográficos.

lunes, enero 07, 2008

Librería de ejemplos de modelos de datos

.
En el sitio Database Answer existe una página que contiene una colección interesante de modelos de datos (más de 170). Puede ser un buen recurso docente para ver distintas soluciones de diseño de problemas.

Ejemplo caso "recipes"

domingo, enero 06, 2008

Off topic: No te salves

.
No te Salves (Mario Benedetti)

No te quedes inmóvil
al borde del camino
no congeles el júbilo
no quieras con desgana
no te salves ahora
ni nunca
no te salves
no reserves del mundo
sólo un rincón tranquilo
no dejes caer los párpados
pesados como juicios
no te quedes sin labios
no te duermas sin sueño
no te pienses sin sangre.

Pero si pese a todo
no puedes evitarlo
y congelas el júbilo
y quieres con desgana
y te salvas ahora
y te llenas de calma
y reservas del mundo
sólo un rincón tranquilo
y dejas caer los párpados
pesados como juicios
y te duermes sin sueño
y te piensas sin sangre
y te juzgas sin tiempo
y te quedas inmóvil
al borde del camino
y te salvas
entonces
no te quedes conmigo.

Pd. Cantada por Adriana Varela en su CD "Corazones Perversos" no tiene desperdicio, emociona profundamente.

Humor: Por siempre Fontanarrosa

.
Decisiones peligrosas!

¿Donde estás Felisa?


Es cuestión de gym

Vía Taringa

viernes, enero 04, 2008

Nueva versión de Terrier (Terabyte Retriever)

.
Hoy (4/1/8) la gente del Grupo de Recuperación de Información de la Universidad de Glasgow (donde investiga el gran Keith van Rijsbergen) ha anunciado que han liberado la versión 2 de Terrier. Este software, hecho en Java, es un motor de recuperación de información probabilístico que implementa un modelo conocido com DFR (Divergence From Randomness).

Sus características son:

General

  • Indexing support for common desktop file formats, and for commonly used TREC research collections (eg TREC CDs 1-5, WT2G, WT10G, GOV, GOV2, Blogs06).
  • Many document weighting models, such as many parameter-free Divergence from Randomness weighting models, Okapi BM25 and language modelling.
  • Conventional query language supported, including phrases, and terms occurring in tags.
  • Handling full-text indexing of large-scale document collections, in a centralised architecture to at least 25 million documents.
  • Modular and open indexing and querying APIs, to allow easy extension for your own applications and research.
  • Active Information Retrieval research fed into the Open Source platform.
  • Open Source (Mozilla Public Licence).
  • Written in cross-platform Java - works on Windows, Mac OS X, Linux and Unix.
  • Large user-base over 3 years of public release.

Indexing

  • Out-of-the box indexing of tagged document collections, such as the TREC test collections.
  • Out-of-the box indexing for documents of various formats, such as HTML, PDF, or Microsoft Word, Excel and PowerPoint files.
  • Indexing of field information, such as TITLE, H1, HTML tags information
  • Indexing of position information on a word, or a block (e.g. a window of terms within a distance) level.
  • Support for various encodings of documents (UTF), to facilitate multi-lingual retrieval.
  • Highly compressed index disk data structures.
  • Highly compressed direct file for efficient query expansion.
  • Alternative faster single-pass indexing.
  • Various stemming techniques supported, including the Snowball stemmer for European languages.

Retrieval

  • Provides standard querying facilities, as well as Query Expansion (pseudo-relevance feedback)
  • Can be applied in interactive applications, such as the included Desktop Search, or in a batch setting for research & experimentation.
  • Provides many standard document weighting models, including upto 126 Divergence From Randomness (DFR) document ranking models, and other models such as Okapi BM25, language modelling and TF-IDF. The new DFRee DFR weighting model is also included, which provides robust performance on a range of test collections without the need for any paramter tuning or training.
  • Advanced query language that supports boolean operators, +/- operators, phrase and proximity search, and fields.
  • Provides a number of parameter-free DFR term weighting models for automatic query expansion, in addition to Rocchio's query expansion.
  • Flexible processing of terms through a pipeline of components, such as stop-words removers and stemmers.

jueves, enero 03, 2008

Quién dijo que la deshonestidad académica no tiene sus riesgos.

.
Para aquellos que dudan de esto les sugiero leer la siguiente noticia (muy geek) "Operan a 2 estudiantes chinos para sacarles micrófonos usaron en un examen".

Ilusión óptica

.
Parecerían que son unas especies de serpientes que están moviéndose, pero no es así, el dibujo es estático
Por otros efectos y sus explicaciones ver la página del profesor Akiyoshi KITAOKA

Probando una bd espacial con MySQL

.

La idea es probar algunas capacidades de la base de datos MySQL en lo referente a manejo de datos espaciales. Para lo cual primero se crea una tabla llamada "ciudades" donde se almacenarán atributos convencionales más un atributo espacial "ubicacion" en el cual usando una geometría tipo punto se almacenarán las coordenadas de la localidad.

CREATE TABLE `ciudades` (

`id` int NOT NULL,

`cp` int,

`localidad` varchar(50),

`provincia` varchar(50),

`ubicacion` point not null,

SPATIAL INDEX(ubicacion),

PRIMARY KEY (`id`)

) TYPE=MyISAM;


Luego se cargan algunos registros que servirán para validar la prueba


INSERT INTO ciudades (`id`, `cp`, `localidad`, `provincia`, `ubicacion`)

VALUES(33, 3321, 'Almada', 'Tapia', GeomFromText('POINT(67.1 149.6)'));


INSERT INTO ciudades (`id`, `cp`, `localidad`, `provincia`, `ubicacion`)

VALUES(35, 5511, 'Los Talas', 'Tapia', GeomFromText('POINT(66.6 149.1)'));


INSERT INTO ciudades (`id`, `cp`, `localidad`, `provincia`, `ubicacion`)

VALUES(39, 5221, 'Paz', 'Suma', GeomFromText('POINT(60.1 140.5)'));


A los efectos de recuperar todos los registros se puede consultar con la siguiente orden:

SELECT cp,localidad, AsText(ubicacion) FROM ciudades;


Nótese que la función AsText() convierte a ASCII una representación interna de un objeto espacial.

Una prueba interesante de recuperación de datos podría ser obtener aquellos registros que estén dentro de un cuadrado especificado por el usuario. Se instanció la variable g1 con un objeto polígono, el cual representa al área geográfica de donde nos interesa extraer las ciudades. A continuación, en la consulta se usó la función MBRContains() la cual devuelve verdadero si un punto (ubicación) se halla dentro de un cuadrado mínimo que envuelve al polígono dado como parámetro.

SET @g1 = GeomFromText('Polygon((66 148,66 150,70 150,70 148, 66 148))');

SELECT cp, localidad, AsText(ubicacion) FROM ciudades

WHERE MBRContains( @g1, ubicacion)


Actualmente una de las limitaciones del algebra espacial de MySQL es que opera sobre cuadrados mínimos que recubren objetos espaciales y no sobre los objetos propiamente dichos. Esto hace que se pierda precisión en las respuestas.



miércoles, enero 02, 2008

Que gran verdad acerca de "Como aprendemos"

.

Como aprendemos por William Glasser

10% of what we READ (10% de lo que leemos)

20% of what we HEAR (20% de lo que escuchamos)

30% of what we SEE (30% de lo que vemos)

50% of what we SEE and HEAR (50% de lo que vemos y escuchamos)

70% of what is DISCUSSED with OTHERS (70% de lo que discutimos con terceros)

80% of what is EXPERIENCED PERSONALLY (80% de lo que experimentamos)

95% of what we TEACH TO SOMEONE ELSE (95% de lo que enseñamos)


Hace muchos años alguien me dijo que "no sabes algo hasta que no eres capaz de explicarlo y además (lo más importante para mi) resolver problemas relativos a ese algo".

Vía Carles Gibernau Blog

MySQL y su soporte a datos espaciales

.

La organización OpenGIS Consortium (http://www.opengis.org/) hace un buen tiempo atrás ha definido un estándar internacional para soportar datos de Sistemas de Información Geográfica (SIG). La dea es disponer de motores de base de datos que naturalmente soporten tales datos e implementen un algebra especial para su manejo. Oracle, DB2, Postgres y MySQL son ejemplos de marcas que han extendido sus capacidades y hoy soportan (algunos en forma incompleta) datos SIG.


La idea de este artículo es presentar como MySQL podría ser (en corto tiempo) una alternativa interesante para ciertos requerimientos relacionados con el manejo de información espacial. Es de destacar que actualmente el motor de base de datos (v 5.0.45) si bien soporta la mayoría de los tipos de datos espaciales, aún no ha implementado las operaciones básicas de procesamiento espacial necesarias para llevar a cabo un proyecto completo. La idea de sus desarrolladores es que en las próximas versiones logren estas implementaciones y dejen un producto totalmente utilizable por software SIG.

La idea es tomar datos geográficos almacenados en archivos shapefile de la empresa ESRI y convertirlos a datos espaciales OpenGIS y almacenarlos en una base de datos MySQL. Luego se visualizará tal información en modo gráfico utilizando un editor GIS llamado Kosmo, el cual se conectará a la BD MySQL, leerá los objetos geométricos almacenados y los mostrará en un mapa.

1) Obteniendo los archivos shapefiles. En la dirección http://www.aeroterra.com/d-argentinagral.htm la empresa Aeroterra pone a disposición una serie de archivos conteniendo objetos geográficos de la República Argentina:

En particular nos interesa descargar : Rutas (Rutas nacionales y provinciales), Departamentos (División política a nivel de departamentos), Ciudades y Ferrocarriles (Líneas de ferrocarril y concesiones).

Cada archivo almacena información específica de un atributo particular de la geografía argentina. Por ejemplo departamentos contendrá información acerca de la ubicación, forma (generalmente especificada como un polígono) y demás datos asociados a los departamentos. En rutas serán cadenas de puntos que las representarán y en ciudades solamente puntos (ubicaciones x e y) que las situarán espacialmente.

2) Una vez descargados los archivos es necesario extraer su información y convertirla a formato SQL para ser ingresada posteriormente a la base de datos MySQL. Para ello utilizaremos la aplicación shp2mysql (descargar de http://kartoweb.itc.nl/RIMapper/ )

shp2mysql "rutas.shp" arg_rutas geoprueba >arg_rutas.sql

  • Donde rutas.shp es el archivo shape descargado de Aeroterra
  • geoprueba es el nombre de la base de datos que almacenará las tablas
  • arg_rutas.sql es el nombre del archivo de órdenes SQL

Realizar la misma operación sobre los shapefiles restantes

  • shp2mysql "localidades.shp" arg_locali geoprueba >arg_locali.sql
  • shp2mysql "departamentos.shp" arg_deptos geoprueba >arg_deptos.sql

Si editamos los archivos .sql anteriormente generados podemos ver órdenes como las siguientes:

CREATE TABLE arg_rutas (

ID INT NOT NULL PRIMARY KEY ,

LENGTH DOUBLE(19,6),

RUTA VARCHAR(255),

Tipo_ruta VARCHAR(255));

ALTER TABLE arg_rutas ADD ogc_geom GEOMETRY;

INSERT INTO arg_rutas VALUES( '0', '274.832300' , '0202' ,' Provincial',

GeometryFromText('MULTILINESTRING ((-58.551580607981926 -34.443648540234847, -58.553672673620632 -34.445398884692182 ))', -1) );

Nótese que el archivo comienza con la definición de una tabla de rutas a la que luego se le agrega un campo que contendrá un objeto geométrico. Se añade un registro que representa a una ruta provincial y como un atributo de ella su trayecto expresado como una geometría basada en una cadena de puntos X Y.

Otro ejemplo de registro, pero para la tabla ciudades. Nótese que el objeto geométrico seleccionado es el punto, el cual es ideal para representar la ubicación de una ciudad.

INSERT INTO arg_locali VALUES ('1701', 'BUENOS AIRES','LUJAN', 'LUJAN', 'CABECERA DE DEPARTAMENTO', GeometryFromText('POINT (-59.115948708126815 -34.584686660791057)',-1) );

En el siguiente ejemplo se muestra la definición de un departamento geográfico, para lo cuals e utilizó la estructura polígono.

INSERT INTO arg_deptos VALUES('468','RIO NEGRO','NORQUINCO','NORQUINCO', '418535.63','8403189312.74',GeometryFromText('MULTIPOLYGON(((-70.268389212745291 -41.413914777185283 ,-70.266688402494580 -41.413914972580798 ,-69.743559243136161 -41.505049703428242 ,-69.386183849248752 -42.006405987036622 ,-69.403192030123108 -42.006352489155098 ,-69.429518717748820 -42.006270144250799 ,-69.439959398203143 -42.006236409150738 ,-69.536523940076378 -42.005854772755150 ,-69.633086891614397 -42.005378117629874 ,-69.729649369833993 -42.004833399546122 ,-69.826206944012597 -42.004202747836501 ,-69.922762761877195 -42.003495049672104 ,-69.930684151473244 -42.003430675131369 ,-70.019315874105970 -42.002701324510191 ,-70.115863144327633 -42.001826173874356 ,-70.212404171726362 -42.000869607628260 ,-70.308944577033614 -41.999831411590939 ,-70.405475243779279 -41.998716417564424 ,-70.416985211565617 -41.998399247205334 ,-70.501223123787156 -41.996065487629245 ,-70.517106528137887 -41.996187302946339 ,-70.613631097264658 -41.996862913171931 ,-70.710165371914243 -41.997456358932894 ,-70.806714623903432 -41.997962871036023 ,-70.903255409203382 -41.998396891595974 ,-70.987296075216292 -41.998704722503810 ,-70.999804703652046 -41.998748676832733 ,-71.096356092575036 -41.999018467122639 ,-71.137515523769807 -41.999104731876493 ,-71.171138069871333 -41.999161327834955 ,-71.237711753439811 -41.951481107633512 ,-71.221973058650477 -41.857308364553440 ,-71.301839211201710 -41.820756494587641 ,-71.222626774501748 -41.668817350850148 ,-71.227239210092876 -41.506629817733014 ,-71.030554486557165 -41.550297955353884 ,-70.922394517592323 -41.431239276085840 ,-70.810297580526779 -41.523188394483363 ,-70.695344128089786 -41.441998772740646 ,-70.619781917480466 -41.414031723968804 ,-70.497801205731975 -41.413303833152717 ,-70.268389212745291 -41.413914777185283 )))',-1) );


3) El paso siguiente es generar la base de datos MySQL y correr las scripts generadas anteriormente, así se crean y se cargan las tablas que contendran la información generada en 2. Suponiendo que se ha generado la BD geoprueba las scripts se corren así:

  • mysql -u root -p geoprueba (signo menor) arg_rutas.sql
  • mysql -u root -p geoprueba (signo menor) arg_locali.sql
  • mysql -u root -p geoprueba (signo menor) arg_deptos.sql

En este momento ya se tiene la BD geoprueba con tres tablas que representan distintos aspectos geográficos de la República Argentina.


4) A continuación utilizaremos la aplicación Kosmo (http://www.saig.es/kosmo.php) a los efectos de visualizar en forma de mapa la información que hemos almacenado en la BD geoprueba. Kosmo es un software open source que permite operar con sistemas de información geográfica, lo importante de él es que puede leer y almacenar datos de diferentes tipos de sistemas de almacenamiento.

Al cargar la aplicación, seleccionamos la opción “Crear un proyecto nuevo, con una nueva vista”, seleccionar la proyección por defecto, en el menú selccionamos “vista” y luego “cargar datos”. En la nueva interfase de carga indicamos que el origen de datos es MySQL, el usuario, clave y base de datos donde cargamos los datos, luego damos click en conectar y si todo fue bien seleccionamos la tabla “arg_deptos” damos aceptar en la ventana siguiente, aparece una nueva interface donde sobre la izquierda seleccionamos la opción arg_deptos. A partir de allí se contruye en la pantalla el plano de los departamentos que componen la República Argentina. Realizamos la misma operación de carga sobre rutas y ciudades.

A continuación se puede navegar por el mapa, consultar datos, definir áreas, medir distancias, agregar objetos geográficos, etc. Los cambios realizados se pueden almacenar sobre las mismas tablas donde se obtuvieron.



martes, enero 01, 2008

Feliz cumpleaños TCP/IP

.
Los muchachos de Google han recordado hoy (1/1/8) las bodas de plata (25 años) del juego de protocolos TCP/IP. Para ello han creado un logo homenaje.


En él, en la parte de los puntos puede leerse (muy dificilmente ) "SYN SYN ACK ACK . Gabriel , quien me pasó el dato, me avisa que se ha abierto un blog en Blogspot para conmemorarlo.