domingo, 10 de agosto de 2014

Ejemplo de Localización Optima de Supermercado Usando GIS

Buenas a tod@s (por lo visto y para mi sorpresa aún hay gente que sigue viendo el blog).

Después de ya varios años me decido a volver a subir una entrada nueva (que por desgracia poco tiene que ver con Doñana), lo hago más que nada por motivos de comodidad, ya que mi propósito es sobre todo mostrar a un amigo uno de los muchos usos que tienen los Sistemas de Información Geográfica.
Y la verdad,  más cómodo que tener que desplazarse con el ordenador es usar internet para subirlo, y bueno, como de momento no tengo página web, pues voy a tirar del blog para ello. Otro motivo para subirlo por aquí es que quizás haya alguien out there a quien pueda serle útil lo que voy a poner aquí.

La idea es muy simple, se trata de ver cual sería la localización idónea para un nuevo supermercado en la ciudad de Huelva, algo que es extrapolable a la instalación de cualquier otro tipo de actividad, ya que como se verá solo es cuestión de añadir o quitar parámetros.

Para ello vamos a usar ArcGIS (en su versión de evaluación 10.2.2) y para la localización de los supers en el mapa usaremos la librería de Python pygeocoder, la cual no había usado hasta ahora y la verdad es que me ha gustado mucho por su simplicidad (ya había usado el modulo de Geocoding de ArcGIS, pero me ha resultado más rápido y sencillo usar esta librería). Podéis ver más información al respecto de pygeocoder aquí.

En nuestro caso lo primero que hemos hecho ha sido descargar el catastro de la ciudad de Huelva (al fin y al cabo la idea última es tener una serie de ubicaciones óptimas, y esas ubicaciones obviamente tendrán su referencia catastral. Para la localización de los supermercados existentes hemos visitado las páginas webs de las principales cadenas de supermercados, y hemos buscado las direcciones de sus tiendas en Huelva. Por desgracia hay que decir que la inmensa mayoría (por no decir directamente todas),  de estas webs están muy desactualizadas en cuanto a la ubicación de sus tiendas. Al ser de Huelva he podido corregir los errores que he visto, pero seguramente se me hayan pasado otros por alto. En todo caso, como el propósito no es más que ilustrativo, tampoco es una cuestión muy importante.

Bien, pues una vez que tenemos las direcciones de los supermercados solo tenemos que usar pygeocoder para obtener las coordenadas.  Copiando el ejemplo que viene en la web antes indicada vemos como funciona pygeocoder:

Geocoding

from pygeocoder import Geocoder
results = Geocoder.geocode("Tian'anmen, Beijing")
print(results[0].coordinates)
>>> (39.908715, 116.397389)

Como en nuestro caso tenemos varias coordenadas lo mejor es ponerlo en una lista, de hecho, la solución ha sido hacer una lista para cada supermercado, a la hora de ejecutarla es similar al ejemplo de arriba, simplemente se trata de recorrer la lista con un bucle for y pasar el argumento del bucle como dirección. Otra solución hubiera sido hacer un diccionario en el que las claves fueran los nombres de los supermercados y los valores las listas con las direcciones, luego tan solo habría que recorrer las dict.values().
Quedaría así:

from pygeocoder import Geocoder
Mercadona = ["Av Molino De La Vega S/N", "Avda. Adoratrices , 12", "Avda.De Las Flores C/ Dr Juan Nicolas M.", "Avda De Andalucia S/N, Huelva", "Avda. Del Nuevo Colombino S/N"]
Mas = ["calle puerto numero 20, huelva", "calle san sebastian numero 4, huelva", "calle ruiz de alda numero 3, huelva", "calle jose fariñas numero 57, huelva"]
Dia = ["Calle Parque Comercial, Puerta del Odiel, 21002, Huelva", "Cl. Puerto numero 6, 21001 Huelva", "Avenida Italia 4, 21001 Huelva", "Avenida Alemania 49, 21001 Huelva", "Pz. Houston, 15 21006 Huelva"]
Jamon = ["Calle del Puerto numero 3, 21003 huelva", "Federico Molina, 34 huelva", "Jesús Nazareno, 6 Huelva", "Nicolás Orta, 9, Huelva", "J. López Luque, 1 Huelva", "Alonso Ercilla, 14 Huelva", "Severo Ochoa, 1 Huelva", "Rio de la Plata, s/n Huelva", "Beas, 2 Huelva", "Montevideo, 43 Huelva", "Plaza de Houston, 6 Huelva", "Avda. Palomeque, s/n Huelva", "Avda. Andalucia, 31 Huelva", "Sanlucar de Guadiana, 6 Huelva", "vDiaz del Castillo, 4  Huelva", "San José, s/n huelva", "Concepción Rguez.Garzon, 46 huelva", "Vasco Núñez de Balboa huelva", "Celestino Díaz Hernandez, s/n huelva", "Plaza Don Miguel, s/n huelva", "Artesanos, 12 huelva", "Escultora Miss Whitney, local 2 huelva", "Monsalves, 10 - 12 huelva", "Jazmin s/n huelva", "Hnos. Carlos Obrero de María huelva"]
Lidl = ["Av Molino de la Vega, S/N 21002 Huelva", "Av de las Fuerzas Armadas 21007 Huelva"]

for i in range(len(Mas)):
    results = Geocoder.geocode(Mas[i])
    print str(Mas[i]) + "," + str(results.coordinates) + "Supermercado: Mas"

El poner la dirección y la cadena de supermercado de la que se trata, junto con las coordenadas se debe a que una vez que tenemos las coordenadas, vamos a crear un archivo de texto que abriremos con excel, como sabemos, el poner un separador como por ejemplo una coma entre los distintos campos hará más fácil la importación.
De este modos, una vez que tenemos el archivo de excel con las coordenadas de los supermercados ya solo nos queda ir a ArcGIS, abrir la tabla y crear los puntos con Display XY Data. Una vez hecho esto tendremos algo similar a esto:

     Vista de los datos catastrales de la ciudad de Huelva con la ubicación de los supermercados existentes y detalle de los elementos lineales del catastro sobre la ortofoto.

Una vez localizados los supermercados en la ciudad lo primero que haremos será sacar un raster de distancia para  cada uno de ellos. Estos rasters no son más que archivos que muestran de forma continua (a nivel de pixeles del tamaño que indiquemos) la distancia que hay entre cada supermercado hasta el límite que le indiquemos (en nuestro caso los límites son los de los barrios de Huelva, obtenidos a través de los Datos Espaciales de Referencia de Andalucía).

Con el objetivo de poder repetir el proceso cuando queramos (actualizando el número de supermercados, o en otro pueblos, ciudades, etc.) vamos a hacer un Model Builder en el que iremos recorriendo los pasos que vamos a hacer. Posteriormente ese Model Builder podemos exportarlo a un script de Python y hacer una toolbox en la que ya podamos cambiar de modo igual al del resto de toolboxes, todos los parámetros de entrada.

En un primer análisis como hemos dicho, vamos a tomar solo valores de distancia desde cada supermercado hasta el límite de la ciudad de Huelva. A los rasters así generados se les aplicará una reclasificación de los valores en los siguientes términos:

Detalle de la parte del modelo relativa a la generación de rasters de distancia y tabla de valores empleada para el  reclassify de la distancia.

Es decir, las distancias de 0 a 500 metros del supermercado tendrán un valor de 1, de 500 a 1000 un valor de 2 y así sucesivamente hasta llegar a la última clase, donde todas las distancias mayores de 2 km desde un supermercado tendrán un valor de 5. Esto se hace para cada una de las cadenas de supermercados existentes en Huelva, posteriormente se suman todos los rasters reclasificados de 1 a 5 . Con esto lo que obtenemos es un mapa de Huelva en el que los valores más bajos se corresponden con las zonas más cercanas a un supermercado y los valores más altos con las zonas que tienen menos supermercados en las proximidades.


Distribución espacial de los supermercados y zonificación obtenida en función de la distancia.


Como puede verse en la imagen queda bastante claro que el centro de Huelva es la zona de Huelva donde existe una mayor concentración de supermercados, existe una gradación constante desde el centro hacia las afueras de la ciudad, especialmente hacia las zonas norte y este de Huelva (La orden, prolongación de la Avenida de Andalucía, El Polvorín, etc.). Por cierto que siendo de Huelva, me resulta curioso como los supermercados parecen alejarse desde el Centro hacia el este de la Ciudad, como huyendo de las cercanías de la Barriada de la Navidad y El Hotel Suarez, dejando de lado también toda la zona de las Avenidas Unión Europea y Cristóbal Colón, zonas de mucho dinamismo y en la que se está asentando mucha población joven.

Bueno, esto sería tan solo una primera etapa en la que solo hemos considerado la distancia como único parámetro, y donde hemos considerado la ubicación ideal teniendo en cuenta a todos los supermercados de manera neutra, es decir, como si no fuésemos a ubicar ninguno en concreto. Para profundizar un poco más vamos a suponer que queremos encontrar la ubicación idónea para, por ejemplo, un supermercado de la cadena El Jamón (he elegido El Jamón porque son en los que procuro comprar, ya que además de una excelente relación calidad-precio, son una empresa 100% Andaluza a la que hay que apoyar!!! ;))

Bromas aparte... Que otros factores deberíamos tener en cuenta si quisiéramos instalar un nuevo Jamón en Huelva? Seguramente uno de los más importantes es la población que hay en la zona. Desgraciadamente no disponemos de datos de población por debajo de nivel censal, que sería lo deseable. La Junta de Andalucía en la Rediam (Red de Información Ambiental de Andalucía) ofrece un shape a modo de cuadrículas con la densidad de población, pero las cuadrículas son demasiado grandes para el nivel de detalle que requerimos. Por tanto, que podemos hacer? Una posible solución que es por la que me he decantado, es la de usar la capa de "construidos" del catastro, en la que vienen todas las referencias catastrales existentes en cada edificio. Por tanto si hacemos un summarize en función de la referencia catastral, tendremos un nuevo campo en el que en teoría obtendremos el número de Divisiones Horizontales existentes para cada edificio. Por supuesto, tendremos el problema de los locales comerciales, plazas de garaje, etc. que también aparecerán, pero en cualquier caso siempre será mucho más preciso que la información de la Rediam, y además, al fin y al cabo lo que nos interesa es saber el volumen de población que se mueve por la zona, por tanto el contabilizar también plazas de garaje o locales comerciales no es algo que sea contrario a nuestro objetivo.

Como resultado podemos visualizar un mapa con las Divisiones Horizontales de cada edificio:



Para poder usar usar estos datos en nuestro Model Builder tenemos que pasar esta información a raster, para ello obtenemos los centroides de los edificios y hacemos posteriormente una interpolación espacial de esos valores, el resultado es un raster con las divisiones horizontales de la ciudad de Huelva, que en nuestro caso estamos empleando como sinónimo algo forzado de densidad de población. La idea una vez que tenemos este dato de población en raster es aplicarlo al modelo, para ello le aplicaremos una reclasificación en la que los nuevos valores serán los mismos que tenían los rasters de distancia (del 1 al 5 en mayor de menor a mayor densidad de población).



La verdad es que podríamos tomar muchos más parámetros más, como distancia a gasolineras, distancia a las principales vías de comunicación de la ciudad (capas existentes en el enlace del DERA puesto antes), existencia o no de zona azul, número de plazas de aparcamiento y un larguísimo etcétera, lo que nos permitiría el perfeccionar/complicar nuestro análisis tanto como quisiéramos. Lo bueno es que se podría aplicar un análisis más simple como el que estamos proponiendo aquí, y después, sobre las posibles zonas que salgan, volver a correr el modelo incluyendo más parámetros.

No obstante antes de finalizar vamos a tener en cuenta un último parámetro que también es de distancia y que en este caso será totalmente restrictivo. Se trata de eliminar totalmente las zonas que se encuentren a menos de un radio de 250 metros de algún otro supermercado, para ello vamos a realizar buffers de 250 metros a cada supermercado, aunque como estamos estudiando El Jamón tomaremos un radio de 500 metros para ellos (para no hacerse competencia a sí mismos). La idea es generar un shape de buffers o áreas de influencia que luego pasaremos a raster con un valor de 0 para multiplicarlo por el raster obtenido del proceso anterior y así eliminar del resultado esas áreas de influencia.
Los buffers podríamos generarlo en el Model Builder directamente, pero hemos decidido hacerlo manualmente. Podríamos hacerlo corriendo la herramienta en modo Batch (múltiple), para todos los supermercados, no obstante empleando la misma lógica de listas en pyhton usada antes en pygeocoder, hemos decidido hacerlo con un pequeño script.

Un buffer con arcpy sería así:

        arcpy.Buffer_analysis("shape_entrada", "shape_salida", distancia, "lado           de linea", "tipo de fin de linea", "tipo de dissolve")

Tendríamos que hacer esto para cada shape, o unirlos previamente, pero si los metemos todos en una lista podemos recorrerlos todos con un bucle for, lo único que necesitamos es crear previamente otra lista con los nombres de los shapes de salida. Al recorrer la lista podemos incluir una sentencia if/else para otorgar distintos valores de buffer a los supermercados El Jamón que al resto. El script y el resultado quedarían del siguiente modo:




Bien, pues ya con estos podemos finalizar nuestro modelo, en el que tendremos como datos de entrada los shapes de los supermercados que obtuvimos de las direcciones postales con pygeocoder, los buffers generados con Python y el raster de densidad de población obtenido a través de la interpolación de las divisiones horizontales de los edificios obtenidos de la capa del catastro.

El esquema del modelo sería el siguiente:




Vemos 2 grandes grupos de shapes de entrada que son los supermercados y los buffers, a los que posteriormente se le van haciendo las distintas reclasificaciones y sus combinaciones entre ellos a través de la calculadora raster. Finalmente se suma la capa de densidad de población y con las zonas resultantes se hace un clip a las parcelas y calles del catastro, para poder obtener un informe de por donde empezar a buscar posibles locales.

Una ves aplicado el modelo y eliminando del resultado las zonas destinadas a zonas verdes, hospitales, polígonos industriales y grandes zonas sin construir, el resultado queda del siguiente modo:

Zonas óptimas para la ubicación de un nuevo supermercado El Jamón en la ciudad de Huelva

Siguiendo la misma simbología, las zonas verdes son las que tendrían una menor valoración (dentro de que todas las que se muestran serían buenas zonas) a la hora de instalar un nuevo supermercado, y las rojas las de valoración más alta. De todos modos podemos elegir e la simbología del raster hacerlo por cuantiles y quedarnos solo con el 50% de las zonas en las que sería más conveniente ubicar un nuevo supermercado. Esto nos daría el siguiente resultado:



Como ya se ha dicho, la idea es obtener una relación de referencias catastrales y nombres de calles, para ello solo habría que pasar de raster a shape estas zonas y hacer un clip a las capas del catastro. Por suerte esto ya está hecho en nuestro Model Builder. El resultado, junto con el mapa, puede ser un informe con las calles y las referencias catastrales que entran dentro de esos tramos de calles.




En cualquier caso, esto es solo rayar la superficie y tan solo una pequeña muestra de lo que se puede hacer aplicando criterios espaciales a la localización de actividades.

Como se ha comentado, ahora podríamos hacer un raster de distancia a gasolineras, a las principales calles de la ciudad, digitalizar las plazas de parking de cada zona. O hacer ya trabajo de campo para, por ejemplo, hacer un conteo de la gente que pasa por las calles, o ver si hay pequeños comercios en las calles preseleccionadas. La ventaja fundamental es que ya sería un trabajo de campo de solo las calles previamente seleccionadas con criterios de "inteligencia espacial".

También pueden hacerse otros análisis interesantes, como por ejemplo sacar los polígonos de Thiessen que nos van a mostrar el área de influencia de cada supermercado, con la idea de hacer el mismo análisis con las nuevas ubicaciones posibles, para ver de que manera el área a cubrir por la instalación de una nueva tienda sería mayor.

Aquí vemos como quedan los polígonos de Thiessen en función de los supermercados existentes:


Y aquí vemos los valores de las áreas de dichos polígonos:



Como vemos los supermercados El Jamón son con diferencia los que abarcan una mayor de influencia en la ciudad de Huelva (5047363.25 metros cuadrados), siendo el resto de supermercados que más área de influencia ocupan en la ciudad Mercadona, Lidl, Dia y Carrefour.
Sería fácil por tanto, ubicar en el mapa posibles lugares para nuevos supermercados y volver a realizar este análisis.

Bueno, la verdad es que quería poner alguna cosa más, hacer la arctoolbox con un script y aplicarle un par de cosas más al análisis, pero como el post ya está quedando demasiado largo, creo que eso lo dejaré para más adelante, a ver si me animo a escribir de nuevo alguna entrada antes de que pasen otros 3 años.

Pues nada, aquí queda este post dedicado al amigo de las ondas portuguesas!

Saludos a todos y gracias por leerlo!