HOW TO: Unir mucho shapefiles en un solo shapefile con GDAL en Windows

Si trabajas con cartografía es normal que te den un montón de shapefiles como respuesta a “necesito el vectorial de una zona”, y en algunos casos (en el mío) no es manejable cuando su número es mayor de 1000 ficheros.

Para unir todos los ficheros, y de paso borrando las geometrías repetidas, podemos usar la fabulosa herramienta ogr2ogr del paquete GDAL, que puedes obtener desde el instalador de la OSGeo4W que nos permite instalar de manera sencilla GDAL compilado para Windows. Creo que esta parte es suficientemente sencilla como para explicarla, pero si hay dudas, deja un comentario.

Una vez instalado, entramos en “Inicio > OSGeo4W > OSGeo4W Shell”, y vamos a la ruta donde tenemos la montonera de shapefiles. Y creamos el siguiente fichero “.bat” dentro del mismo directorio:

@echo off
mkdir merged
set counter=0

setlocal ENABLEDELAYEDEXPANSION

for %%f in (*.shp) do (
	if not exist merged\mergedFilter.shp (
		echo Uniendo %%f
		ogr2ogr -f "ESRI Shapefile" merged\mergedFilter.shp %%f
	) else (
		echo Uniendo %%f - Iteracion !counter!
		ogr2ogr -f "ESRI Shapefile" -update -append merged\mergedFilter.shp %%f  
		if !counter! GTR 500 (
			echo Simplificando %%f
			ogr2ogr -f "ESRI Shapefile" merged\mergedFilterAux.shp merged\mergedFilter.shp -sql "SELECT * FROM mergedFilter GROUP BY id_parcela" -dialect sqlite
			del merged\mergedFilter.*
			ren merged\mergedFilterAux.* mergedFilter.*
			set counter=0
		)
	)
	set /A counter=counter+1
)

Este código tendrás que adaptarlo a tus necesidades, por ejemplo lo nombres de los fichero y demas, pero te cuento lo que hace:

  • Va leyendo todos los fichero del directorio donde se ejecuta
  • Une el fichero con un fichero que se va creando dentro de “merge/mergedFilter.shp”
  • Cada 500 uniones, borra todas las features que tengan el mismo “id” (en tu caso puede que sea diferente y tengas que usarlo comprobando la geometria).

Le das unas horas, y al final tendrás un fichero Shapefile gigante… pero al menos uno.

Please follow and like us:

¡Qué gracioso es el spam!

Hoy me encuentro esto en los comentarios de este blog, marcado como “spam”:

find its Web today Wednesday in google looking for by . Buy this? have pitufos. I borrowed this last year from my cousin for about 3-4 months, and played it a lot. Borrowed it later on, so I thought I should not buy it as pitufos is coming. I love pitufos but should I buy this?

Hay que tener en cuenta que este comentario esta puesto en un post donde se mencionaba la palabra “pitufos”. Así que el maldito spammer, mete en el script una variable que debe rellenar con una palabra al azar. Pero claro, en este caso, no queda muy bien.

Por cierto, maldito spammer, sin duda: Compra pitufos.

Please follow and like us:

¿Como seleccionar varios elementos de un “select” multi-seleccionable sin usar la tecla Control (en Javascript)?

"Select" con el atributo "multiple" activo

"Select" con el atributo "multiple" activo

Cuando programas con HTML, usar Javascript dentro de tu código puede ser tu solución o tu perdición. Pero en muchos casos, suele ayudarte en tareas que van más allá de lo que nos ofrece el HTML. Y más aun cuando tratas de hacer algo dinámico, con algo de 2.0, pues es obligatorio.

Imaginaros que tenéis una etiqueta “select“, con el atributo “multiple” activo, lo que os permite seleccionar varios elementos de esta selección a la vez como muestra la imagen de la derecha. Pero esto no es tan sencillo, ya que para seleccionar varios de estos elementos (o “options“) tenemos que pulsar la teclar “Ctrl” a la vez que pinchamos encima.

¿Ctrl + ratón?, estamos locos… “, esto es lo que pensó uno de los usuarios que probó una aplicación que estábamos desarrollando, por lo que nos tocó hacerlo más intuitivo, es decir, sólo usar el click del ratón para que el usuario no se haga un lío.

Para realizar esto, tienes que añadir a tu “select” un nuevo atributo “onChange“, que se disparará cuando haya un cambio dentro del control generado:

<select multiple="multiple" id="lbZonas" onChange="select_OnChange();">

Al ocurrir un cambio, lanzaremos la función “select_OnChange“. Entonces, solo tenemos que añadir este código y tendremos lo que buscamos:

// Array donde almacenaremos los elementos seleccionados
var aSelected = new Array();
// Puntero al control seleccionado
var multiList_Select;
// Busco el control que quiero monitorizar
// y lo dejo guardado en nuestro puntero
if (document.getElementById)
{
    // Pon el ID que tenga tu etiqueta "select"
    multiList_Select = document.getElementById("lbZonas");
}
else
{
    for (var iList=0; iList<document.forms.length; iList++)
    {
      var oForm = document.forms[iList];
      if (oForm.multiList)
       {
           multiList_Select = oForm.multiList;
       }
    }
}

// Inicializo el array con los valores que
// estan seleccionados en el control
function select_Init()
{
    for (var iList=0; iList<multiList_Select.options.length; iList++)
    {
        aSelected[iList] = multiList_Select.options[iList].selected;
    }
}

// Esta funcion se ejecuta cada vez que hay un cambio
// y selecciona todos los elementos anteriormente seleccionados
// y el nuevo en el que se ha hecho click. En el caso que ya estubiera
// seleccionado, sencillamente lo pone a falso en el array
function select_OnChange()
{
    var theIndex = multiList_Select.selectedIndex;
    aSelected[theIndex] = !aSelected[theIndex];

    for (var iList=0; iList<multiList_Select.options.length; iList++)
    {
        multiList_Select.options[iList].selected = aSelected[iList];
    }
}
// Esto se lanza solo una vez, y inicializa el array
select_Init();

Solo existe un problema, que se nota algo en Firefox y es un pequeño parpadeo cada vez que se selecciona un elemento, y realmente no se como solucionarlo, pero el problema es bastante pequeño y aceptable. Aunque si conocéis alguna solución soy todo oídos :).

select
Please follow and like us:

Bloquear (o redirigir) Spotify mediante iptables

Spotify

Spotify

Spotify es cojonudo. Si, una revolución. Pero un dolor de cabeza para todos los administradores de redes que ven como poco a poco, Spotify se va comiendo ancho de banda. Y además con su crecimiento nos vemos en la tesitura de que todos los usuarios ya van abandonando el mp3 para ir poco a poco pasándose al streaming, lo que nos hace que nuestros firewall tengan tráfico extra.

No soy el primero que se ha tenido que pelear con el, de hecho ya he visto alguna pregunta para bloquear Spotify en firewalls corporativos.

La solución que proponen la mayoría es bloquear el login del programa, que intentan a una subred en particular como puedes leer en el blog de Fernando Luis aunque con una pequeña mejora respecto a lo que leéis en su blog, traducido a iptables, el comando mágico es:

iptables -I FORWARD -d 78.31.8.0/21 -j DROP

Pero si lo que quieres es dejar a la gente que disfrute de este gran programa, y tienes varias lineas de ADSL y quieres que salga por una linea en concreto, puedes intentar marcar los paquetes mediante marcas, para luego redirigir el trafico marcado. Doy por sentado que tienes algún tipo de script dentro de tu servidor que pone las políticas del firewall en marcha, por lo que no me voy a parar en explicarte como hacer un script que monte todo el tinglado de un enrutamiento en un firewall (como por ejemplo como modificar el fichero /etc/iproute2/rt_tables, que cuento que lo tendrás modificado).
Eso si, os dejo las lineas que os redirigirán todo el tráfico de Spotify por otro ADSL, en este caso ADSL2.

ip rule add fwmark 1 table ADSL2    # ADSL con poco trafico
ip route add default via 192.168.221.1 dev eth1 table ADSL2
iptables -A PREROUTING -t mangle -i eth0 -d 78.31.8.0/21 -j MARK --set-mark 1          # Login Spotify
iptables -A PREROUTING -t mangle -i eth0 -d 195.55.74.0/24 -j MARK --set-mark 1         # Streaming Spotify
Please follow and like us: