<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Cris</id>
		<title>stgo - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Cris"/>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Special:Contributions/Cris"/>
		<updated>2026-04-09T16:18:10Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.22.7</generator>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2017-08-04T15:42:10Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Características nuevas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike Model ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian &amp;amp; Transit Model ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y editamos el archivo wyp/views.py para que acepte los datos de Pedestrian:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
&lt;br /&gt;
def xml(request):&lt;br /&gt;
...&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y probamos como va funcionando con&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para Transit hay que seguir pasos similares a Pedestrian, observar el código para ver como queda configurado.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Finalmente el programa queda funcionando con muchos menos procesos y de forma más independiente, no requiere de una instalación de geoserver, tan solo Django Python, html, css y js.&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Gracias a Django fue posible crear un panel de administración para modificar ciertos valores dentro del código, además de agregar características nuevas que se explicarán a continuación:&lt;br /&gt;
&lt;br /&gt;
== Demographic group ==&lt;br /&gt;
&lt;br /&gt;
La idea es evaluar los POIs para distintos grupos demográficos, quien hace ese trabajo es la función de AggregationService.py, pero para que la petición llegue desde la interfaz también debe de llegarle a ManagementService.py, por lo que realizaremos estas modificaciones:&lt;br /&gt;
&lt;br /&gt;
Primero creamos el modelo de datos que contendrá a las opciones de grupos demográficos en la base de datos, para ello editamos el archivo wyp/models.py y agregamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.db import models&lt;br /&gt;
&lt;br /&gt;
class Demographic(models.Model):&lt;br /&gt;
	value = models.CharField(max_length=255)                #Nombre de la opcion demografica&lt;br /&gt;
	bank = models.CharField(max_length=255)                 #Pesos&lt;br /&gt;
	grocery = models.CharField(max_length=255)&lt;br /&gt;
	restaurant = models.CharField(max_length=255)&lt;br /&gt;
	shopping = models.CharField(max_length=255)&lt;br /&gt;
	entertainment = models.CharField(max_length=255)&lt;br /&gt;
	school = models.CharField(max_length=255)&lt;br /&gt;
	library = models.CharField(max_length=255)&lt;br /&gt;
	health = models.CharField(max_length=255)&lt;br /&gt;
	sum = models.FloatField(blank=True,default=0)           #Suma de los pesos anteriores&lt;br /&gt;
	score_factor = models.FloatField(blank=True,default=0)  #Valor de ponderacion&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.value&lt;br /&gt;
&lt;br /&gt;
        #Generar el resultado de sum y score_factor automaticamente al guardar&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		sumando = 0&lt;br /&gt;
		for i in ast.literal_eval(self.bank):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.grocery):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.restaurant):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.shopping):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.entertainment):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.school):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.library):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.health):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		self.sum = sumando&lt;br /&gt;
		self.score_factor = 100.0/float(sumando)&lt;br /&gt;
		super(Demographic,self).save(*args, **kwargs)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos este modelo al panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic&lt;br /&gt;
&lt;br /&gt;
admin.site.register(Demographic)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modificamos el archivo wyp/views.py para mandar estos datos a la vista html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  demographic = Demographic.objects.all()&lt;br /&gt;
  return render_to_response('index.html',{'demographic':demographic},context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego modificamos el archivo html que se encuentra en template para que éstos aparezcan dinámicamente como una lista de opciones. template/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Cycling Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_bike&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_bike&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_bike&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('bike')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_pedestrian&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_pedestrian&amp;quot; name=&amp;quot;start_point_pedestrian&amp;quot;&lt;br /&gt;
                           readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                        &amp;lt;div id=&amp;quot;walking_speed_pedestrian&amp;quot;&lt;br /&gt;
                             style=&amp;quot;width: 100px; height: 6px; margin:15px 10px auto 15px; display: inline-block;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
                        &amp;lt;span style=&amp;quot;font-size: 10px;&amp;quot;&amp;gt;Fast&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                &amp;lt;select id=&amp;quot;demographic_pedestrian&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_pedestrian&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('pedestrian')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Transit and Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_transit&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_transit&amp;quot; name=&amp;quot;start_point_transit&amp;quot; readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_transit&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                &lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('transit')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que estos valores sean reconocidos por el js que llama a la url /call_wps.php hay que modificar el archivo template/js/main.js para cada una de las opciones que se le agregó la opción demográfica&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function call_wps(approach){&lt;br /&gt;
    var start_point;&lt;br /&gt;
    ...&lt;br /&gt;
    var wps_call;&lt;br /&gt;
    var demographic;&lt;br /&gt;
&lt;br /&gt;
    switch (approach) {&lt;br /&gt;
        case &amp;quot;bike&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_bike').val();&lt;br /&gt;
            biking_time_period = $('#biking_time_period_amount').val();&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_bike').prop('checked');&lt;br /&gt;
            demographic = $('#demographic_bike option:selected').text();&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=bike&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;biking_time_period=&amp;quot; + biking_time_period + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;pedestrian&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_pedestrian').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_pedestrian').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_pedestrian').val();&lt;br /&gt;
            demographic = $('#demographic_pedestrian option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_pedestrian').prop('checked');&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=pedestrian&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;transit&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_transit').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_transit').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_transit').val();&lt;br /&gt;
            demographic = $('#demographic_transit option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_transit').prop('checked');&lt;br /&gt;
            walking_start_time = $('#walking_start_time').val() + &amp;quot;:00&amp;quot;;&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=transit&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_start_time=&amp;quot; + walking_start_time + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;bus_waiting_time=0&amp;amp;bus_riding_time=0&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Con ésto, ahora podemos recibir el valor escogido para la opción demográfica vía GET, por lo que ahora nos vamos a editar el archivo '''wyp/views.py''' para manejarlo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'transit':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic', default=None)&lt;br /&gt;
    return HttpResponse(managementTransit(start_point,walking_start_time,walking_time_period,walking_speed,bus_waiting_time,bus_riding_time, distance_decay_function,demographic))&lt;br /&gt;
  else:&lt;br /&gt;
  	return HttpResponse('')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos, ahora enviamos también la opción demográfica como nuevo parámetro de la función management* por lo que debemos modificar cada uno de ellos, de todas formas para todo es lo mismo por lo que solo se explicará el cambio realizado en Bike en el archivo '''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function,demographic):&lt;br /&gt;
    ...&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period,demographic)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente debemos editar el archivo en cuestión que nos retorna la puntuación, '''wyp/AggregationService.py'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from models import Demographic&lt;br /&gt;
&lt;br /&gt;
def aggregation(start_point, walkshed, crime_data, poi_data, distance_decay_function, walking_time_period,demographic):&lt;br /&gt;
    if poi_data != '&amp;quot;NULL&amp;quot;':&lt;br /&gt;
&lt;br /&gt;
        demographic_value = Demographic.objects.get(value=demographic)&lt;br /&gt;
&lt;br /&gt;
        poi_weights = {&amp;quot;Bank&amp;quot;: ast.literal_eval(demographic_value.bank),  #bank&lt;br /&gt;
                       &amp;quot;Grocery&amp;quot;: ast.literal_eval(demographic_value.grocery),  #grocery&lt;br /&gt;
                       &amp;quot;Restaurant&amp;quot;: ast.literal_eval(demographic_value.restaurant),  #restaurant and coffee&lt;br /&gt;
                       &amp;quot;Shopping&amp;quot;: ast.literal_eval(demographic_value.shopping),  #shopping&lt;br /&gt;
                       &amp;quot;Entertainment&amp;quot;: ast.literal_eval(demographic_value.entertainment),  #entertainment&lt;br /&gt;
                       &amp;quot;School&amp;quot;: ast.literal_eval(demographic_value.school),  #school&lt;br /&gt;
                       &amp;quot;Library&amp;quot;: ast.literal_eval(demographic_value.library),  #library&lt;br /&gt;
                       &amp;quot;Health&amp;quot;: ast.literal_eval(demographic_value.health)  #health&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entonces, para probar que todo esto funciona debemos ejecutar estos comandos desde la raíz del proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics  #por la midificacion de template/js/main.js&lt;br /&gt;
python manage.py makemigrations  # por la creacion del modelo Demographic&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alerta cuando uno de los servidores externos está caido ==&lt;br /&gt;
&lt;br /&gt;
Ha pasado que las VMs de OTP y de Overpass se caen por alguna razón o simplemente no parten correctamente lo que afecta directamente el funcionamiento de esta aplicación, para ello es importante saber cuál es la que está causando el problema, con ello necesitamos primero encontrar el error por lo que editaremos lo siguiente (nuevamente se mostrará con Bike, se realizó lo mismo con Pedestrian y Transit)&lt;br /&gt;
&lt;br /&gt;
En el archivo '''wyp/ManagementServiceBike.py''' agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    ...&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para generar la alerta lo haremos gracias a la ayuda del archivo '''template/js/main.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
        },&lt;br /&gt;
        success: function (data, status) {&lt;br /&gt;
            var wps_results = $.parseJSON(data);&lt;br /&gt;
&lt;br /&gt;
            var error_result = wps_results['error'];&lt;br /&gt;
            if (error_result){&lt;br /&gt;
                $.unblockUI();&lt;br /&gt;
                alert(error_result);&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de servidores de OTP y de overpass por panel de administración ==&lt;br /&gt;
&lt;br /&gt;
Una de las cosas principales que tiene Django es que cuenta con un panel de administración para poder editar la información de la base de datos o controlar ciertas configuraciones. En este caso crearemos un panel que permita intercambiar el servidor de OTP o de Overpass a cual queramos, para ello la guardaremos en la base de datos editando el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Server(models.Model):&lt;br /&gt;
	overpass = models.CharField(max_length=255,default='http://146.155.17.18:24080/api/interpreter')&lt;br /&gt;
	otp_bike = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochrone?&amp;amp;')&lt;br /&gt;
	otp_walk = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochroneOld?')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo agregamos al panel de administración agregando estas líneas en '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server&lt;br /&gt;
admin.site.register(Server)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos las siguientes líneas de comando para agregar la información a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py createsuperuser #crear un superusuario&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos ahora a la dirección http://localhost:8000/admin/ e ingresamos con el superusuario, entramos a Servers y creamos un elemento, los campos vendrán listos por lo que solo hay que guardar tal cual como sale.&lt;br /&gt;
&lt;br /&gt;
Luego editamos los archivos en donde se encuentra esta información&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_bike&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServicePedestrian.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceTransit.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/POIService.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = Server.objects.all()[0].overpass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análisis de muchos puntos mediante la subida de un archivo CSV ==&lt;br /&gt;
&lt;br /&gt;
Este trabajo se realiza netamente desde el panel de administración por lo que no se necesita de intervenir la interfaz. Se necesita de un sistema que reciba el archiv csv, lo lea línea por línea y lo analice según corresponda, la solución fue implementar un proceso extra (fuera de la interfaz) que realice el trabajo con tal de dejarlo funcionar toda la noche, por ejemplo.&lt;br /&gt;
&lt;br /&gt;
Como lo queremos ver en el panel de administración necesitamos crearle un modelo, para ello editamos nuevamente el archivo '''wyp/models.py''' agregando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
TYPES_OF_ANALYSYS = (&lt;br /&gt;
		('Bike','Cycling Model'),&lt;br /&gt;
		('Walk','Walking Model'),&lt;br /&gt;
		('Transit','Transit &amp;amp; Walking Model')&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
class Multiple_point_analysis(models.Model):&lt;br /&gt;
	csv_upload = models.FileField(upload_to='csv_uploads/')&lt;br /&gt;
	type_of_analysis = models.CharField(max_length=10,choices=TYPES_OF_ANALYSYS)&lt;br /&gt;
	demographic_group = models.ForeignKey(Demographic)&lt;br /&gt;
	analysed_pointset = models.BooleanField(default=False,blank=True,editable=False)&lt;br /&gt;
	results = models.FileField(upload_to='results/', blank=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.csv_upload.url.split('csv_uploads/')[-1]&lt;br /&gt;
&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		super(Multiple_point_analysis,self).save(*args, **kwargs)&lt;br /&gt;
		if not self.analysed_pointset:&lt;br /&gt;
			subprocess.Popen(shlex.split('python manage.py mass_analysis -i '+str(self.id)))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo mostramos en el panel editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis&lt;br /&gt;
admin.site.register(Multiple_point_analysis)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Además debemos agregar toda la siguiente rama de archivos:&lt;br /&gt;
* wyp/&lt;br /&gt;
** management/&lt;br /&gt;
*** __init__.py&lt;br /&gt;
*** commands/&lt;br /&gt;
**** __init__.py&lt;br /&gt;
**** _private.py&lt;br /&gt;
**** mass_analysis.py&lt;br /&gt;
&lt;br /&gt;
En donde ambos __init__.py y _private.py son archivos vacíos, management y commands carpetas y mass_analysis.py nuestra función que analizará el archivo csv. Entonces construimos el archivo '''wyp/management/commands/mass_analysis.py''' agregando las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wypdjango import settings&lt;br /&gt;
from wyp.models import Multiple_point_analysis&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
from wyp.ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
from wyp.ManagementServiceTransit import management as managementTransit&lt;br /&gt;
from django.core.files import File&lt;br /&gt;
import json&lt;br /&gt;
from time import time&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
	help = &amp;quot;Performs mass analysis from a csv file.\nIt requires id model to analyze.&amp;quot;&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-i',action='store',&lt;br /&gt;
				dest='i',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='id of the csv file in the model'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		csv_model = options['i']&lt;br /&gt;
		csv_model = Multiple_point_analysis.objects.get(id=int(csv_model))&lt;br /&gt;
&lt;br /&gt;
		filename = csv_model.csv_upload.url.split('/media/')[-1]&lt;br /&gt;
&lt;br /&gt;
		url = settings.MEDIA_ROOT + filename&lt;br /&gt;
&lt;br /&gt;
		csv = open(url,'r')&lt;br /&gt;
		lines = csv.read().split('\n')&lt;br /&gt;
		csv.close()&lt;br /&gt;
&lt;br /&gt;
		temp = open('/tmp/analysis_from_wyp.csv','w')&lt;br /&gt;
		temp.write('id;x;y;score;area;time;POI count;\n')&lt;br /&gt;
&lt;br /&gt;
		id_result = 1&lt;br /&gt;
&lt;br /&gt;
		try:&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Bike':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;biking_time_period;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+','+aux[2]&lt;br /&gt;
						biking_time_period = aux[3]&lt;br /&gt;
						distance_decay_function = aux[4]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementBike(start_point,biking_time_period,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result)+';'+aux[1]+';'+aux[2]+';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Walk':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						#aux = id;x;y;walking_time_period;walking_speed;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+';'+aux[2]&lt;br /&gt;
						walking_time_period = aux[3]&lt;br /&gt;
						walking_speed = aux[4]&lt;br /&gt;
						distance_decay_function = aux[5]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementPedestrian(start_point, walking_time_period, walking_speed, distance_decay_function, csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
			if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;start_time;walking_time_period;walking_speed;bus_waiting_time;bus_ride_time;distance_decay_function&lt;br /&gt;
						start_point = aux[1] + ';' + aux[2]&lt;br /&gt;
						start_time_transit = aux[3]&lt;br /&gt;
						walking_time_period = aux[4]&lt;br /&gt;
						walking_speed = aux[5]&lt;br /&gt;
						#bus_waiting_time = aux[6]&lt;br /&gt;
						bus_waiting_time = '0'&lt;br /&gt;
						#bus_ride_time = aux[7]&lt;br /&gt;
						bus_ride_time = '0'&lt;br /&gt;
						distance_decay_function = aux[6]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementTransit(start_point,start_time_transit,walking_time_period,walking_speed,bus_waiting_time,bus_ride_time,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
		except Exception as e:&lt;br /&gt;
			pass&lt;br /&gt;
&lt;br /&gt;
		#Pendiente!!!!!&lt;br /&gt;
		if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
			management(start_point, start_time, walking_time_period, walking_speed, bus_waiting_time, bus_ride_time, distance_decay_function)&lt;br /&gt;
			pass			&lt;br /&gt;
&lt;br /&gt;
		temp.close()&lt;br /&gt;
&lt;br /&gt;
		csv_model.analysed_pointset = True&lt;br /&gt;
		csv_model.results.save('results/' + csv_model.csv_upload.name.split('csv_uploads/')[-1] + '.csv', File(open('/tmp/analysis_from_wyp.csv')))&lt;br /&gt;
		csv_model.save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecuntamos estas líneas de comando para agregar el modelo a la base de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos a http://localhost:8000/admin y nos encontraremos con la opción de Multiple_point_analysis en donde tenemos que hacer click en &amp;quot;add multiple_point_analysis&amp;quot;. Llenamos los campos que se encuentran en negrita y apretamos en &amp;quot;SAVE&amp;quot;. Esperamos a que finalice (~15 segundos por línea de CSV) y los resultados estarán en el campo &amp;quot;Results&amp;quot; como archivo csv para descargar.&lt;br /&gt;
&lt;br /&gt;
=== UPDATE Paralelización ===&lt;br /&gt;
&lt;br /&gt;
Al analizar la ciudad de Santiago con un archivo CSV, éste tardaba cerca de 23 horas en completar más de 52000 puntos, por lo que se decidió usar paralelización para utilizar todo el rendimiento de la VM. Para ello se utilizaron los librerías de Python '''threading''' y '''Queue'''. El código cambió en las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import threadint&lt;br /&gt;
import Queue&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Bike':&lt;br /&gt;
				args_list = list()&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						start_point = aux[1]+','+aux[2]&lt;br /&gt;
						biking_time_period = aux[3]&lt;br /&gt;
						distance_decay_function = aux[4]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						args_list.append([start_point,biking_time_period,distance_decay_function,csv_model.demographic_group.value,csv_model.escenario.id,start_time])&lt;br /&gt;
                                                if len(args_list)==40 or lines.index(line) == len(lines)-1:&lt;br /&gt;
                                                        process_list = list()&lt;br /&gt;
                                                        queue_list = list()&lt;br /&gt;
                                                        for arg in args_list:&lt;br /&gt;
                                                                q = Queue.Queue()&lt;br /&gt;
                                                                process = threading.Thread(target=text_from_bike, args=arg+[q])&lt;br /&gt;
                                                                process.start()&lt;br /&gt;
                                                                process_list.append(process)&lt;br /&gt;
                                                                queue_list.append(q)&lt;br /&gt;
                                                        args_list = list()&lt;br /&gt;
                                                        for process in process_list:&lt;br /&gt;
                                                                process.join()&lt;br /&gt;
                                                        for queue in queue_list:&lt;br /&gt;
                                                                text = queue.get()&lt;br /&gt;
                                                                temp.write(text)&lt;br /&gt;
                                                                logging.info(text.strip('\n'))&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El cambio en los otros modos es similar. El gran cambio de esta metodología es que crea grupos de 40 pequeños programas que solo se encargan de realizar la evaluación, éste recupera todos estos resultados y después ejecuta otros 40, con ésto el tiempo se reduce considerablemente, ya que habían puntos que tardaban solo 1 segundo en tener respuesta como otros más de 10. Por cada 40 puntos a analizar el nuevo tiempo corresponde a la duración del que tarde más. En otras palabras, si el grupo de 40 puntos son de score 0 y tardan menos de 1 segundo en ser analizados, el tiempo será menos de 1 segundo para todo el grupo en comparación a los respectivos 40 que sería analizar uno a uno.&lt;br /&gt;
&lt;br /&gt;
== Sistema de Log para análisis de archivos CSV ==&lt;br /&gt;
&lt;br /&gt;
Como no se sabe si de verdad está funcionando o hay problemas de por medio al momento de analizar un archivo CSV, se creó un sistema de log que nos permita saber que es lo que está sucediendo. Para ello lo creamos como proceso al igual que el análisis del archivo. por lo que creamos el archivo '''wyp/management/commands/log.py''' y le agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wyp.models import Log_wyp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
&lt;br /&gt;
	help = &amp;quot;Save logs to the system&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-l',action='store',&lt;br /&gt;
				dest='l',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='message log'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		message = options['l']&lt;br /&gt;
&lt;br /&gt;
		if message != '':&lt;br /&gt;
			if len(message)&amp;gt;255:&lt;br /&gt;
				Log_wyp(log=message[:255]).save()&lt;br /&gt;
			else:&lt;br /&gt;
				Log_wyp(log=message).save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos el modelo en el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Log_wyp(models.Model):&lt;br /&gt;
	log = models.CharField(max_length=255,default='')&lt;br /&gt;
	created = models.DateTimeField(auto_now_add=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return str(self.created.strftime('%Y-%m-%d %H:%M:%S')) + ' ' +self.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo mostramos en el panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis, Log_wyp&lt;br /&gt;
admin.site.register(Log_wyp)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos los comandos para agregar el modelo a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ahora, para poder agregar cualquier log lo podemos hacer ejecutando el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py log -l &amp;quot;Mensaje a registrar&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que, por ejemplo, al integrarlo al archivo '''wyp/management/commands/mass_analysis.py''' se realizó lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
subprocess.Popen(shlex.split('python manage.py log -l &amp;quot;' + filename + ' Starting analysis&amp;quot;'))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de frecuencia de buses editando el archivo GTFS de Santiago ==&lt;br /&gt;
&lt;br /&gt;
Se trabaja actualmente en la construcción de una herramienta que permia cambiar las frecuencias de las líneas de buses y metro de la ciudad de Santiago con el objetivo de poder analizar los cambios de accesibilidad urbana derivadas de ésto. Con ello, en Django Python, se cargó en una base de datos SQLite (aparte de la que ya utiliza Django) el GTFS de los datos de la ciudad en cuestión gracias al módulo pygtfs. Para utilizar sus datos solo basta con llamarlos con sus funciones.&lt;br /&gt;
&lt;br /&gt;
Con ello, las frecuencias de los recorridos se encuentran en el archivo frequencies.txt dentro del archivo comprimido GTFS.zip. Con el módulo pygtfs previamente configurado se pueden llamar dichos datos con los comandos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
sched = pygtfs.Schedule(MEDIA_ROOT + 'gtfs.sqlite')&lt;br /&gt;
frequencies = sched.frequencies&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
generando en '''frequencies''' una lista con todas las frecuencias y los datos adjuntos que podemos ver en el mismo archivo de texto pero como objeto python.&lt;br /&gt;
&lt;br /&gt;
Luego se creó una vista en [http://146.155.17.19:17080/gtfs/update_frequencies] en donde encontraremos un espacio de selección de viaje identificado por su ID en la cual al ser seleccionada se desplegará su información, tal como su hora de inicio, hora de fin y su frecuencia de salida, este último en un campo editable. Cuando ya cambiamos este valor, podemos guardar este dato en una lista de futuros datos para ser actualizados, la cual la podemos ver en la zona inferior de este formulario. Ésta lista puede ser tan grande como SQLite aguante.&lt;br /&gt;
&lt;br /&gt;
Para construir esta lista, se debió de crear una copia de los modelos que hay en pygtfs en la base de datos local de Django manteniendo solo los datos que se desean cambiar, al ser eliminados de la lista también son eliminados de la base de datos para evitar que éste se llene o cause algún tipo de inconveniente.&lt;br /&gt;
&lt;br /&gt;
Ya cuando tengamos todos nuestros cambios guardados, apretamos en el botón de '''Actualizar GTFS'''. Éste proceso puede llegar a tardar entre 7 a 8 minutos en ser completado, por lo que el botón se bloqueará durante este tiempo. Una vez finalizado debemos dirigirnos al panel de administración para cambiar el router de evaluación y utilizar el que acabamos de construir. Para ello se entra a [http://146.155.17.19:17080/admin/wyp/server/1/change/] y se modifica la URL en cuestion para cambiar '''/routers/&amp;lt;texto-a-cambiar&amp;gt;/isochrone?''' por '''/routers/WYP/isochrone?'''. Una vez realizado este cambio podemos efectuar las consultas con nuestras nuevas frecuencias de buses.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que este proceso es temporal mientras no se construya un front-end ideal, ésta herramienta se construyó de esta forma para probar su funcionalidad y no garantiza lo más óptimo.&lt;br /&gt;
&lt;br /&gt;
== API REST para obtener datos del archivo de frecuencia de buses ==&lt;br /&gt;
&lt;br /&gt;
Para que el putno anterior de esta documentación funcione correctamente, fue necesario que se creara una API REST que nos permita obtener datos de las frecuencias mientras que por GET le enviemos la ID correspondiente al tramo a evaluar. En otras palabras, debemos ingresar una URL como ésta [http://146.155.17.19:17080/gtfs/frec_REST?f=101-I-S_V25-B14] y obtendremos un objeto Json con la información en cuestión.&lt;br /&gt;
&lt;br /&gt;
== Sistema de análisis multiple de forma visual ==&lt;br /&gt;
&lt;br /&gt;
Se agregó la opción '''Mapping bbox''', el cual permite analizar el recuadro que vemos en el mapa con múltiples puntos. Al abrir esta opción nos encontramos con la selección del método de viaje que deseamos evaluar, la opción demográfica y la cantidad de puntos que deseamos procesar para obtener un mapeo de los resultados. Para este proceso se utilizó la parametrización, es decir, si se deciden evaluar con 3 puntos horizontales y 3 verticales, los 9 sectores a evaluar se realizan todos a la vez, por lo que mientras más puntos a evaluar, más carga para la VM.&lt;br /&gt;
&lt;br /&gt;
Los resultados son mostrados en el mapa de forma de colores, el blanco representa score 0 y verde un score de 100.&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
El código se puede encontrar acá: http://146.155.17.14:18080/csfuente/wyp-django/ y se encuentra funcionando en http://146.155.17.19:17080/&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2017-08-04T15:38:08Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Análisis de muchos puntos mediante la subida de un archivo CSV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike Model ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian &amp;amp; Transit Model ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y editamos el archivo wyp/views.py para que acepte los datos de Pedestrian:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
&lt;br /&gt;
def xml(request):&lt;br /&gt;
...&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y probamos como va funcionando con&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para Transit hay que seguir pasos similares a Pedestrian, observar el código para ver como queda configurado.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Finalmente el programa queda funcionando con muchos menos procesos y de forma más independiente, no requiere de una instalación de geoserver, tan solo Django Python, html, css y js.&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Gracias a Django fue posible crear un panel de administración para modificar ciertos valores dentro del código, además de agregar características nuevas que se explicarán a continuación:&lt;br /&gt;
&lt;br /&gt;
== Demographic group ==&lt;br /&gt;
&lt;br /&gt;
La idea es evaluar los POIs para distintos grupos demográficos, quien hace ese trabajo es la función de AggregationService.py, pero para que la petición llegue desde la interfaz también debe de llegarle a ManagementService.py, por lo que realizaremos estas modificaciones:&lt;br /&gt;
&lt;br /&gt;
Primero creamos el modelo de datos que contendrá a las opciones de grupos demográficos en la base de datos, para ello editamos el archivo wyp/models.py y agregamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.db import models&lt;br /&gt;
&lt;br /&gt;
class Demographic(models.Model):&lt;br /&gt;
	value = models.CharField(max_length=255)                #Nombre de la opcion demografica&lt;br /&gt;
	bank = models.CharField(max_length=255)                 #Pesos&lt;br /&gt;
	grocery = models.CharField(max_length=255)&lt;br /&gt;
	restaurant = models.CharField(max_length=255)&lt;br /&gt;
	shopping = models.CharField(max_length=255)&lt;br /&gt;
	entertainment = models.CharField(max_length=255)&lt;br /&gt;
	school = models.CharField(max_length=255)&lt;br /&gt;
	library = models.CharField(max_length=255)&lt;br /&gt;
	health = models.CharField(max_length=255)&lt;br /&gt;
	sum = models.FloatField(blank=True,default=0)           #Suma de los pesos anteriores&lt;br /&gt;
	score_factor = models.FloatField(blank=True,default=0)  #Valor de ponderacion&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.value&lt;br /&gt;
&lt;br /&gt;
        #Generar el resultado de sum y score_factor automaticamente al guardar&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		sumando = 0&lt;br /&gt;
		for i in ast.literal_eval(self.bank):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.grocery):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.restaurant):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.shopping):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.entertainment):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.school):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.library):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.health):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		self.sum = sumando&lt;br /&gt;
		self.score_factor = 100.0/float(sumando)&lt;br /&gt;
		super(Demographic,self).save(*args, **kwargs)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos este modelo al panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic&lt;br /&gt;
&lt;br /&gt;
admin.site.register(Demographic)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modificamos el archivo wyp/views.py para mandar estos datos a la vista html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  demographic = Demographic.objects.all()&lt;br /&gt;
  return render_to_response('index.html',{'demographic':demographic},context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego modificamos el archivo html que se encuentra en template para que éstos aparezcan dinámicamente como una lista de opciones. template/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Cycling Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_bike&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_bike&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_bike&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('bike')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_pedestrian&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_pedestrian&amp;quot; name=&amp;quot;start_point_pedestrian&amp;quot;&lt;br /&gt;
                           readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                        &amp;lt;div id=&amp;quot;walking_speed_pedestrian&amp;quot;&lt;br /&gt;
                             style=&amp;quot;width: 100px; height: 6px; margin:15px 10px auto 15px; display: inline-block;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
                        &amp;lt;span style=&amp;quot;font-size: 10px;&amp;quot;&amp;gt;Fast&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                &amp;lt;select id=&amp;quot;demographic_pedestrian&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_pedestrian&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('pedestrian')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Transit and Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_transit&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_transit&amp;quot; name=&amp;quot;start_point_transit&amp;quot; readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_transit&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                &lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('transit')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que estos valores sean reconocidos por el js que llama a la url /call_wps.php hay que modificar el archivo template/js/main.js para cada una de las opciones que se le agregó la opción demográfica&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function call_wps(approach){&lt;br /&gt;
    var start_point;&lt;br /&gt;
    ...&lt;br /&gt;
    var wps_call;&lt;br /&gt;
    var demographic;&lt;br /&gt;
&lt;br /&gt;
    switch (approach) {&lt;br /&gt;
        case &amp;quot;bike&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_bike').val();&lt;br /&gt;
            biking_time_period = $('#biking_time_period_amount').val();&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_bike').prop('checked');&lt;br /&gt;
            demographic = $('#demographic_bike option:selected').text();&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=bike&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;biking_time_period=&amp;quot; + biking_time_period + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;pedestrian&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_pedestrian').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_pedestrian').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_pedestrian').val();&lt;br /&gt;
            demographic = $('#demographic_pedestrian option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_pedestrian').prop('checked');&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=pedestrian&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;transit&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_transit').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_transit').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_transit').val();&lt;br /&gt;
            demographic = $('#demographic_transit option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_transit').prop('checked');&lt;br /&gt;
            walking_start_time = $('#walking_start_time').val() + &amp;quot;:00&amp;quot;;&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=transit&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_start_time=&amp;quot; + walking_start_time + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;bus_waiting_time=0&amp;amp;bus_riding_time=0&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Con ésto, ahora podemos recibir el valor escogido para la opción demográfica vía GET, por lo que ahora nos vamos a editar el archivo '''wyp/views.py''' para manejarlo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'transit':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic', default=None)&lt;br /&gt;
    return HttpResponse(managementTransit(start_point,walking_start_time,walking_time_period,walking_speed,bus_waiting_time,bus_riding_time, distance_decay_function,demographic))&lt;br /&gt;
  else:&lt;br /&gt;
  	return HttpResponse('')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos, ahora enviamos también la opción demográfica como nuevo parámetro de la función management* por lo que debemos modificar cada uno de ellos, de todas formas para todo es lo mismo por lo que solo se explicará el cambio realizado en Bike en el archivo '''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function,demographic):&lt;br /&gt;
    ...&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period,demographic)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente debemos editar el archivo en cuestión que nos retorna la puntuación, '''wyp/AggregationService.py'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from models import Demographic&lt;br /&gt;
&lt;br /&gt;
def aggregation(start_point, walkshed, crime_data, poi_data, distance_decay_function, walking_time_period,demographic):&lt;br /&gt;
    if poi_data != '&amp;quot;NULL&amp;quot;':&lt;br /&gt;
&lt;br /&gt;
        demographic_value = Demographic.objects.get(value=demographic)&lt;br /&gt;
&lt;br /&gt;
        poi_weights = {&amp;quot;Bank&amp;quot;: ast.literal_eval(demographic_value.bank),  #bank&lt;br /&gt;
                       &amp;quot;Grocery&amp;quot;: ast.literal_eval(demographic_value.grocery),  #grocery&lt;br /&gt;
                       &amp;quot;Restaurant&amp;quot;: ast.literal_eval(demographic_value.restaurant),  #restaurant and coffee&lt;br /&gt;
                       &amp;quot;Shopping&amp;quot;: ast.literal_eval(demographic_value.shopping),  #shopping&lt;br /&gt;
                       &amp;quot;Entertainment&amp;quot;: ast.literal_eval(demographic_value.entertainment),  #entertainment&lt;br /&gt;
                       &amp;quot;School&amp;quot;: ast.literal_eval(demographic_value.school),  #school&lt;br /&gt;
                       &amp;quot;Library&amp;quot;: ast.literal_eval(demographic_value.library),  #library&lt;br /&gt;
                       &amp;quot;Health&amp;quot;: ast.literal_eval(demographic_value.health)  #health&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entonces, para probar que todo esto funciona debemos ejecutar estos comandos desde la raíz del proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics  #por la midificacion de template/js/main.js&lt;br /&gt;
python manage.py makemigrations  # por la creacion del modelo Demographic&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alerta cuando uno de los servidores externos está caido ==&lt;br /&gt;
&lt;br /&gt;
Ha pasado que las VMs de OTP y de Overpass se caen por alguna razón o simplemente no parten correctamente lo que afecta directamente el funcionamiento de esta aplicación, para ello es importante saber cuál es la que está causando el problema, con ello necesitamos primero encontrar el error por lo que editaremos lo siguiente (nuevamente se mostrará con Bike, se realizó lo mismo con Pedestrian y Transit)&lt;br /&gt;
&lt;br /&gt;
En el archivo '''wyp/ManagementServiceBike.py''' agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    ...&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para generar la alerta lo haremos gracias a la ayuda del archivo '''template/js/main.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
        },&lt;br /&gt;
        success: function (data, status) {&lt;br /&gt;
            var wps_results = $.parseJSON(data);&lt;br /&gt;
&lt;br /&gt;
            var error_result = wps_results['error'];&lt;br /&gt;
            if (error_result){&lt;br /&gt;
                $.unblockUI();&lt;br /&gt;
                alert(error_result);&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de servidores de OTP y de overpass por panel de administración ==&lt;br /&gt;
&lt;br /&gt;
Una de las cosas principales que tiene Django es que cuenta con un panel de administración para poder editar la información de la base de datos o controlar ciertas configuraciones. En este caso crearemos un panel que permita intercambiar el servidor de OTP o de Overpass a cual queramos, para ello la guardaremos en la base de datos editando el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Server(models.Model):&lt;br /&gt;
	overpass = models.CharField(max_length=255,default='http://146.155.17.18:24080/api/interpreter')&lt;br /&gt;
	otp_bike = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochrone?&amp;amp;')&lt;br /&gt;
	otp_walk = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochroneOld?')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo agregamos al panel de administración agregando estas líneas en '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server&lt;br /&gt;
admin.site.register(Server)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos las siguientes líneas de comando para agregar la información a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py createsuperuser #crear un superusuario&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos ahora a la dirección http://localhost:8000/admin/ e ingresamos con el superusuario, entramos a Servers y creamos un elemento, los campos vendrán listos por lo que solo hay que guardar tal cual como sale.&lt;br /&gt;
&lt;br /&gt;
Luego editamos los archivos en donde se encuentra esta información&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_bike&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServicePedestrian.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceTransit.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/POIService.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = Server.objects.all()[0].overpass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análisis de muchos puntos mediante la subida de un archivo CSV ==&lt;br /&gt;
&lt;br /&gt;
Este trabajo se realiza netamente desde el panel de administración por lo que no se necesita de intervenir la interfaz. Se necesita de un sistema que reciba el archiv csv, lo lea línea por línea y lo analice según corresponda, la solución fue implementar un proceso extra (fuera de la interfaz) que realice el trabajo con tal de dejarlo funcionar toda la noche, por ejemplo.&lt;br /&gt;
&lt;br /&gt;
Como lo queremos ver en el panel de administración necesitamos crearle un modelo, para ello editamos nuevamente el archivo '''wyp/models.py''' agregando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
TYPES_OF_ANALYSYS = (&lt;br /&gt;
		('Bike','Cycling Model'),&lt;br /&gt;
		('Walk','Walking Model'),&lt;br /&gt;
		('Transit','Transit &amp;amp; Walking Model')&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
class Multiple_point_analysis(models.Model):&lt;br /&gt;
	csv_upload = models.FileField(upload_to='csv_uploads/')&lt;br /&gt;
	type_of_analysis = models.CharField(max_length=10,choices=TYPES_OF_ANALYSYS)&lt;br /&gt;
	demographic_group = models.ForeignKey(Demographic)&lt;br /&gt;
	analysed_pointset = models.BooleanField(default=False,blank=True,editable=False)&lt;br /&gt;
	results = models.FileField(upload_to='results/', blank=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.csv_upload.url.split('csv_uploads/')[-1]&lt;br /&gt;
&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		super(Multiple_point_analysis,self).save(*args, **kwargs)&lt;br /&gt;
		if not self.analysed_pointset:&lt;br /&gt;
			subprocess.Popen(shlex.split('python manage.py mass_analysis -i '+str(self.id)))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo mostramos en el panel editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis&lt;br /&gt;
admin.site.register(Multiple_point_analysis)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Además debemos agregar toda la siguiente rama de archivos:&lt;br /&gt;
* wyp/&lt;br /&gt;
** management/&lt;br /&gt;
*** __init__.py&lt;br /&gt;
*** commands/&lt;br /&gt;
**** __init__.py&lt;br /&gt;
**** _private.py&lt;br /&gt;
**** mass_analysis.py&lt;br /&gt;
&lt;br /&gt;
En donde ambos __init__.py y _private.py son archivos vacíos, management y commands carpetas y mass_analysis.py nuestra función que analizará el archivo csv. Entonces construimos el archivo '''wyp/management/commands/mass_analysis.py''' agregando las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wypdjango import settings&lt;br /&gt;
from wyp.models import Multiple_point_analysis&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
from wyp.ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
from wyp.ManagementServiceTransit import management as managementTransit&lt;br /&gt;
from django.core.files import File&lt;br /&gt;
import json&lt;br /&gt;
from time import time&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
	help = &amp;quot;Performs mass analysis from a csv file.\nIt requires id model to analyze.&amp;quot;&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-i',action='store',&lt;br /&gt;
				dest='i',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='id of the csv file in the model'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		csv_model = options['i']&lt;br /&gt;
		csv_model = Multiple_point_analysis.objects.get(id=int(csv_model))&lt;br /&gt;
&lt;br /&gt;
		filename = csv_model.csv_upload.url.split('/media/')[-1]&lt;br /&gt;
&lt;br /&gt;
		url = settings.MEDIA_ROOT + filename&lt;br /&gt;
&lt;br /&gt;
		csv = open(url,'r')&lt;br /&gt;
		lines = csv.read().split('\n')&lt;br /&gt;
		csv.close()&lt;br /&gt;
&lt;br /&gt;
		temp = open('/tmp/analysis_from_wyp.csv','w')&lt;br /&gt;
		temp.write('id;x;y;score;area;time;POI count;\n')&lt;br /&gt;
&lt;br /&gt;
		id_result = 1&lt;br /&gt;
&lt;br /&gt;
		try:&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Bike':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;biking_time_period;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+','+aux[2]&lt;br /&gt;
						biking_time_period = aux[3]&lt;br /&gt;
						distance_decay_function = aux[4]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementBike(start_point,biking_time_period,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result)+';'+aux[1]+';'+aux[2]+';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Walk':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						#aux = id;x;y;walking_time_period;walking_speed;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+';'+aux[2]&lt;br /&gt;
						walking_time_period = aux[3]&lt;br /&gt;
						walking_speed = aux[4]&lt;br /&gt;
						distance_decay_function = aux[5]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementPedestrian(start_point, walking_time_period, walking_speed, distance_decay_function, csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
			if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;start_time;walking_time_period;walking_speed;bus_waiting_time;bus_ride_time;distance_decay_function&lt;br /&gt;
						start_point = aux[1] + ';' + aux[2]&lt;br /&gt;
						start_time_transit = aux[3]&lt;br /&gt;
						walking_time_period = aux[4]&lt;br /&gt;
						walking_speed = aux[5]&lt;br /&gt;
						#bus_waiting_time = aux[6]&lt;br /&gt;
						bus_waiting_time = '0'&lt;br /&gt;
						#bus_ride_time = aux[7]&lt;br /&gt;
						bus_ride_time = '0'&lt;br /&gt;
						distance_decay_function = aux[6]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementTransit(start_point,start_time_transit,walking_time_period,walking_speed,bus_waiting_time,bus_ride_time,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
		except Exception as e:&lt;br /&gt;
			pass&lt;br /&gt;
&lt;br /&gt;
		#Pendiente!!!!!&lt;br /&gt;
		if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
			management(start_point, start_time, walking_time_period, walking_speed, bus_waiting_time, bus_ride_time, distance_decay_function)&lt;br /&gt;
			pass			&lt;br /&gt;
&lt;br /&gt;
		temp.close()&lt;br /&gt;
&lt;br /&gt;
		csv_model.analysed_pointset = True&lt;br /&gt;
		csv_model.results.save('results/' + csv_model.csv_upload.name.split('csv_uploads/')[-1] + '.csv', File(open('/tmp/analysis_from_wyp.csv')))&lt;br /&gt;
		csv_model.save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecuntamos estas líneas de comando para agregar el modelo a la base de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos a http://localhost:8000/admin y nos encontraremos con la opción de Multiple_point_analysis en donde tenemos que hacer click en &amp;quot;add multiple_point_analysis&amp;quot;. Llenamos los campos que se encuentran en negrita y apretamos en &amp;quot;SAVE&amp;quot;. Esperamos a que finalice (~15 segundos por línea de CSV) y los resultados estarán en el campo &amp;quot;Results&amp;quot; como archivo csv para descargar.&lt;br /&gt;
&lt;br /&gt;
=== UPDATE Paralelización ===&lt;br /&gt;
&lt;br /&gt;
Al analizar la ciudad de Santiago con un archivo CSV, éste tardaba cerca de 23 horas en completar más de 52000 puntos, por lo que se decidió usar paralelización para utilizar todo el rendimiento de la VM. Para ello se utilizaron los librerías de Python '''threading''' y '''Queue'''. El código cambió en las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import threadint&lt;br /&gt;
import Queue&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Bike':&lt;br /&gt;
				args_list = list()&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						start_point = aux[1]+','+aux[2]&lt;br /&gt;
						biking_time_period = aux[3]&lt;br /&gt;
						distance_decay_function = aux[4]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						args_list.append([start_point,biking_time_period,distance_decay_function,csv_model.demographic_group.value,csv_model.escenario.id,start_time])&lt;br /&gt;
                                                if len(args_list)==40 or lines.index(line) == len(lines)-1:&lt;br /&gt;
                                                        process_list = list()&lt;br /&gt;
                                                        queue_list = list()&lt;br /&gt;
                                                        for arg in args_list:&lt;br /&gt;
                                                                q = Queue.Queue()&lt;br /&gt;
                                                                process = threading.Thread(target=text_from_bike, args=arg+[q])&lt;br /&gt;
                                                                process.start()&lt;br /&gt;
                                                                process_list.append(process)&lt;br /&gt;
                                                                queue_list.append(q)&lt;br /&gt;
                                                        args_list = list()&lt;br /&gt;
                                                        for process in process_list:&lt;br /&gt;
                                                                process.join()&lt;br /&gt;
                                                        for queue in queue_list:&lt;br /&gt;
                                                                text = queue.get()&lt;br /&gt;
                                                                temp.write(text)&lt;br /&gt;
                                                                logging.info(text.strip('\n'))&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El cambio en los otros modos es similar. El gran cambio de esta metodología es que crea grupos de 40 pequeños programas que solo se encargan de realizar la evaluación, éste recupera todos estos resultados y después ejecuta otros 40, con ésto el tiempo se reduce considerablemente, ya que habían puntos que tardaban solo 1 segundo en tener respuesta como otros más de 10. Por cada 40 puntos a analizar el nuevo tiempo corresponde a la duración del que tarde más. En otras palabras, si el grupo de 40 puntos son de score 0 y tardan menos de 1 segundo en ser analizados, el tiempo será menos de 1 segundo para todo el grupo en comparación a los respectivos 40 que sería analizar uno a uno.&lt;br /&gt;
&lt;br /&gt;
== Sistema de Log para análisis de archivos CSV ==&lt;br /&gt;
&lt;br /&gt;
Como no se sabe si de verdad está funcionando o hay problemas de por medio al momento de analizar un archivo CSV, se creó un sistema de log que nos permita saber que es lo que está sucediendo. Para ello lo creamos como proceso al igual que el análisis del archivo. por lo que creamos el archivo '''wyp/management/commands/log.py''' y le agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wyp.models import Log_wyp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
&lt;br /&gt;
	help = &amp;quot;Save logs to the system&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-l',action='store',&lt;br /&gt;
				dest='l',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='message log'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		message = options['l']&lt;br /&gt;
&lt;br /&gt;
		if message != '':&lt;br /&gt;
			if len(message)&amp;gt;255:&lt;br /&gt;
				Log_wyp(log=message[:255]).save()&lt;br /&gt;
			else:&lt;br /&gt;
				Log_wyp(log=message).save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos el modelo en el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Log_wyp(models.Model):&lt;br /&gt;
	log = models.CharField(max_length=255,default='')&lt;br /&gt;
	created = models.DateTimeField(auto_now_add=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return str(self.created.strftime('%Y-%m-%d %H:%M:%S')) + ' ' +self.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo mostramos en el panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis, Log_wyp&lt;br /&gt;
admin.site.register(Log_wyp)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos los comandos para agregar el modelo a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ahora, para poder agregar cualquier log lo podemos hacer ejecutando el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py log -l &amp;quot;Mensaje a registrar&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que, por ejemplo, al integrarlo al archivo '''wyp/management/commands/mass_analysis.py''' se realizó lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
subprocess.Popen(shlex.split('python manage.py log -l &amp;quot;' + filename + ' Starting analysis&amp;quot;'))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de frecuencia de buses editando el archivo GTFS de Santiago ==&lt;br /&gt;
&lt;br /&gt;
Se trabaja actualmente en la construcción de una herramienta que permia cambiar las frecuencias de las líneas de buses y metro de la ciudad de Santiago con el objetivo de poder analizar los cambios de accesibilidad urbana derivadas de ésto. Con ello, en Django Python, se cargó en una base de datos SQLite (aparte de la que ya utiliza Django) el GTFS de los datos de la ciudad en cuestión gracias al módulo pygtfs. Para utilizar sus datos solo basta con llamarlos con sus funciones.&lt;br /&gt;
&lt;br /&gt;
Con ello, las frecuencias de los recorridos se encuentran en el archivo frequencies.txt dentro del archivo comprimido GTFS.zip. Con el módulo pygtfs previamente configurado se pueden llamar dichos datos con los comandos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
sched = pygtfs.Schedule(MEDIA_ROOT + 'gtfs.sqlite')&lt;br /&gt;
frequencies = sched.frequencies&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
generando en '''frequencies''' una lista con todas las frecuencias y los datos adjuntos que podemos ver en el mismo archivo de texto pero como objeto python.&lt;br /&gt;
&lt;br /&gt;
Luego se creó una vista en [http://146.155.17.19:17080/gtfs/update_frequencies] en donde encontraremos un espacio de selección de viaje identificado por su ID en la cual al ser seleccionada se desplegará su información, tal como su hora de inicio, hora de fin y su frecuencia de salida, este último en un campo editable. Cuando ya cambiamos este valor, podemos guardar este dato en una lista de futuros datos para ser actualizados, la cual la podemos ver en la zona inferior de este formulario. Ésta lista puede ser tan grande como SQLite aguante.&lt;br /&gt;
&lt;br /&gt;
Para construir esta lista, se debió de crear una copia de los modelos que hay en pygtfs en la base de datos local de Django manteniendo solo los datos que se desean cambiar, al ser eliminados de la lista también son eliminados de la base de datos para evitar que éste se llene o cause algún tipo de inconveniente.&lt;br /&gt;
&lt;br /&gt;
Ya cuando tengamos todos nuestros cambios guardados, apretamos en el botón de '''Actualizar GTFS'''. Éste proceso puede llegar a tardar entre 7 a 8 minutos en ser completado, por lo que el botón se bloqueará durante este tiempo. Una vez finalizado debemos dirigirnos al panel de administración para cambiar el router de evaluación y utilizar el que acabamos de construir. Para ello se entra a [http://146.155.17.19:17080/admin/wyp/server/1/change/] y se modifica la URL en cuestion para cambiar '''/routers/&amp;lt;texto-a-cambiar&amp;gt;/isochrone?''' por '''/routers/WYP/isochrone?'''. Una vez realizado este cambio podemos efectuar las consultas con nuestras nuevas frecuencias de buses.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que este proceso es temporal mientras no se construya un front-end ideal, ésta herramienta se construyó de esta forma para probar su funcionalidad y no garantiza lo más óptimo.&lt;br /&gt;
&lt;br /&gt;
== API REST para obtener datos del archivo de frecuencia de buses ==&lt;br /&gt;
&lt;br /&gt;
Para que el putno anterior de esta documentación funcione correctamente, fue necesario que se creara una API REST que nos permita obtener datos de las frecuencias mientras que por GET le enviemos la ID correspondiente al tramo a evaluar. En otras palabras, debemos ingresar una URL como ésta [http://146.155.17.19:17080/gtfs/frec_REST?f=101-I-S_V25-B14] y obtendremos un objeto Json con la información en cuestión.&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
El código se puede encontrar acá: http://146.155.17.14:18080/csfuente/wyp-django/ y se encuentra funcionando en http://146.155.17.19:17080/&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2017-08-04T15:26:31Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Script de 19:13 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
== Agregar -18 y .14 al apagado ==&lt;br /&gt;
&lt;br /&gt;
http://2tazasdelinux.blogspot.cl/2014/11/controlar-nuestro-sai-con-nut.html&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
== Actualizar la información ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información es necesario ir revisando los cambios de los archivos GTFS que se encuentran disponibles en la red, cuando notemos que uno es más nuevo es necesario descargarlo y ubicarlo en la carpeta que contiene todos los archivos similares (Actualmente se está utilizando la carpeta /home/csfuente/otpTransantiago ) por lo que entramos a dicha carpeta y descargamos los datos con '''wget'''. Finalmente reiniciamos la VM, esperamos a que inicie (cerca de ~10 minutos) y estará con todos los datos actualizados.&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CartoDB =&lt;br /&gt;
&lt;br /&gt;
== Levantar CartoDB cuando la máquina es encendida ==&lt;br /&gt;
&lt;br /&gt;
Subir CartoDB es un poco tedioso pero es posible sin complicaciónes, lo primero es exportar lo siguiente: (copy/paste a la terminal)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PATH=$PATH:/opt/rubies/ruby-2.2.3/bin&lt;br /&gt;
export CPLUS_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export C_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:$PWD/node_modules/grunt-cli/bin&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En mi cuenta agregué esas lineas al archivo .bashrc para que se ejecuten cada vez que entro por ssh a la VM.&lt;br /&gt;
Lo siguiente es ejecutar los procesos necesarios para que cartodb corra, para ello se ejecuta cada uno de ellos en una screen distinta (ya que no contamos con varias terminales por ssh)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/&lt;br /&gt;
screen&lt;br /&gt;
redis-server&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd cartodb&lt;br /&gt;
screen&lt;br /&gt;
bundle exec script/resque&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
bundle exec thin start --threaded -p 3000 --threadpool-size 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/Wireshark***&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/CartoDB-SQL-API&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
Con todo esto ahora podemos entrar a 146.155.17.18:3000 y usar cartodb.&lt;br /&gt;
&lt;br /&gt;
== Puertos utilizados en .18 por cartodb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Puerto&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Servicio&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:3000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb-SQL-API&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8181&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Wireshark&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:6379&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | redis-server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Obtener polígonos formato .poly de ciudades =&lt;br /&gt;
&lt;br /&gt;
Gracias a las instrucciones dadas en https://github.com/JamesChevalier/cities podemos obtener el polígono de la ciudad solicitada, los pasos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Entrar a http://nominatim.openstreetmap.org/ y poner en el buscador la ciudad que estamos buscando&lt;br /&gt;
* Al encontrarla, nos vamos a sus Detalles&lt;br /&gt;
* Copiamos el número que aparece en OSM: Relation '''XXXXXX'''&lt;br /&gt;
* Vamos a  http://polygons.openstreetmap.fr/ y pegamos éste número en '''Id of relation'''&lt;br /&gt;
* Descargamos la información en el link '''poly''' correspondiente&lt;br /&gt;
&lt;br /&gt;
= Migración OTP, Overpass en VM de WYP =&lt;br /&gt;
&lt;br /&gt;
== Migración de OTP ==&lt;br /&gt;
&lt;br /&gt;
Con el trabajo realizado ya de la instalación de OTP más arriba en esta wiki, se movió la carpeta en la cual fue compilado el repositorio junto con los graphs generados hasta entonces a la VM de WYP. los archivos quedaron en la carpeta /home/csfuente/OTP/ en donde se es posible ejecutar el servidor sin problemas.&lt;br /&gt;
OTP al ser ejecutado, su servidor trabaja en el puerto 5050 por lo que se creó una nueva regla nat para la VM el cual se es posible llegar a ella mediante el puerto 17050 en el servidor .19.&lt;br /&gt;
&lt;br /&gt;
El comando para ser ejecutado en esta VM es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Migración de Overpass ==&lt;br /&gt;
&lt;br /&gt;
Al igual que OTP, Overpass no es necesario ser recompilado. Los archivos de Overpass fueron trasladados a la VM a la carpeta /home/csfuente/Overpass/ y al ser ejecutado funciona directamente en el puerto 80. La regla nat fue modificada para apache redirigiendo lo del puerto 80 al puerto 17051 del servidor .19.&lt;br /&gt;
&lt;br /&gt;
Tambien fue necesario agregar las reglas de Apache2 correspondientes (también en esta misma wiki)&lt;br /&gt;
&lt;br /&gt;
Para ejecutarlo en esta VM es necesario escribir en la terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificaciones en arranque de WYP ==&lt;br /&gt;
&lt;br /&gt;
WYP estaba funcionando bajo Nginx, el cual se encargaba de redirigir el puerto 8000 al puerto 80 para que fuera leido por .19 en su puerto 17080. Para no modificar la URL de WYP fue necesario volver a cambiar a apache2 y ejecutar Django en el puerto 81. Crear una nueva regla nat para que leyera el puerto 81 de la VM y fuera ejecutado en 17080. De esta forma la URL no cambia para éste.&lt;br /&gt;
&lt;br /&gt;
El nuevo comando para ejeutar WYP es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar todos los procesos al iniciar la VM ==&lt;br /&gt;
&lt;br /&gt;
Para ello fue necesario editar el archivo '''/etc/rc.local'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
#&lt;br /&gt;
# rc.local&lt;br /&gt;
#&lt;br /&gt;
# This script is executed at the end of each multiuser runlevel.&lt;br /&gt;
# Make sure that the script will &amp;quot;exit 0&amp;quot; on success or any other&lt;br /&gt;
# value on error.&lt;br /&gt;
#&lt;br /&gt;
# In order to enable or disable this script just change the execution&lt;br /&gt;
# bits.&lt;br /&gt;
#&lt;br /&gt;
# By default this script does nothing.&lt;br /&gt;
&lt;br /&gt;
# Overpass&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# WYP&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# OTP&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
~        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Actualizar archivo OSM con un archivo OSC =&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información con calles/nodos/parques nuevos en un arhivo de formato OSM, es necesario generar un archivo OSC. Para combinarlos hay que usar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
osmchange -i=old.osm changefile.osc &amp;gt;new.osm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Link de interes ==&lt;br /&gt;
&lt;br /&gt;
http://wiki.openstreetmap.org/wiki/Osmchange_(program)&lt;br /&gt;
http://wiki.openstreetmap.org/wiki/Osmchange&lt;br /&gt;
&lt;br /&gt;
= Instalación Nominatim 3.0 =&lt;br /&gt;
&lt;br /&gt;
Nominatim 3.0 fue instalado en la VM 18:22081. Para la instalación se siguieron los pasos a continuación.&lt;br /&gt;
&lt;br /&gt;
La VM 18:22 se encontraba con Ubuntu 14.04 LTS, lo primero que se hizo fue actualizar a Ubuntu 16 para utilizar las últimas dependencias, para eso ejecutamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get upgrade&lt;br /&gt;
sudo apt-get dist-upgrade&lt;br /&gt;
sudo do-release-upgrade&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posterior a esto solo hay que seguir las indicaciones en pantalla.&lt;br /&gt;
&lt;br /&gt;
Luego, comienza la instalación de Nominatim, se siguieron las instrucciones de [https://github.com/openstreetmap/Nominatim/blob/master/docs/Install-on-Ubuntu-16.md Github Nominatim], lo primero es instalar las dependencias&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install -y build-essential cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
                        libboost-filesystem-dev libexpat1-dev zlib1g-dev libxml2-dev\&lt;br /&gt;
                        libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev \&lt;br /&gt;
                        postgresql-server-dev-9.5 postgresql-9.5-postgis-2.2 postgresql-contrib-9.5 \&lt;br /&gt;
                        apache2 php php-pgsql libapache2-mod-php php-pear php-db \&lt;br /&gt;
                        php-intl git&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se crea el usuario 'nominatim'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo useradd -d /srv/nominatim -s /bin/bash -m nominatim&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para hacer las cosas más comodas ejecutamos estos export para ahorrarnos text más adelante&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export USERNAME=nominatim&lt;br /&gt;
export USERHOME=/srv/nominatim&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitimos que la carpeta de nominatim sea leida por el server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
chmod a+x $USERHOME&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora, debemos crear la base de datos en postgres, el usuario que manejará la base de datos será nominatim, por lo que ejecutamos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u postgres createuser -s $USERNAME&lt;br /&gt;
sudo -u postgres createuser www-data&lt;br /&gt;
sudo systemctl restart postgresql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
buscamos y editamos el archivo fe configuración de postgres llamado ''postgresql.conf'' y editamos los valores&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
shared_buffers (2GB)&lt;br /&gt;
maintenance_work_mem (10GB)&lt;br /&gt;
work_mem (50MB)&lt;br /&gt;
effective_cache_size (24GB)&lt;br /&gt;
synchronous_commit = off&lt;br /&gt;
checkpoint_segments = 100 # only for postgresql &amp;lt;= 9.4&lt;br /&gt;
checkpoint_timeout = 10min&lt;br /&gt;
checkpoint_completion_target = 0.9&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el archivo de configuración para apache en un archivo aparte en ''conf-available'' ejecutando el siguiente comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/apache2/conf-available/nominatim.conf &amp;lt;&amp;lt; EOFAPACHECONF&lt;br /&gt;
&amp;lt;Directory &amp;quot;$USERHOME/Nominatim/build/website&amp;quot;&amp;gt;&lt;br /&gt;
  Options FollowSymLinks MultiViews&lt;br /&gt;
  AddType text/html   .php&lt;br /&gt;
  DirectoryIndex search.php&lt;br /&gt;
  Require all granted&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alias /nominatim $USERHOME/Nominatim/build/website&lt;br /&gt;
EOFAPACHECONF&lt;br /&gt;
sudo a2enconf nominatim&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recién ahora pasamos a la instalación de Nominatim, nos vamos al home de nominatim, copiamos el repositorio y ejecutamos los siguientes comandos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd $USERHOME&lt;br /&gt;
git clone --recursive git://github.com/openstreetmap/Nominatim.git&lt;br /&gt;
cd Nominatim&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake $USERHOME/Nominatim&lt;br /&gt;
make&lt;br /&gt;
tee settings/local.php &amp;lt;&amp;lt; EOF&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
 @define('CONST_Website_BaseURL', '/nominatim/');&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora, debemos importar la información de OSM, para ello descargamos el archivo .osm correspondiente, OJO, el archivo debe estar en formato .osm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget http://download.geofabrik.de/south-america/chile-latest.osm.bz2&lt;br /&gt;
bzip2 -d chile-latest.osm.bz2&lt;br /&gt;
./utils/setup.php --osm-file chile.latest.osm --all 2&amp;gt;&amp;amp;1 | tee setup.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto tenemos Nominatim corriendo con la data de Chile. Para agregar más información (como la data de OSM de Canadá) es necesario limpiar la base de datos de postgres, unir todos los archivos .osm en uno solo y  ejecutar el último comando señalada en esta documentación con el nuevo nombre del archivo .osm.&lt;br /&gt;
&lt;br /&gt;
= Mapas de OSM en Geonode =&lt;br /&gt;
&lt;br /&gt;
Es posible publicar mapas actualizados en geonode desde la data obtenida directamente de los servidores de OSM, se utilizó [http://docs.geonode.org/en/latest/tutorials/advanced/adv_data_mgmt/osm.html#using-the-osm-extract-script-to-download-osm-data-into-postgis esta guía] para poder realizar la actualización. Se debieron utilizar 2 VMs para este trabajo debido a que geonode está instalado en Ubuntu 12.04 y tiene conflictos con los paquetes de postgres el cual, al tratar de instalar una nueva versión de éste, solicita eliminar geonode (lo cual obviamente no queremos) por lo que el trabajo de osmosis y transformación de los datos a sql se realiza en la VM 18:22 (Gatherer). Se construyeron dos script, uno para la VM 18:22 y otro para la 19:13 (Geonode), Se explicarán los script en el orden en que se ejecutan.&lt;br /&gt;
&lt;br /&gt;
== Script de 18:22 ==&lt;br /&gt;
&lt;br /&gt;
Este script cumple con tres funciones principales, descargar la información de las calles de los servidores de OSM para Chile, extraer la información necesaria (tales como estaciones de policía, calles principales, hospitales, etc.) y posteriormente esta información es transformada a un archivo sql para ser insertada en una base de datos. El script construido es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
DB=/home/csfuente/hibridinterfaz/media/sql_osm&lt;br /&gt;
SETNAME=/home/csfuente/hibridinterfaz/media/sql&lt;br /&gt;
&lt;br /&gt;
# Creacion del directorio&lt;br /&gt;
&lt;br /&gt;
mkdir -p /home/csfuente/hibridinterfaz/media/sql&lt;br /&gt;
&lt;br /&gt;
# Descarga de archivo latest.pbf&lt;br /&gt;
&lt;br /&gt;
curl -g -o /home/csfuente/hibridinterfaz/media/sql/latest.pbf http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
# Construccion de archivos pbf&lt;br /&gt;
&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --nkv keyValueList=&amp;quot;aeroway.aerodrome&amp;quot; --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/aerodromes_point.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --wkv keyValueList=&amp;quot;aeroway.aerodrome&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/aerodromes_polygon.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --nkv keyValueList=&amp;quot;place.city,place.borough,place.suburb,place.quarter,place.neighbourhood,place.city_block,place.plot,place.town,place.village,place.hamlet,place.isolated_dwelling,place.farm,place.allotments&amp;quot; --tf reject-ways --tf reject-relations --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_places.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-ways &amp;quot;highway=*&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_roads.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-nodes amenity=bank,atm,bureau_de_change --tf reject-ways --tf reject-relations --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/banks.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-ways &amp;quot;building=*&amp;quot;  --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/buildings.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-ways landuse=residential,allotments,cemetery,construction,depot,garages,brownfield,commercial,industrial,retail --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/built_up_areas.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_places.pbf&amp;quot;  --tf accept-nodes &amp;quot;place=city&amp;quot; --tf reject-ways --tf reject-relations --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/cities.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --wkv keyValueList=&amp;quot;landuse.farm,landuse.farmland,landuse.farmyard,landuse.livestock&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/farms.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --wkv keyValueList=&amp;quot;landuse.forest,natural.wood&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/forest.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --wkv keyValueList=&amp;quot;landuse.grass,landuse.meadow,landuse.scrub,landuse.village_green,natural.scrub,natural.heath,natural.grassland&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/grassland.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-nodes aeroway=helipad,heliport --tf reject-ways --tf reject-relations --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/helipads.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --nkv keyValueList=&amp;quot;tourism.hotel,tourism.hostel,tourism.motel,tourism.guest_house&amp;quot; --tf reject-ways --tf reject-relations --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/hotels.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf reject-relations --tf accept-ways waterway=* --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/inland_water_line.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-ways natural=water,wetland,bay landuse=reservoir,basin,salt_pond waterway=river,riverbank --tf accept-relations natural=water,wetland,bay landuse=reservoir,basin,salt_pond waterway=river,riverbank --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/inland_water_polygon.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_roads.pbf&amp;quot; --wkv keyValueList=&amp;quot;highway.motorway,highway.trunk,highway.primary&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/main_roads.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --nkv keyValueList=&amp;quot;amenity.baby_hatch,amenity.clinic,amenity.dentist,amenity.doctors,amenity.hospital,amenity.nursing_home,amenity.pharmacy,amenity.social_facility,amenity.veterinary,amenity.blood_donation&amp;quot; --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/medical_point.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/buildings.pbf&amp;quot; --wkv keyValueList=&amp;quot;amenity.baby_hatch,amenity.clinic,amenity.dentist,amenity.doctors,amenity.hospital,amenity.nursing_home,amenity.pharmacy,amenity.social_facility,amenity.veterinary,amenity.blood_donation&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/medical_polygon.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_roads.pbf&amp;quot; --wkv keyValueList=&amp;quot;highway.footway,highway.bridleway,highway.steps,highway.path&amp;quot; --used-node  --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/paths.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --nkv keyValueList=&amp;quot;amenity.police&amp;quot; --tf reject-ways --tf reject-relations  --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/police_stations.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-ways &amp;quot;railway=*&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/railways.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --nkv keyValueList=&amp;quot;amenity.school,amenity.university,amenity.college,amenity.kindergarten,amenity.library,amenity.public_bookcase,amenity.music_school,amenity.driving_school,amenity.language_school&amp;quot; --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/school_point.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --wkv keyValueList=&amp;quot;amenity.school,amenity.university,amenity.college,amenity.kindergarten,amenity.library,amenity.public_bookcase,amenity.music_school,amenity.driving_school,amenity.language_school&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/schools_polygon.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_places.pbf&amp;quot;  --tf accept-nodes &amp;quot;place=town&amp;quot; --tf reject-ways --tf reject-relations  --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/towns.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_roads.pbf&amp;quot;  --wkv keyValueList=&amp;quot;highway.track&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/tracks.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-nodes amenity=bicycle_parking,bicycle_repair_station,bicycle_rental,boat_sharing,bus_station,car_rental,car_sharing,car_wash,charging_station,ferry_terminal,fuel,grit_brin,motorcycle_parking,parking,parking_entrance,parking_space,taxi public_transport=* railway=halt,station,subway_entrance,tram_stop waterway=dock,boatyard --tf reject-ways --tf reject-relations  --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/transport_point.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf reject-ways --tf reject-relations --tf accept-nodes amenity=shower,toilets,water_point,drinking_water,water_in_place --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/utilities.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_places.pbf&amp;quot;  --tf accept-nodes &amp;quot;place=village&amp;quot; --tf reject-ways --tf reject-relations --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/villages.pbf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Construccion de archivos sql&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/aerodromes_point.sql /home/csfuente/hibridinterfaz/media/sql/aerodromes_point.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/aerodromes_point.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/aerodromes_polygon.sql /home/csfuente/hibridinterfaz/media/sql/aerodromes_point.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/aerodromes_polygon.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/all_places.sql /home/csfuente/hibridinterfaz/media/sql/aerodromes_point.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/all_places.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/all_roads.sql /home/csfuente/hibridinterfaz/media/sql/all_roads.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/all_roads.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/banks.sql /home/csfuente/hibridinterfaz/media/sql/banks.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/banks.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/buildings.sql /home/csfuente/hibridinterfaz/media/sql/buildings.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/buildings.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/built_up_areas.sql /home/csfuente/hibridinterfaz/media/sql/built_up_areas.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/built_up_areas.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/cities.sql /home/csfuente/hibridinterfaz/media/sql/cities.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/cities.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/farms.sql /home/csfuente/hibridinterfaz/media/sql/farms.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/farms.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/forest.sql /home/csfuente/hibridinterfaz/media/sql/forest.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/forest.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/grassland.sql /home/csfuente/hibridinterfaz/media/sql/grassland.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/grassland.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/helipads.sql /home/csfuente/hibridinterfaz/media/sql/helipads.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/helipads.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/hotels.sql /home/csfuente/hibridinterfaz/media/sql/hotels.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/hotels.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/inland_water_line.sql /home/csfuente/hibridinterfaz/media/sql/inland_water_line.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/inland_water_line.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/inland_water_polygon.sql /home/csfuente/hibridinterfaz/media/sql/inland_water_polygon.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/inland_water_polygon.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/main_roads.sql /home/csfuente/hibridinterfaz/media/sql/main_roads.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/main_roads.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/medical_point.sql /home/csfuente/hibridinterfaz/media/sql/medical_point.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/medical_point.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/medical_polygon.sql /home/csfuente/hibridinterfaz/media/sql/medical_polygon.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/medical_polygon.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/paths.sql /home/csfuente/hibridinterfaz/media/sql/paths.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/paths.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/police_stations.sql /home/csfuente/hibridinterfaz/media/sql/police_stations.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/police_stations.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/railways.sql /home/csfuente/hibridinterfaz/media/sql/railways.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/railways.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/schools_point.sql /home/csfuente/hibridinterfaz/media/sql/school_point.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/schools_point.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/schools_polygon.sql /home/csfuente/hibridinterfaz/media/sql/schools_polygon.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/schools_polygon.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/towns.sql /home/csfuente/hibridinterfaz/media/sql/towns.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/towns.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/tracks.sql /home/csfuente/hibridinterfaz/media/sql/tracks.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/tracks.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/transport_point.sql /home/csfuente/hibridinterfaz/media/sql/transport_point.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/transport_point.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/utilities.sql /home/csfuente/hibridinterfaz/media/sql/utilities.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/utilities.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/villages.sql /home/csfuente/hibridinterfaz/media/sql/villages.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/villages.ini&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Script de 19:13 ==&lt;br /&gt;
&lt;br /&gt;
Antes de explicar el script, es necesario crear la base de datos en donde se trabajará, para ello se creó la base de datos 'Chile_osm' en postgres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
createdb Chile_osm \&lt;br /&gt;
psql -d Chile_osm -c 'create extension postgis;'; \&lt;br /&gt;
psql -d Chile_osm -c 'create extension hstore;';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta base de datos la leemos en geoserver, para ello creamos un nuevo Store y un nuevo Workspace especial para esta data. Acá la llamé ''osm''.&lt;br /&gt;
&lt;br /&gt;
Con ésto, el script generado para esta VM funciona de forma recursiva. Recupera el archivo sql generado en la otra VM, lo codifica para que no existan problemas con los textos, traspasa la data a la base de datos, las ordena y las dispone para que sean leidas. Hace esto para cada uno de los archivos sql generados anteriormente. Por lo que el script queda como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -g  -o /home/csfuente/osmex/Chile/aerodromes_point.sql1 http://146.155.17.18:22080/media/sql/aerodromes_point.sql&lt;br /&gt;
iconv -f latin1 -t utf-8 /home/csfuente/osmex/Chile/aerodromes_point.sql1 &amp;gt; /home/csfuente/osmex/Chile/aerodromes_point.sql&lt;br /&gt;
psql -f /home/csfuente/osmex/Chile/aerodromes_point.sql Chile_osm&lt;br /&gt;
psql -f /home/csfuente/osmex/conf/aerodromes_point_alter.sql Chile_osm&lt;br /&gt;
psql -f /home/csfuente/osmex/conf/clean.sql Chile_osm&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente debemos actualizar las capas en geonode para que sean reconocidas por éste, por lo que al final del script se ejecuta el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
geonode updatelayers --ignore-errors -w osm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El que nos permite solicitar la actualización de todas las capas del Workspace osm.&lt;br /&gt;
&lt;br /&gt;
== Horas en las cuales se ejecutan los script ==&lt;br /&gt;
&lt;br /&gt;
Ambos script se ejecutan de forma de cron, éstos funcionan todos los lunes a las 4:00 AM y 5:00 AM respectivamente.&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2017-08-04T15:26:06Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
== Agregar -18 y .14 al apagado ==&lt;br /&gt;
&lt;br /&gt;
http://2tazasdelinux.blogspot.cl/2014/11/controlar-nuestro-sai-con-nut.html&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
== Actualizar la información ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información es necesario ir revisando los cambios de los archivos GTFS que se encuentran disponibles en la red, cuando notemos que uno es más nuevo es necesario descargarlo y ubicarlo en la carpeta que contiene todos los archivos similares (Actualmente se está utilizando la carpeta /home/csfuente/otpTransantiago ) por lo que entramos a dicha carpeta y descargamos los datos con '''wget'''. Finalmente reiniciamos la VM, esperamos a que inicie (cerca de ~10 minutos) y estará con todos los datos actualizados.&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CartoDB =&lt;br /&gt;
&lt;br /&gt;
== Levantar CartoDB cuando la máquina es encendida ==&lt;br /&gt;
&lt;br /&gt;
Subir CartoDB es un poco tedioso pero es posible sin complicaciónes, lo primero es exportar lo siguiente: (copy/paste a la terminal)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PATH=$PATH:/opt/rubies/ruby-2.2.3/bin&lt;br /&gt;
export CPLUS_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export C_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:$PWD/node_modules/grunt-cli/bin&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En mi cuenta agregué esas lineas al archivo .bashrc para que se ejecuten cada vez que entro por ssh a la VM.&lt;br /&gt;
Lo siguiente es ejecutar los procesos necesarios para que cartodb corra, para ello se ejecuta cada uno de ellos en una screen distinta (ya que no contamos con varias terminales por ssh)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/&lt;br /&gt;
screen&lt;br /&gt;
redis-server&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd cartodb&lt;br /&gt;
screen&lt;br /&gt;
bundle exec script/resque&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
bundle exec thin start --threaded -p 3000 --threadpool-size 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/Wireshark***&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/CartoDB-SQL-API&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
Con todo esto ahora podemos entrar a 146.155.17.18:3000 y usar cartodb.&lt;br /&gt;
&lt;br /&gt;
== Puertos utilizados en .18 por cartodb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Puerto&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Servicio&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:3000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb-SQL-API&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8181&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Wireshark&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:6379&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | redis-server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Obtener polígonos formato .poly de ciudades =&lt;br /&gt;
&lt;br /&gt;
Gracias a las instrucciones dadas en https://github.com/JamesChevalier/cities podemos obtener el polígono de la ciudad solicitada, los pasos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Entrar a http://nominatim.openstreetmap.org/ y poner en el buscador la ciudad que estamos buscando&lt;br /&gt;
* Al encontrarla, nos vamos a sus Detalles&lt;br /&gt;
* Copiamos el número que aparece en OSM: Relation '''XXXXXX'''&lt;br /&gt;
* Vamos a  http://polygons.openstreetmap.fr/ y pegamos éste número en '''Id of relation'''&lt;br /&gt;
* Descargamos la información en el link '''poly''' correspondiente&lt;br /&gt;
&lt;br /&gt;
= Migración OTP, Overpass en VM de WYP =&lt;br /&gt;
&lt;br /&gt;
== Migración de OTP ==&lt;br /&gt;
&lt;br /&gt;
Con el trabajo realizado ya de la instalación de OTP más arriba en esta wiki, se movió la carpeta en la cual fue compilado el repositorio junto con los graphs generados hasta entonces a la VM de WYP. los archivos quedaron en la carpeta /home/csfuente/OTP/ en donde se es posible ejecutar el servidor sin problemas.&lt;br /&gt;
OTP al ser ejecutado, su servidor trabaja en el puerto 5050 por lo que se creó una nueva regla nat para la VM el cual se es posible llegar a ella mediante el puerto 17050 en el servidor .19.&lt;br /&gt;
&lt;br /&gt;
El comando para ser ejecutado en esta VM es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Migración de Overpass ==&lt;br /&gt;
&lt;br /&gt;
Al igual que OTP, Overpass no es necesario ser recompilado. Los archivos de Overpass fueron trasladados a la VM a la carpeta /home/csfuente/Overpass/ y al ser ejecutado funciona directamente en el puerto 80. La regla nat fue modificada para apache redirigiendo lo del puerto 80 al puerto 17051 del servidor .19.&lt;br /&gt;
&lt;br /&gt;
Tambien fue necesario agregar las reglas de Apache2 correspondientes (también en esta misma wiki)&lt;br /&gt;
&lt;br /&gt;
Para ejecutarlo en esta VM es necesario escribir en la terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificaciones en arranque de WYP ==&lt;br /&gt;
&lt;br /&gt;
WYP estaba funcionando bajo Nginx, el cual se encargaba de redirigir el puerto 8000 al puerto 80 para que fuera leido por .19 en su puerto 17080. Para no modificar la URL de WYP fue necesario volver a cambiar a apache2 y ejecutar Django en el puerto 81. Crear una nueva regla nat para que leyera el puerto 81 de la VM y fuera ejecutado en 17080. De esta forma la URL no cambia para éste.&lt;br /&gt;
&lt;br /&gt;
El nuevo comando para ejeutar WYP es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar todos los procesos al iniciar la VM ==&lt;br /&gt;
&lt;br /&gt;
Para ello fue necesario editar el archivo '''/etc/rc.local'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
#&lt;br /&gt;
# rc.local&lt;br /&gt;
#&lt;br /&gt;
# This script is executed at the end of each multiuser runlevel.&lt;br /&gt;
# Make sure that the script will &amp;quot;exit 0&amp;quot; on success or any other&lt;br /&gt;
# value on error.&lt;br /&gt;
#&lt;br /&gt;
# In order to enable or disable this script just change the execution&lt;br /&gt;
# bits.&lt;br /&gt;
#&lt;br /&gt;
# By default this script does nothing.&lt;br /&gt;
&lt;br /&gt;
# Overpass&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# WYP&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# OTP&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
~        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Actualizar archivo OSM con un archivo OSC =&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información con calles/nodos/parques nuevos en un arhivo de formato OSM, es necesario generar un archivo OSC. Para combinarlos hay que usar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
osmchange -i=old.osm changefile.osc &amp;gt;new.osm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Link de interes ==&lt;br /&gt;
&lt;br /&gt;
http://wiki.openstreetmap.org/wiki/Osmchange_(program)&lt;br /&gt;
http://wiki.openstreetmap.org/wiki/Osmchange&lt;br /&gt;
&lt;br /&gt;
= Instalación Nominatim 3.0 =&lt;br /&gt;
&lt;br /&gt;
Nominatim 3.0 fue instalado en la VM 18:22081. Para la instalación se siguieron los pasos a continuación.&lt;br /&gt;
&lt;br /&gt;
La VM 18:22 se encontraba con Ubuntu 14.04 LTS, lo primero que se hizo fue actualizar a Ubuntu 16 para utilizar las últimas dependencias, para eso ejecutamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get upgrade&lt;br /&gt;
sudo apt-get dist-upgrade&lt;br /&gt;
sudo do-release-upgrade&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posterior a esto solo hay que seguir las indicaciones en pantalla.&lt;br /&gt;
&lt;br /&gt;
Luego, comienza la instalación de Nominatim, se siguieron las instrucciones de [https://github.com/openstreetmap/Nominatim/blob/master/docs/Install-on-Ubuntu-16.md Github Nominatim], lo primero es instalar las dependencias&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install -y build-essential cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
                        libboost-filesystem-dev libexpat1-dev zlib1g-dev libxml2-dev\&lt;br /&gt;
                        libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev \&lt;br /&gt;
                        postgresql-server-dev-9.5 postgresql-9.5-postgis-2.2 postgresql-contrib-9.5 \&lt;br /&gt;
                        apache2 php php-pgsql libapache2-mod-php php-pear php-db \&lt;br /&gt;
                        php-intl git&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se crea el usuario 'nominatim'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo useradd -d /srv/nominatim -s /bin/bash -m nominatim&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para hacer las cosas más comodas ejecutamos estos export para ahorrarnos text más adelante&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export USERNAME=nominatim&lt;br /&gt;
export USERHOME=/srv/nominatim&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitimos que la carpeta de nominatim sea leida por el server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
chmod a+x $USERHOME&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora, debemos crear la base de datos en postgres, el usuario que manejará la base de datos será nominatim, por lo que ejecutamos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u postgres createuser -s $USERNAME&lt;br /&gt;
sudo -u postgres createuser www-data&lt;br /&gt;
sudo systemctl restart postgresql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
buscamos y editamos el archivo fe configuración de postgres llamado ''postgresql.conf'' y editamos los valores&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
shared_buffers (2GB)&lt;br /&gt;
maintenance_work_mem (10GB)&lt;br /&gt;
work_mem (50MB)&lt;br /&gt;
effective_cache_size (24GB)&lt;br /&gt;
synchronous_commit = off&lt;br /&gt;
checkpoint_segments = 100 # only for postgresql &amp;lt;= 9.4&lt;br /&gt;
checkpoint_timeout = 10min&lt;br /&gt;
checkpoint_completion_target = 0.9&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el archivo de configuración para apache en un archivo aparte en ''conf-available'' ejecutando el siguiente comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/apache2/conf-available/nominatim.conf &amp;lt;&amp;lt; EOFAPACHECONF&lt;br /&gt;
&amp;lt;Directory &amp;quot;$USERHOME/Nominatim/build/website&amp;quot;&amp;gt;&lt;br /&gt;
  Options FollowSymLinks MultiViews&lt;br /&gt;
  AddType text/html   .php&lt;br /&gt;
  DirectoryIndex search.php&lt;br /&gt;
  Require all granted&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alias /nominatim $USERHOME/Nominatim/build/website&lt;br /&gt;
EOFAPACHECONF&lt;br /&gt;
sudo a2enconf nominatim&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recién ahora pasamos a la instalación de Nominatim, nos vamos al home de nominatim, copiamos el repositorio y ejecutamos los siguientes comandos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd $USERHOME&lt;br /&gt;
git clone --recursive git://github.com/openstreetmap/Nominatim.git&lt;br /&gt;
cd Nominatim&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake $USERHOME/Nominatim&lt;br /&gt;
make&lt;br /&gt;
tee settings/local.php &amp;lt;&amp;lt; EOF&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
 @define('CONST_Website_BaseURL', '/nominatim/');&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora, debemos importar la información de OSM, para ello descargamos el archivo .osm correspondiente, OJO, el archivo debe estar en formato .osm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget http://download.geofabrik.de/south-america/chile-latest.osm.bz2&lt;br /&gt;
bzip2 -d chile-latest.osm.bz2&lt;br /&gt;
./utils/setup.php --osm-file chile.latest.osm --all 2&amp;gt;&amp;amp;1 | tee setup.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto tenemos Nominatim corriendo con la data de Chile. Para agregar más información (como la data de OSM de Canadá) es necesario limpiar la base de datos de postgres, unir todos los archivos .osm en uno solo y  ejecutar el último comando señalada en esta documentación con el nuevo nombre del archivo .osm.&lt;br /&gt;
&lt;br /&gt;
= Mapas de OSM en Geonode =&lt;br /&gt;
&lt;br /&gt;
Es posible publicar mapas actualizados en geonode desde la data obtenida directamente de los servidores de OSM, se utilizó [http://docs.geonode.org/en/latest/tutorials/advanced/adv_data_mgmt/osm.html#using-the-osm-extract-script-to-download-osm-data-into-postgis esta guía] para poder realizar la actualización. Se debieron utilizar 2 VMs para este trabajo debido a que geonode está instalado en Ubuntu 12.04 y tiene conflictos con los paquetes de postgres el cual, al tratar de instalar una nueva versión de éste, solicita eliminar geonode (lo cual obviamente no queremos) por lo que el trabajo de osmosis y transformación de los datos a sql se realiza en la VM 18:22 (Gatherer). Se construyeron dos script, uno para la VM 18:22 y otro para la 19:13 (Geonode), Se explicarán los script en el orden en que se ejecutan.&lt;br /&gt;
&lt;br /&gt;
== Script de 18:22 ==&lt;br /&gt;
&lt;br /&gt;
Este script cumple con tres funciones principales, descargar la información de las calles de los servidores de OSM para Chile, extraer la información necesaria (tales como estaciones de policía, calles principales, hospitales, etc.) y posteriormente esta información es transformada a un archivo sql para ser insertada en una base de datos. El script construido es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
DB=/home/csfuente/hibridinterfaz/media/sql_osm&lt;br /&gt;
SETNAME=/home/csfuente/hibridinterfaz/media/sql&lt;br /&gt;
&lt;br /&gt;
# Creacion del directorio&lt;br /&gt;
&lt;br /&gt;
mkdir -p /home/csfuente/hibridinterfaz/media/sql&lt;br /&gt;
&lt;br /&gt;
# Descarga de archivo latest.pbf&lt;br /&gt;
&lt;br /&gt;
curl -g -o /home/csfuente/hibridinterfaz/media/sql/latest.pbf http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
# Construccion de archivos pbf&lt;br /&gt;
&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --nkv keyValueList=&amp;quot;aeroway.aerodrome&amp;quot; --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/aerodromes_point.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --wkv keyValueList=&amp;quot;aeroway.aerodrome&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/aerodromes_polygon.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --nkv keyValueList=&amp;quot;place.city,place.borough,place.suburb,place.quarter,place.neighbourhood,place.city_block,place.plot,place.town,place.village,place.hamlet,place.isolated_dwelling,place.farm,place.allotments&amp;quot; --tf reject-ways --tf reject-relations --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_places.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-ways &amp;quot;highway=*&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_roads.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-nodes amenity=bank,atm,bureau_de_change --tf reject-ways --tf reject-relations --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/banks.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-ways &amp;quot;building=*&amp;quot;  --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/buildings.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-ways landuse=residential,allotments,cemetery,construction,depot,garages,brownfield,commercial,industrial,retail --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/built_up_areas.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_places.pbf&amp;quot;  --tf accept-nodes &amp;quot;place=city&amp;quot; --tf reject-ways --tf reject-relations --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/cities.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --wkv keyValueList=&amp;quot;landuse.farm,landuse.farmland,landuse.farmyard,landuse.livestock&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/farms.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --wkv keyValueList=&amp;quot;landuse.forest,natural.wood&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/forest.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --wkv keyValueList=&amp;quot;landuse.grass,landuse.meadow,landuse.scrub,landuse.village_green,natural.scrub,natural.heath,natural.grassland&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/grassland.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-nodes aeroway=helipad,heliport --tf reject-ways --tf reject-relations --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/helipads.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --nkv keyValueList=&amp;quot;tourism.hotel,tourism.hostel,tourism.motel,tourism.guest_house&amp;quot; --tf reject-ways --tf reject-relations --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/hotels.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf reject-relations --tf accept-ways waterway=* --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/inland_water_line.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-ways natural=water,wetland,bay landuse=reservoir,basin,salt_pond waterway=river,riverbank --tf accept-relations natural=water,wetland,bay landuse=reservoir,basin,salt_pond waterway=river,riverbank --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/inland_water_polygon.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_roads.pbf&amp;quot; --wkv keyValueList=&amp;quot;highway.motorway,highway.trunk,highway.primary&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/main_roads.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --nkv keyValueList=&amp;quot;amenity.baby_hatch,amenity.clinic,amenity.dentist,amenity.doctors,amenity.hospital,amenity.nursing_home,amenity.pharmacy,amenity.social_facility,amenity.veterinary,amenity.blood_donation&amp;quot; --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/medical_point.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/buildings.pbf&amp;quot; --wkv keyValueList=&amp;quot;amenity.baby_hatch,amenity.clinic,amenity.dentist,amenity.doctors,amenity.hospital,amenity.nursing_home,amenity.pharmacy,amenity.social_facility,amenity.veterinary,amenity.blood_donation&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/medical_polygon.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_roads.pbf&amp;quot; --wkv keyValueList=&amp;quot;highway.footway,highway.bridleway,highway.steps,highway.path&amp;quot; --used-node  --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/paths.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --nkv keyValueList=&amp;quot;amenity.police&amp;quot; --tf reject-ways --tf reject-relations  --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/police_stations.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-ways &amp;quot;railway=*&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/railways.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --nkv keyValueList=&amp;quot;amenity.school,amenity.university,amenity.college,amenity.kindergarten,amenity.library,amenity.public_bookcase,amenity.music_school,amenity.driving_school,amenity.language_school&amp;quot; --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/school_point.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --wkv keyValueList=&amp;quot;amenity.school,amenity.university,amenity.college,amenity.kindergarten,amenity.library,amenity.public_bookcase,amenity.music_school,amenity.driving_school,amenity.language_school&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/schools_polygon.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_places.pbf&amp;quot;  --tf accept-nodes &amp;quot;place=town&amp;quot; --tf reject-ways --tf reject-relations  --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/towns.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_roads.pbf&amp;quot;  --wkv keyValueList=&amp;quot;highway.track&amp;quot; --used-node --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/tracks.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf accept-nodes amenity=bicycle_parking,bicycle_repair_station,bicycle_rental,boat_sharing,bus_station,car_rental,car_sharing,car_wash,charging_station,ferry_terminal,fuel,grit_brin,motorcycle_parking,parking,parking_entrance,parking_space,taxi public_transport=* railway=halt,station,subway_entrance,tram_stop waterway=dock,boatyard --tf reject-ways --tf reject-relations  --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/transport_point.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/latest.pbf&amp;quot; --tf reject-ways --tf reject-relations --tf accept-nodes amenity=shower,toilets,water_point,drinking_water,water_in_place --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/utilities.pbf&amp;quot;&lt;br /&gt;
/home/csfuente/osmosis/bin/osmosis --read-pbf-fast file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/all_places.pbf&amp;quot;  --tf accept-nodes &amp;quot;place=village&amp;quot; --tf reject-ways --tf reject-relations --write-pbf file=&amp;quot;/home/csfuente/hibridinterfaz/media/sql/villages.pbf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Construccion de archivos sql&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/aerodromes_point.sql /home/csfuente/hibridinterfaz/media/sql/aerodromes_point.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/aerodromes_point.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/aerodromes_polygon.sql /home/csfuente/hibridinterfaz/media/sql/aerodromes_point.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/aerodromes_polygon.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/all_places.sql /home/csfuente/hibridinterfaz/media/sql/aerodromes_point.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/all_places.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/all_roads.sql /home/csfuente/hibridinterfaz/media/sql/all_roads.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/all_roads.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/banks.sql /home/csfuente/hibridinterfaz/media/sql/banks.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/banks.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/buildings.sql /home/csfuente/hibridinterfaz/media/sql/buildings.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/buildings.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/built_up_areas.sql /home/csfuente/hibridinterfaz/media/sql/built_up_areas.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/built_up_areas.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/cities.sql /home/csfuente/hibridinterfaz/media/sql/cities.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/cities.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/farms.sql /home/csfuente/hibridinterfaz/media/sql/farms.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/farms.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/forest.sql /home/csfuente/hibridinterfaz/media/sql/forest.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/forest.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/grassland.sql /home/csfuente/hibridinterfaz/media/sql/grassland.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/grassland.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/helipads.sql /home/csfuente/hibridinterfaz/media/sql/helipads.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/helipads.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/hotels.sql /home/csfuente/hibridinterfaz/media/sql/hotels.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/hotels.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/inland_water_line.sql /home/csfuente/hibridinterfaz/media/sql/inland_water_line.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/inland_water_line.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/inland_water_polygon.sql /home/csfuente/hibridinterfaz/media/sql/inland_water_polygon.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/inland_water_polygon.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/main_roads.sql /home/csfuente/hibridinterfaz/media/sql/main_roads.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/main_roads.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/medical_point.sql /home/csfuente/hibridinterfaz/media/sql/medical_point.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/medical_point.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/medical_polygon.sql /home/csfuente/hibridinterfaz/media/sql/medical_polygon.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/medical_polygon.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/paths.sql /home/csfuente/hibridinterfaz/media/sql/paths.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/paths.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/police_stations.sql /home/csfuente/hibridinterfaz/media/sql/police_stations.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/police_stations.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/railways.sql /home/csfuente/hibridinterfaz/media/sql/railways.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/railways.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/schools_point.sql /home/csfuente/hibridinterfaz/media/sql/school_point.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/schools_point.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/schools_polygon.sql /home/csfuente/hibridinterfaz/media/sql/schools_polygon.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/schools_polygon.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/towns.sql /home/csfuente/hibridinterfaz/media/sql/towns.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/towns.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/tracks.sql /home/csfuente/hibridinterfaz/media/sql/tracks.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/tracks.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/transport_point.sql /home/csfuente/hibridinterfaz/media/sql/transport_point.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/transport_point.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/utilities.sql /home/csfuente/hibridinterfaz/media/sql/utilities.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/utilities.ini&lt;br /&gt;
ogr2ogr -f PGDump /home/csfuente/hibridinterfaz/media/sql/villages.sql /home/csfuente/hibridinterfaz/media/sql/villages.pbf -lco COLUMN_TYPES=other_tags=hstore --config OSM_CONFIG_FILE conf/villages.ini&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Script de 19:13 ==&lt;br /&gt;
&lt;br /&gt;
Antes de explicar el script, es necesario crear la base de datos en donde se trabajará, para ello se creó la base de datos 'Chile_osm' en postgres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;quot;&amp;gt;&lt;br /&gt;
createdb Chile_osm \&lt;br /&gt;
psql -d Chile_osm -c 'create extension postgis;'; \&lt;br /&gt;
psql -d Chile_osm -c 'create extension hstore;';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta base de datos la leemos en geoserver, para ello creamos un nuevo Store y un nuevo Workspace especial para esta data. Acá la llamé ''osm''.&lt;br /&gt;
&lt;br /&gt;
Con ésto, el script generado para esta VM funciona de forma recursiva. Recupera el archivo sql generado en la otra VM, lo codifica para que no existan problemas con los textos, traspasa la data a la base de datos, las ordena y las dispone para que sean leidas. Hace esto para cada uno de los archivos sql generados anteriormente. Por lo que el script queda como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -g  -o /home/csfuente/osmex/Chile/aerodromes_point.sql1 http://146.155.17.18:22080/media/sql/aerodromes_point.sql&lt;br /&gt;
iconv -f latin1 -t utf-8 /home/csfuente/osmex/Chile/aerodromes_point.sql1 &amp;gt; /home/csfuente/osmex/Chile/aerodromes_point.sql&lt;br /&gt;
psql -f /home/csfuente/osmex/Chile/aerodromes_point.sql Chile_osm&lt;br /&gt;
psql -f /home/csfuente/osmex/conf/aerodromes_point_alter.sql Chile_osm&lt;br /&gt;
psql -f /home/csfuente/osmex/conf/clean.sql Chile_osm&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente debemos actualizar las capas en geonode para que sean reconocidas por éste, por lo que al final del script se ejecuta el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
geonode updatelayers --ignore-errors -w osm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El que nos permite solicitar la actualización de todas las capas del Workspace osm.&lt;br /&gt;
&lt;br /&gt;
== Horas en las cuales se ejecutan los script ==&lt;br /&gt;
&lt;br /&gt;
Ambos script se ejecutan de forma de cron, éstos funcionan todos los lunes a las 4:00 AM y 5:00 AM respectivamente.&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2017-08-04T15:05:55Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
== Agregar -18 y .14 al apagado ==&lt;br /&gt;
&lt;br /&gt;
http://2tazasdelinux.blogspot.cl/2014/11/controlar-nuestro-sai-con-nut.html&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
== Actualizar la información ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información es necesario ir revisando los cambios de los archivos GTFS que se encuentran disponibles en la red, cuando notemos que uno es más nuevo es necesario descargarlo y ubicarlo en la carpeta que contiene todos los archivos similares (Actualmente se está utilizando la carpeta /home/csfuente/otpTransantiago ) por lo que entramos a dicha carpeta y descargamos los datos con '''wget'''. Finalmente reiniciamos la VM, esperamos a que inicie (cerca de ~10 minutos) y estará con todos los datos actualizados.&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CartoDB =&lt;br /&gt;
&lt;br /&gt;
== Levantar CartoDB cuando la máquina es encendida ==&lt;br /&gt;
&lt;br /&gt;
Subir CartoDB es un poco tedioso pero es posible sin complicaciónes, lo primero es exportar lo siguiente: (copy/paste a la terminal)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PATH=$PATH:/opt/rubies/ruby-2.2.3/bin&lt;br /&gt;
export CPLUS_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export C_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:$PWD/node_modules/grunt-cli/bin&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En mi cuenta agregué esas lineas al archivo .bashrc para que se ejecuten cada vez que entro por ssh a la VM.&lt;br /&gt;
Lo siguiente es ejecutar los procesos necesarios para que cartodb corra, para ello se ejecuta cada uno de ellos en una screen distinta (ya que no contamos con varias terminales por ssh)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/&lt;br /&gt;
screen&lt;br /&gt;
redis-server&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd cartodb&lt;br /&gt;
screen&lt;br /&gt;
bundle exec script/resque&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
bundle exec thin start --threaded -p 3000 --threadpool-size 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/Wireshark***&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/CartoDB-SQL-API&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
Con todo esto ahora podemos entrar a 146.155.17.18:3000 y usar cartodb.&lt;br /&gt;
&lt;br /&gt;
== Puertos utilizados en .18 por cartodb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Puerto&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Servicio&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:3000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb-SQL-API&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8181&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Wireshark&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:6379&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | redis-server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Obtener polígonos formato .poly de ciudades =&lt;br /&gt;
&lt;br /&gt;
Gracias a las instrucciones dadas en https://github.com/JamesChevalier/cities podemos obtener el polígono de la ciudad solicitada, los pasos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Entrar a http://nominatim.openstreetmap.org/ y poner en el buscador la ciudad que estamos buscando&lt;br /&gt;
* Al encontrarla, nos vamos a sus Detalles&lt;br /&gt;
* Copiamos el número que aparece en OSM: Relation '''XXXXXX'''&lt;br /&gt;
* Vamos a  http://polygons.openstreetmap.fr/ y pegamos éste número en '''Id of relation'''&lt;br /&gt;
* Descargamos la información en el link '''poly''' correspondiente&lt;br /&gt;
&lt;br /&gt;
= Migración OTP, Overpass en VM de WYP =&lt;br /&gt;
&lt;br /&gt;
== Migración de OTP ==&lt;br /&gt;
&lt;br /&gt;
Con el trabajo realizado ya de la instalación de OTP más arriba en esta wiki, se movió la carpeta en la cual fue compilado el repositorio junto con los graphs generados hasta entonces a la VM de WYP. los archivos quedaron en la carpeta /home/csfuente/OTP/ en donde se es posible ejecutar el servidor sin problemas.&lt;br /&gt;
OTP al ser ejecutado, su servidor trabaja en el puerto 5050 por lo que se creó una nueva regla nat para la VM el cual se es posible llegar a ella mediante el puerto 17050 en el servidor .19.&lt;br /&gt;
&lt;br /&gt;
El comando para ser ejecutado en esta VM es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Migración de Overpass ==&lt;br /&gt;
&lt;br /&gt;
Al igual que OTP, Overpass no es necesario ser recompilado. Los archivos de Overpass fueron trasladados a la VM a la carpeta /home/csfuente/Overpass/ y al ser ejecutado funciona directamente en el puerto 80. La regla nat fue modificada para apache redirigiendo lo del puerto 80 al puerto 17051 del servidor .19.&lt;br /&gt;
&lt;br /&gt;
Tambien fue necesario agregar las reglas de Apache2 correspondientes (también en esta misma wiki)&lt;br /&gt;
&lt;br /&gt;
Para ejecutarlo en esta VM es necesario escribir en la terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificaciones en arranque de WYP ==&lt;br /&gt;
&lt;br /&gt;
WYP estaba funcionando bajo Nginx, el cual se encargaba de redirigir el puerto 8000 al puerto 80 para que fuera leido por .19 en su puerto 17080. Para no modificar la URL de WYP fue necesario volver a cambiar a apache2 y ejecutar Django en el puerto 81. Crear una nueva regla nat para que leyera el puerto 81 de la VM y fuera ejecutado en 17080. De esta forma la URL no cambia para éste.&lt;br /&gt;
&lt;br /&gt;
El nuevo comando para ejeutar WYP es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar todos los procesos al iniciar la VM ==&lt;br /&gt;
&lt;br /&gt;
Para ello fue necesario editar el archivo '''/etc/rc.local'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
#&lt;br /&gt;
# rc.local&lt;br /&gt;
#&lt;br /&gt;
# This script is executed at the end of each multiuser runlevel.&lt;br /&gt;
# Make sure that the script will &amp;quot;exit 0&amp;quot; on success or any other&lt;br /&gt;
# value on error.&lt;br /&gt;
#&lt;br /&gt;
# In order to enable or disable this script just change the execution&lt;br /&gt;
# bits.&lt;br /&gt;
#&lt;br /&gt;
# By default this script does nothing.&lt;br /&gt;
&lt;br /&gt;
# Overpass&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# WYP&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# OTP&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
~        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Actualizar archivo OSM con un archivo OSC =&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información con calles/nodos/parques nuevos en un arhivo de formato OSM, es necesario generar un archivo OSC. Para combinarlos hay que usar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
osmchange -i=old.osm changefile.osc &amp;gt;new.osm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Link de interes ==&lt;br /&gt;
&lt;br /&gt;
http://wiki.openstreetmap.org/wiki/Osmchange_(program)&lt;br /&gt;
http://wiki.openstreetmap.org/wiki/Osmchange&lt;br /&gt;
&lt;br /&gt;
= Instalación Nominatim 3.0 =&lt;br /&gt;
&lt;br /&gt;
Nominatim 3.0 fue instalado en la VM 18:22081. Para la instalación se siguieron los pasos a continuación.&lt;br /&gt;
&lt;br /&gt;
La VM 18:22 se encontraba con Ubuntu 14.04 LTS, lo primero que se hizo fue actualizar a Ubuntu 16 para utilizar las últimas dependencias, para eso ejecutamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get upgrade&lt;br /&gt;
sudo apt-get dist-upgrade&lt;br /&gt;
sudo do-release-upgrade&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posterior a esto solo hay que seguir las indicaciones en pantalla.&lt;br /&gt;
&lt;br /&gt;
Luego, comienza la instalación de Nominatim, se siguieron las instrucciones de [https://github.com/openstreetmap/Nominatim/blob/master/docs/Install-on-Ubuntu-16.md Github Nominatim], lo primero es instalar las dependencias&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install -y build-essential cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
                        libboost-filesystem-dev libexpat1-dev zlib1g-dev libxml2-dev\&lt;br /&gt;
                        libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev \&lt;br /&gt;
                        postgresql-server-dev-9.5 postgresql-9.5-postgis-2.2 postgresql-contrib-9.5 \&lt;br /&gt;
                        apache2 php php-pgsql libapache2-mod-php php-pear php-db \&lt;br /&gt;
                        php-intl git&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se crea el usuario 'nominatim'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo useradd -d /srv/nominatim -s /bin/bash -m nominatim&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para hacer las cosas más comodas ejecutamos estos export para ahorrarnos text más adelante&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export USERNAME=nominatim&lt;br /&gt;
export USERHOME=/srv/nominatim&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitimos que la carpeta de nominatim sea leida por el server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
chmod a+x $USERHOME&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora, debemos crear la base de datos en postgres, el usuario que manejará la base de datos será nominatim, por lo que ejecutamos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u postgres createuser -s $USERNAME&lt;br /&gt;
sudo -u postgres createuser www-data&lt;br /&gt;
sudo systemctl restart postgresql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
buscamos y editamos el archivo fe configuración de postgres llamado ''postgresql.conf'' y editamos los valores&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
shared_buffers (2GB)&lt;br /&gt;
maintenance_work_mem (10GB)&lt;br /&gt;
work_mem (50MB)&lt;br /&gt;
effective_cache_size (24GB)&lt;br /&gt;
synchronous_commit = off&lt;br /&gt;
checkpoint_segments = 100 # only for postgresql &amp;lt;= 9.4&lt;br /&gt;
checkpoint_timeout = 10min&lt;br /&gt;
checkpoint_completion_target = 0.9&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el archivo de configuración para apache en un archivo aparte en ''conf-available'' ejecutando el siguiente comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/apache2/conf-available/nominatim.conf &amp;lt;&amp;lt; EOFAPACHECONF&lt;br /&gt;
&amp;lt;Directory &amp;quot;$USERHOME/Nominatim/build/website&amp;quot;&amp;gt;&lt;br /&gt;
  Options FollowSymLinks MultiViews&lt;br /&gt;
  AddType text/html   .php&lt;br /&gt;
  DirectoryIndex search.php&lt;br /&gt;
  Require all granted&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alias /nominatim $USERHOME/Nominatim/build/website&lt;br /&gt;
EOFAPACHECONF&lt;br /&gt;
sudo a2enconf nominatim&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recién ahora pasamos a la instalación de Nominatim, nos vamos al home de nominatim, copiamos el repositorio y ejecutamos los siguientes comandos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd $USERHOME&lt;br /&gt;
git clone --recursive git://github.com/openstreetmap/Nominatim.git&lt;br /&gt;
cd Nominatim&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake $USERHOME/Nominatim&lt;br /&gt;
make&lt;br /&gt;
tee settings/local.php &amp;lt;&amp;lt; EOF&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
 @define('CONST_Website_BaseURL', '/nominatim/');&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora, debemos importar la información de OSM, para ello descargamos el archivo .osm correspondiente, OJO, el archivo debe estar en formato .osm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget http://download.geofabrik.de/south-america/chile-latest.osm.bz2&lt;br /&gt;
bzip2 -d chile-latest.osm.bz2&lt;br /&gt;
./utils/setup.php --osm-file chile.latest.osm --all 2&amp;gt;&amp;amp;1 | tee setup.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto tenemos Nominatim corriendo con la data de Chile. Para agregar más información (como la data de OSM de Canadá) es necesario limpiar la base de datos de postgres, unir todos los archivos .osm en uno solo y  ejecutar el último comando señalada en esta documentación con el nuevo nombre del archivo .osm.&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace</id>
		<title>Api rest WalkYourPlace</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace"/>
				<updated>2017-06-29T23:00:18Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WalkYourPlace contiene una api rest con el cual es posible conseguir los scores si se le envían los datos a traves de una URL en formato GET.&lt;br /&gt;
&lt;br /&gt;
Las peticiones se hacen bajo la url http://146.155.17.19:17080/api y las variables se envían posterior a un '?' en la misma, éstos deben ir separados por un '&amp;amp;'&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
= Modos de viaje =&lt;br /&gt;
&lt;br /&gt;
== Walkscore model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score simulando el sistema que utiliza Walkscore.com son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676 &lt;br /&gt;
* radius (opcional): Es el radio de la circunferencia a evaluar, por defecto se encuentra con el valor 1.25.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;radius=1.5&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== Cycling model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona viaja en bicicleta son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* biking_time_period : El tiempo de viaje en minutos.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=bike&amp;amp;start_point=-33.465,-70.676&amp;amp;biking_time_period=10&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=bike&amp;amp;start_point=-33.465,-70.676&amp;amp;biking_time_period=8&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== walking model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona caminando son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* walking_time_period : El tiempo de caminata en minutos.&lt;br /&gt;
* walking_speed : La velocidad de caminata en [metros/segundos]&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walk&amp;amp;start_point=-33.465,-70.676&amp;amp;walking_time_period=10&amp;amp;walking_speed=1.25&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walk&amp;amp;start_point=-33.465,-70.676&amp;amp;walking_time_period=10&amp;amp;walking_speed=1.25&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== Transit &amp;amp; walking model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona caminando y utilizando el transporte público son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* walking_time_period : El tiempo de caminata en minutos.&lt;br /&gt;
* walking_speed : La velocidad de caminata en [metros/segundos]&lt;br /&gt;
* walking_start_time : Es la hora de comienzo del viaje, importante para las rutas del transporte público, se expresa en hora, minutos y segundos (Ej: 14:00:00)&lt;br /&gt;
* bus_waiting_time : Es el tiempo en minutos de cuanto esperaría a que el bus llegue al apradero&lt;br /&gt;
* bus_riding_time : Es el tiempo de viaje arriba de un transporte público&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplos&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=transit&amp;amp;start_point=-33.465,-70.676&amp;amp;walking_time_period=10&amp;amp;walking_speed=1.25&amp;amp;walking_start_time=14:00:00&amp;amp;bus_waiting_time=9&amp;amp;bus_riding_time=9&lt;br /&gt;
&lt;br /&gt;
== Car model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona viaja en auto son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* car_time_period : El tiempo de viaje en minutos.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=car&amp;amp;start_point=-33.465,-70.676&amp;amp;car_time_period=10&lt;br /&gt;
&lt;br /&gt;
= Representación de resultados =&lt;br /&gt;
&lt;br /&gt;
Los resultados son entregados en formato JSON con la siguiente estructura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;walkshed&amp;quot;: &lt;br /&gt;
 {&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&lt;br /&gt;
  &amp;quot;coordinates&amp;quot;:,				# Coordenadas del polígono&lt;br /&gt;
  &amp;quot;properties&amp;quot;: &lt;br /&gt;
    {&amp;quot;type&amp;quot;: &amp;quot;Walkshed&amp;quot;, &lt;br /&gt;
	 &amp;quot;area&amp;quot;: 0,				# Area abarcada por el polígono&lt;br /&gt;
	 &amp;quot;score&amp;quot;: &amp;quot;0&amp;quot;,				# Puntaje de WYP&lt;br /&gt;
	 &amp;quot;crime_index&amp;quot;: 0, &lt;br /&gt;
	 &amp;quot;color&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
	 }&lt;br /&gt;
 }, &lt;br /&gt;
 &amp;quot;poi&amp;quot;: &lt;br /&gt;
  {&amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;, &lt;br /&gt;
   &amp;quot;features&amp;quot;: [ 				# Puntos considerados&lt;br /&gt;
    {&amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
	 &amp;quot;geometry&amp;quot;: &lt;br /&gt;
	 {&amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;, &lt;br /&gt;
	  &amp;quot;coordinates&amp;quot;:			# Coordenadas del punto&lt;br /&gt;
	 }, &lt;br /&gt;
	 &amp;quot;properties&amp;quot;: &lt;br /&gt;
	  {&amp;quot;name&amp;quot;: &amp;quot;&amp;quot;, 				# Nombre del atractivo&lt;br /&gt;
	   &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;, 				# Tipo&lt;br /&gt;
	   &amp;quot;icon&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
	  }&lt;br /&gt;
	},...]					# Pueden ser muchos puntos más&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace</id>
		<title>Api rest WalkYourPlace</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace"/>
				<updated>2017-06-29T22:46:24Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Car model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WalkYourPlace contiene una api rest con el cual es posible conseguir los scores si se le envían los datos a traves de una URL en formato GET.&lt;br /&gt;
&lt;br /&gt;
Las peticiones se hacen bajo la url http://146.155.17.19:17080/api y las variables se envían posterior a un '?' en la misma, éstos deben ir separados por un '&amp;amp;'&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
= Modos de viaje =&lt;br /&gt;
&lt;br /&gt;
== Walkscore model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score simulando el sistema que utiliza Walkscore.com son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676 &lt;br /&gt;
* radius (opcional): Es el radio de la circunferencia a evaluar, por defecto se encuentra con el valor 1.25.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;radius=1.5&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== Cycling model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona viaja en bicicleta son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* biking_time_period : El tiempo de viaje en minutos.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=bike&amp;amp;start_point=-33.465,-70.676&amp;amp;biking_time_period=10&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=bike&amp;amp;start_point=-33.465,-70.676&amp;amp;biking_time_period=8&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== walking model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona caminando son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* walking_time_period : El tiempo de caminata en minutos.&lt;br /&gt;
* walking_speed : La velocidad de caminata en [metros/segundos]&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walk&amp;amp;start_point=-33.465,-70.676&amp;amp;walking_time_period=10&amp;amp;walking_speed=1.25&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walk&amp;amp;start_point=-33.465,-70.676&amp;amp;walking_time_period=10&amp;amp;walking_speed=1.25&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== Transit &amp;amp; walking model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona caminando y utilizando el transporte público son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* walking_time_period : El tiempo de caminata en minutos.&lt;br /&gt;
* walking_speed : La velocidad de caminata en [metros/segundos]&lt;br /&gt;
* walking_start_time : Es la hora de comienzo del viaje, importante para las rutas del transporte público, se expresa en hora, minutos y segundos (Ej: 14:00:00)&lt;br /&gt;
* bus_waiting_time : Es el tiempo en minutos de cuanto esperaría a que el bus llegue al apradero&lt;br /&gt;
* bus_riding_time : Es el tiempo de viaje arriba de un transporte público&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplos&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=transit&amp;amp;start_point=-33.465,-70.676&amp;amp;walking_time_period=10&amp;amp;walking_speed=1.25&amp;amp;walking_start_time=14:00:00&amp;amp;bus_waiting_time=9&amp;amp;bus_riding_time=9&lt;br /&gt;
&lt;br /&gt;
== Car model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona viaja en auto son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* car_time_period : El tiempo de viaje en minutos.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=car&amp;amp;start_point=-33.465,-70.676&amp;amp;car_time_period=10&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace</id>
		<title>Api rest WalkYourPlace</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace"/>
				<updated>2017-06-29T22:44:20Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Transit &amp;amp; walking model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WalkYourPlace contiene una api rest con el cual es posible conseguir los scores si se le envían los datos a traves de una URL en formato GET.&lt;br /&gt;
&lt;br /&gt;
Las peticiones se hacen bajo la url http://146.155.17.19:17080/api y las variables se envían posterior a un '?' en la misma, éstos deben ir separados por un '&amp;amp;'&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
= Modos de viaje =&lt;br /&gt;
&lt;br /&gt;
== Walkscore model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score simulando el sistema que utiliza Walkscore.com son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676 &lt;br /&gt;
* radius (opcional): Es el radio de la circunferencia a evaluar, por defecto se encuentra con el valor 1.25.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;radius=1.5&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== Cycling model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona viaja en bicicleta son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* biking_time_period : El tiempo de viaje en minutos.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=bike&amp;amp;start_point=-33.465,-70.676&amp;amp;biking_time_period=10&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=bike&amp;amp;start_point=-33.465,-70.676&amp;amp;biking_time_period=8&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== walking model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona caminando son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* walking_time_period : El tiempo de caminata en minutos.&lt;br /&gt;
* walking_speed : La velocidad de caminata en [metros/segundos]&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walk&amp;amp;start_point=-33.465,-70.676&amp;amp;walking_time_period=10&amp;amp;walking_speed=1.25&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walk&amp;amp;start_point=-33.465,-70.676&amp;amp;walking_time_period=10&amp;amp;walking_speed=1.25&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== Transit &amp;amp; walking model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona caminando y utilizando el transporte público son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* walking_time_period : El tiempo de caminata en minutos.&lt;br /&gt;
* walking_speed : La velocidad de caminata en [metros/segundos]&lt;br /&gt;
* walking_start_time : Es la hora de comienzo del viaje, importante para las rutas del transporte público, se expresa en hora, minutos y segundos (Ej: 14:00:00)&lt;br /&gt;
* bus_waiting_time : Es el tiempo en minutos de cuanto esperaría a que el bus llegue al apradero&lt;br /&gt;
* bus_riding_time : Es el tiempo de viaje arriba de un transporte público&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplos&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=transit&amp;amp;start_point=-33.465,-70.676&amp;amp;walking_time_period=10&amp;amp;walking_speed=1.25&amp;amp;walking_start_time=14:00:00&amp;amp;bus_waiting_time=9&amp;amp;bus_riding_time=9&lt;br /&gt;
&lt;br /&gt;
== Car model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona viaja en auto son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* car_time_period : El tiempo de viaje en minutos.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace</id>
		<title>Api rest WalkYourPlace</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace"/>
				<updated>2017-06-29T22:37:10Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WalkYourPlace contiene una api rest con el cual es posible conseguir los scores si se le envían los datos a traves de una URL en formato GET.&lt;br /&gt;
&lt;br /&gt;
Las peticiones se hacen bajo la url http://146.155.17.19:17080/api y las variables se envían posterior a un '?' en la misma, éstos deben ir separados por un '&amp;amp;'&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
= Modos de viaje =&lt;br /&gt;
&lt;br /&gt;
== Walkscore model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score simulando el sistema que utiliza Walkscore.com son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676 &lt;br /&gt;
* radius (opcional): Es el radio de la circunferencia a evaluar, por defecto se encuentra con el valor 1.25.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;radius=1.5&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== Cycling model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona viaja en bicicleta son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* biking_time_period : El tiempo de viaje en minutos.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=bike&amp;amp;start_point=-33.465,-70.676&amp;amp;biking_time_period=10&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=bike&amp;amp;start_point=-33.465,-70.676&amp;amp;biking_time_period=8&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== walking model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona caminando son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* walking_time_period : El tiempo de caminata en minutos.&lt;br /&gt;
* walking_speed : La velocidad de caminata en [metros/segundos]&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walk&amp;amp;start_point=-33.465,-70.676&amp;amp;walking_time_period=10&amp;amp;walking_speed=1.25&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walk&amp;amp;start_point=-33.465,-70.676&amp;amp;walking_time_period=10&amp;amp;walking_speed=1.25&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== Transit &amp;amp; walking model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona caminando y utilizando el transporte público son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* walking_time_period : El tiempo de caminata en minutos.&lt;br /&gt;
* walking_speed : La velocidad de caminata en [metros/segundos]&lt;br /&gt;
* walking_start_time : Es la hora de comienzo del viaje, importante para las rutas del transporte público, se expresa en hora y minuto (Ej: 14:00)&lt;br /&gt;
* bus_waiting_time : Es el tiempo en minutos de cuanto esperaría a que el bus llegue al apradero&lt;br /&gt;
* bus_riding_time : Es el tiempo de viaje arriba de un transporte público&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
== Car model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona viaja en auto son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* car_time_period : El tiempo de viaje en minutos.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace</id>
		<title>Api rest WalkYourPlace</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace"/>
				<updated>2017-06-29T22:29:33Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Modos de viaje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WalkYourPlace contiene una api rest con el cual es posible conseguir los scores si se le envían los datos a traves de una URL en formato GET.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
= Modos de viaje =&lt;br /&gt;
&lt;br /&gt;
== Walkscore model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score simulando el sistema que utiliza Walkscore.com son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676 &lt;br /&gt;
* radius (opcional): Es el radio de la circunferencia a evaluar, por defecto se encuentra con el valor 1.25.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;radius=1.5&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== Cycling model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score cuando una persona viaja en bicicleta son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676&lt;br /&gt;
* biking_time_period : El tiempo de viaje en minutos.&lt;br /&gt;
* demographic (opcional): Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) ).&lt;br /&gt;
* Escenario (opcional): Es el escenario con el cual se requiere hacer la evaluación (default=1 información de OTP sobre el territorio chileno)&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=bike&amp;amp;start_point=-33.465,-70.676&amp;amp;biking_time_period=10&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=bike&amp;amp;start_point=-33.465,-70.676&amp;amp;biking_time_period=8&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== walking model ==&lt;br /&gt;
&lt;br /&gt;
== Transit &amp;amp; walking model ==&lt;br /&gt;
&lt;br /&gt;
== Car model ==&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace</id>
		<title>Api rest WalkYourPlace</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace"/>
				<updated>2017-06-29T22:25:55Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Walkscore model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WalkYourPlace contiene una api rest con el cual es posible conseguir los scores si se le envían los datos a traves de una URL en formato GET.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
= Modos de viaje =&lt;br /&gt;
&lt;br /&gt;
== Walkscore model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score simulando el sistema que utiliza Walkscore.com son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676 &lt;br /&gt;
* radius (opcional): Es el radio de la circunferencia a evaluar, por defecto se encuentra con el valor 1.25&lt;br /&gt;
* demographic : Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) )&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;radius=1.5&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== Cycling model ==&lt;br /&gt;
&lt;br /&gt;
== walking model ==&lt;br /&gt;
&lt;br /&gt;
== Transit &amp;amp; walking model ==&lt;br /&gt;
&lt;br /&gt;
== Car model ==&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace</id>
		<title>Api rest WalkYourPlace</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Api_rest_WalkYourPlace"/>
				<updated>2017-06-29T22:25:33Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: Created page with &amp;quot;WalkYourPlace contiene una api rest con el cual es posible conseguir los scores si se le envían los datos a traves de una URL en formato GET.  Por ejemplo:  http://146.155.17...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WalkYourPlace contiene una api rest con el cual es posible conseguir los scores si se le envían los datos a traves de una URL en formato GET.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
&lt;br /&gt;
= Modos de viaje =&lt;br /&gt;
&lt;br /&gt;
== Walkscore model ==&lt;br /&gt;
&lt;br /&gt;
Para obtener el score simulando el sistema que utiliza Walkscore.com son necesarias las siguientes variables en la petición:&lt;br /&gt;
&lt;br /&gt;
* start_point : El punto a evaluar, las coordenadas deben ser escritas sin un espacio de separación. Por Ej: -33.465,-70.676 &lt;br /&gt;
* radius (opcional): Es el radio de la circunferencia a evaluar, por defecto se encuentra con el valor 1.25&lt;br /&gt;
* demographic : Es la opción demográfica con el cual queremos que los datos sean evaluados (default = Young Adult (20-30) )&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;radius=1.5&lt;br /&gt;
http://146.155.17.19:17080/api?mode=walkscore&amp;amp;start_point=-33.465,-70.676&amp;amp;demographic=Lawrence-Frank%20Adult&lt;br /&gt;
&lt;br /&gt;
== Cycling model ==&lt;br /&gt;
&lt;br /&gt;
== walking model ==&lt;br /&gt;
&lt;br /&gt;
== Transit &amp;amp; walking model ==&lt;br /&gt;
&lt;br /&gt;
== Car model ==&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Cedeus_IDE</id>
		<title>Cedeus IDE</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Cedeus_IDE"/>
				<updated>2017-06-29T22:17:16Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* información útil y documentación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Centro de Desarrollo Urbano Sustentable - CEDEUS'''&lt;br /&gt;
&lt;br /&gt;
* Observatory Webpage: &lt;br /&gt;
** http://observatorio.cedeus.cl or http://www.datosurbanos.cl&lt;br /&gt;
* Other service domains:&lt;br /&gt;
** http://datos.cedeus.cl =&amp;gt; geonode direct access&lt;br /&gt;
** http://pubs.cedeus.cl =&amp;gt; omeka direct access&lt;br /&gt;
** http://wiki.cedeus.cl =&amp;gt; wiki direct access&lt;br /&gt;
** http://owncloud.cedeus.cl =&amp;gt; owncloud direct access =&amp;gt; path to add in OwnCloud client: http://owncloud.cedeus.cl/owncloud/ (not ''https'')&lt;br /&gt;
** http://indicadores.cedeus.cl =&amp;gt; Indicator webpage direct access&lt;br /&gt;
&lt;br /&gt;
'''Technical Configuration'''&lt;br /&gt;
* GeoNode WebServer is Cedeusgeonode: http://observatorio.cedeus.cl : open to world [http://live.osgeo.org/en/quickstart/geonode_quickstart.html OSGeo Quickstart]&lt;br /&gt;
* GeoNode DataServer is CedeusDB  : access is closed to world&lt;br /&gt;
&lt;br /&gt;
[[Libros del Observatorio]]&lt;br /&gt;
&lt;br /&gt;
== Funciones de Infraestructuras Científicos de Datos Espaciales ==&lt;br /&gt;
Bernard L, Mäs S, Müller M, Henzen C, y J Brauner (2013, [http://www.tandfonline.com/doi/abs/10.1080/17538947.2013.781244 J. o. Digital Earth]):&lt;br /&gt;
* encontrar y acceder al datos (=&amp;gt; importante: accuracy and scale, lineage and usage)&lt;br /&gt;
* integrar, procesar y analisar informaciones encontrados (=&amp;gt; oferecer servicios de procesamiento geo-espacial y permitir su integracion)&lt;br /&gt;
* publicar y compartir datos, métodos y resultados científicos&lt;br /&gt;
&lt;br /&gt;
== Tareas para crear la IDE de Cedeus ==&lt;br /&gt;
my [[CEDEUS ShortTime ToDo List]]&lt;br /&gt;
&lt;br /&gt;
CEDEUS Long term ToDo list:&lt;br /&gt;
# [[IDEs de Chile existente]]&lt;br /&gt;
# [[Cedeus Technical Architecture]]&lt;br /&gt;
#* TODO: security aspects of the IDE (user types, access management options)&lt;br /&gt;
# DOCUMENTO: Borrador de Proyecto -  development plan for future (clients v.2 v.3) - '''15. Dec.'''&lt;br /&gt;
# ENCUESTA : user and data survey&lt;br /&gt;
#* primero encuesta - hecho en '''Diciembre 2013''' por Nicolas, me mande archivos con la presentación y resultado&lt;br /&gt;
#* documents to prepare: (i) envisioned types of IDE use, (ii) list of data (themes) that may be in the institute (checklist?), (iii) data that should not be public, (iv) client types =&amp;gt; a mindmap exists already!!&lt;br /&gt;
# DATOS:&lt;br /&gt;
#* [[Cedeus Base Data]]&lt;br /&gt;
#* [[Cedeus Convenios]]&lt;br /&gt;
#* Notes:&lt;br /&gt;
#** EPSG Santiago (from OCUC dataset): 32719 (= UTM Zone 19 South), EPSG OSM: 4326&lt;br /&gt;
#** what exists&lt;br /&gt;
#** access rights (see GeoNode access options: public, logged-in user, group, user only)&lt;br /&gt;
#** stoarge/db structure (defined by storage structure of GeoNode for shapefiles, rasters are stored in web-folder)&lt;br /&gt;
# [[Cedeus Metadata]]&lt;br /&gt;
#* [[CEDEUS CSW]]&lt;br /&gt;
# TYPO DE CLIENTES&lt;br /&gt;
#* desktop clients - SIG : TODO inicio de encuesta en los grupos que usan: ArcGIS, QGIS, gvSIG, OpenJUMP, SAGA ... &lt;br /&gt;
#* web client- browsers : TODO: a desarrollar&lt;br /&gt;
#*# [[IDE Client Basica]] : visualisacion de datos solamente&lt;br /&gt;
#*# [[IDE Client Avanzado]] : con diseno, para ciudadanos&lt;br /&gt;
#*# [[IDE Client Experto]] : visualisacion, aggregar, manipular&lt;br /&gt;
&lt;br /&gt;
== información útil y documentación  ==&lt;br /&gt;
*[[accessing server infra]]&lt;br /&gt;
*[[setting up osgeo vm]]&lt;br /&gt;
*[[setting up geonode]] and [[geonode data upload]]&lt;br /&gt;
*[[backup of geonode]]&lt;br /&gt;
*[[setting up tilestream]] and [[Setting up Tilestream VM on CEDEUSDB]]&lt;br /&gt;
* How to setup [http://docs.geoserver.org/stable/en/user/installation/linux/index.html GeoServer] is described in this blog entry: http://houhongru.com/blog/2013/01/07/How-to-install-GeoServer-on-Ubuntu-12.04/ . However, I am not sure if the install of Oracles Java instead of openJDK is necessary, since, as far as I recall, the OSGeo LiveDVD uses OpenJDK as well. Location of GeoServer will be ''/var/lib/tomcat7/webapps/'' . (Note, I should have a PDF of that in my projects/planyourplace/docs/development/wyp/)&lt;br /&gt;
*[[setting up walkyourplace]]&lt;br /&gt;
*[[moving the SF wiki]]&lt;br /&gt;
*[[installing OTP]] and [[updating OTP graph]]&lt;br /&gt;
*[[Setting up Elgg VM on CedeusGeoNode]]&lt;br /&gt;
*[[Cedeus DB backups]]&lt;br /&gt;
*[[Nominatim for Traffic Accident Database]]&lt;br /&gt;
*[[installing CartoDB for CEDEUS]]&lt;br /&gt;
*[[installing Omeka for CEDEUS]]&lt;br /&gt;
*[[Processing GeoData for CEDEUS]]&lt;br /&gt;
*[[Trabajo Cristian]]&lt;br /&gt;
**[[Walkyourplace Django]]&lt;br /&gt;
**[[Api rest WalkYourPlace]]&lt;br /&gt;
&lt;br /&gt;
== List of VMs ==&lt;br /&gt;
'''on CedeusGeoNode:''' (see also script: ''startcedeusvms.sh'')&lt;br /&gt;
* geonode1204 : 12GB : 6 cpus : 13080 (VRDE 7767) with 200GB (185GB) disk =&amp;gt; disk name: geonode1204b.vdi. How to enlarge the disk check [[Nominatim for Traffic Accident Database]] ... however, the Nominatim VM is using 14.04 and not 12.04. NB: this VM has the old pw &lt;br /&gt;
* opensuse132 2GB : 2 cpus : 18022 (with https webgui 18052+18547, not yet unblocked console 18161, VRDE 7772)&lt;br /&gt;
* wikicedeus : 2GB : 2 cpus : cedeus wiki on ''22080/wiki/'' (VRDE 7769)&lt;br /&gt;
* mediawiki : 2GB : 2 cpus : personal wiki on ''21080/mediawiki-1.22.7/'' (VRDE 7771)&lt;br /&gt;
* elgg : 4 GB : 4 cpus : 15080 (VRDE 7765) on basicubuntu1404 with LAMPS&lt;br /&gt;
* additional there are for testing:&lt;br /&gt;
** basicubuntu1404&lt;br /&gt;
** geonode1404 : 8GB : 6 cpus : 12080 (VRDE 7768) - this VM is not in use (without GeoNode install)&lt;br /&gt;
** wyp : 8GB : 4 cpus : 17080 (with Tomcat and Postgres: 17088 vs 17032, VRDE 3389) http://146.155.17.19:17080/wypwps/&lt;br /&gt;
** elgg18pyp : 2GB, 2cpus : 31080 (VRDE 31065) - VM should be shut down &lt;br /&gt;
** windows864 3GB : 3 cpus (VRDE 7773) 40 GB&lt;br /&gt;
** windowsml1 3GB : 3 cpus (VRDE 7774) 40 GB&lt;br /&gt;
&lt;br /&gt;
'''on CedeusDB:'''&lt;br /&gt;
(no startup script yet)&lt;br /&gt;
* tilestream :  8GB : 4 cpus : with Tilestream on ''16088/#!/map/Fondef'' (VRDE 3389) : http://146.155.17.18:16088/#!/map/Fondef&lt;br /&gt;
*: =&amp;gt; switched off&lt;br /&gt;
* nominatim: 4GB : 4 cpus 200GB : with Nominatim on 146.155.17.18:22080 (VRDE 7761) &lt;br /&gt;
*: =&amp;gt; Note, Nominatim has port CONFLICT with Gatherer; TODO: fix this&lt;br /&gt;
*: =&amp;gt; Running only when needed&lt;br /&gt;
* otp09: 4GB : 4cpus  : on 146.155.17.18:30088 (VRDE 7762) : http://146.155.17.18:30088/opentripplanner-webapp/#/ : (OpenTripPlanner 0.9)&lt;br /&gt;
* cartodb: 8 GB : 6 cpus : on 146.155.17.18:19080 (VRDE 7763) =&amp;gt; for testing, but never got it really to work&lt;br /&gt;
*: =&amp;gt; switched off &lt;br /&gt;
* omeka: 6 GB : 4 cpus : on 146.155.17.18:20080 (VRDE 7764) : http://146.155.17.18:20080/omeka/&lt;br /&gt;
* owncloud: 6GB : 4 cpus : on 146.155.17.18:17080 (VRDE 7765) : http://146.155.17.18:17080/owncloud/ =&amp;gt; http://owncloud.cedeus.cl&lt;br /&gt;
* gitlab: 4GB : 2 cpus : on 146.155.17.18:18080 (VRDE 7766) : http://146.155.17.18:18080/  (Off, trasladada a http://146.155.17.14:18080/ )&lt;br /&gt;
* indicator 1GB : 1 cpus : on 146.155.17.18:21080 (VRDE 7767) : http://146.155.17.18:21080/&lt;br /&gt;
* gatherer 2GB : 1 cpus : on 146.155.17.18:22080 (VRDE 7768) : &lt;br /&gt;
* otp 4GB : 4 cpus : on 146.155.17.18:23080 (VRDE 7769) : http://146.155.17.18:23080/ (OpenTripPlanner 0.20) (off, trasladada a http://146.155.17.19:17050/ )&lt;br /&gt;
* overpass : 4 GB : 2 cpus : on 146.155.17.18:24080 (VRDE 7770) : http://146.155.17.18:24080/api/interpreter/data=[data] (off, trasladada a http://146.155.17.19:17051/ )&lt;br /&gt;
* fondedoc : 2 GB : 1 cpus : on 146.155.17.18:25080 (VRDE 7772) : http://146.155.17.18:25080 para proyector, http://146.155.17.18:25080/tablet para tablet&lt;br /&gt;
* geonode20b : 12 GB : 6 cpus : on 146.155.17.18:16080 (VRDE 3389) : http://146.155.17.18:16080 =&amp;gt; Copy of GeoNode from June 2015 we used for bug fixing&lt;br /&gt;
*: =&amp;gt; Note, geonode20b has port CONFLICT with tilestream VM&lt;br /&gt;
*: =&amp;gt; switched off&lt;br /&gt;
* geonodeTest: 8 GB : 4 cpus : on 146.155.17.18:16080 (VRDE 7771) : http://146.155.17.18:16080 =&amp;gt; Test of Geonode 2.4&lt;br /&gt;
*: =&amp;gt; Note, port CONFLICT with tilestream and geonode20b&lt;br /&gt;
&lt;br /&gt;
'''CedeusGeoNode reverse-proxy + geosteiniger.cl DNS zone editor settings'''&lt;br /&gt;
* GeoNode: 146.155.17.19:13080 =&amp;gt; geonode1204 VM =&amp;gt; cedeusdata.geosteiniger.cl&lt;br /&gt;
* Personal wiki : 1146.155.17.19:21080/mediawiki-1.22.7/ =&amp;gt; wiki.geosteiniger.cl/wiki/&lt;br /&gt;
* Cedeus wiki : 146.155.17.19/wiki/ =&amp;gt; Wiki VM =&amp;gt; cedeuswiki.geosteiniger.cl/wiki/&lt;br /&gt;
* OTP : 146.155.17.54:8080/opentripplanner-webapp/ =&amp;gt; otp.geosteiniger.cl/opentripplanner-webapp/&lt;br /&gt;
* Tilestream 146.155.17.18:16088/#!/map/Fondef =&amp;gt; tilestream.geosteiniger.cl/#!/map/Fondef&lt;br /&gt;
&lt;br /&gt;
Hosting info for [http://www.tcpiputils.com/browse/domain/puc.cl Puc.cl] -&amp;gt; name servers etc.&lt;br /&gt;
&lt;br /&gt;
== presentaciones ==&lt;br /&gt;
* 18.Dic.2014 : Coloquio &amp;quot;IDE Universidades&amp;quot; de SNIT (M. Bienes) - [http://www.geo.uzh.ch/~sstein/presentations/cedeus/idecedeus.html#0 progreso parte tecnico]&lt;br /&gt;
* xxx&lt;br /&gt;
== cache == &lt;br /&gt;
[[blackboard]]&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Cedeus_IDE</id>
		<title>Cedeus IDE</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Cedeus_IDE"/>
				<updated>2017-06-23T20:49:28Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* List of VMs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Centro de Desarrollo Urbano Sustentable - CEDEUS'''&lt;br /&gt;
&lt;br /&gt;
* Observatory Webpage: &lt;br /&gt;
** http://observatorio.cedeus.cl or http://www.datosurbanos.cl&lt;br /&gt;
* Other service domains:&lt;br /&gt;
** http://datos.cedeus.cl =&amp;gt; geonode direct access&lt;br /&gt;
** http://pubs.cedeus.cl =&amp;gt; omeka direct access&lt;br /&gt;
** http://wiki.cedeus.cl =&amp;gt; wiki direct access&lt;br /&gt;
** http://owncloud.cedeus.cl =&amp;gt; owncloud direct access =&amp;gt; path to add in OwnCloud client: http://owncloud.cedeus.cl/owncloud/ (not ''https'')&lt;br /&gt;
** http://indicadores.cedeus.cl =&amp;gt; Indicator webpage direct access&lt;br /&gt;
&lt;br /&gt;
'''Technical Configuration'''&lt;br /&gt;
* GeoNode WebServer is Cedeusgeonode: http://observatorio.cedeus.cl : open to world [http://live.osgeo.org/en/quickstart/geonode_quickstart.html OSGeo Quickstart]&lt;br /&gt;
* GeoNode DataServer is CedeusDB  : access is closed to world&lt;br /&gt;
&lt;br /&gt;
[[Libros del Observatorio]]&lt;br /&gt;
&lt;br /&gt;
== Funciones de Infraestructuras Científicos de Datos Espaciales ==&lt;br /&gt;
Bernard L, Mäs S, Müller M, Henzen C, y J Brauner (2013, [http://www.tandfonline.com/doi/abs/10.1080/17538947.2013.781244 J. o. Digital Earth]):&lt;br /&gt;
* encontrar y acceder al datos (=&amp;gt; importante: accuracy and scale, lineage and usage)&lt;br /&gt;
* integrar, procesar y analisar informaciones encontrados (=&amp;gt; oferecer servicios de procesamiento geo-espacial y permitir su integracion)&lt;br /&gt;
* publicar y compartir datos, métodos y resultados científicos&lt;br /&gt;
&lt;br /&gt;
== Tareas para crear la IDE de Cedeus ==&lt;br /&gt;
my [[CEDEUS ShortTime ToDo List]]&lt;br /&gt;
&lt;br /&gt;
CEDEUS Long term ToDo list:&lt;br /&gt;
# [[IDEs de Chile existente]]&lt;br /&gt;
# [[Cedeus Technical Architecture]]&lt;br /&gt;
#* TODO: security aspects of the IDE (user types, access management options)&lt;br /&gt;
# DOCUMENTO: Borrador de Proyecto -  development plan for future (clients v.2 v.3) - '''15. Dec.'''&lt;br /&gt;
# ENCUESTA : user and data survey&lt;br /&gt;
#* primero encuesta - hecho en '''Diciembre 2013''' por Nicolas, me mande archivos con la presentación y resultado&lt;br /&gt;
#* documents to prepare: (i) envisioned types of IDE use, (ii) list of data (themes) that may be in the institute (checklist?), (iii) data that should not be public, (iv) client types =&amp;gt; a mindmap exists already!!&lt;br /&gt;
# DATOS:&lt;br /&gt;
#* [[Cedeus Base Data]]&lt;br /&gt;
#* [[Cedeus Convenios]]&lt;br /&gt;
#* Notes:&lt;br /&gt;
#** EPSG Santiago (from OCUC dataset): 32719 (= UTM Zone 19 South), EPSG OSM: 4326&lt;br /&gt;
#** what exists&lt;br /&gt;
#** access rights (see GeoNode access options: public, logged-in user, group, user only)&lt;br /&gt;
#** stoarge/db structure (defined by storage structure of GeoNode for shapefiles, rasters are stored in web-folder)&lt;br /&gt;
# [[Cedeus Metadata]]&lt;br /&gt;
#* [[CEDEUS CSW]]&lt;br /&gt;
# TYPO DE CLIENTES&lt;br /&gt;
#* desktop clients - SIG : TODO inicio de encuesta en los grupos que usan: ArcGIS, QGIS, gvSIG, OpenJUMP, SAGA ... &lt;br /&gt;
#* web client- browsers : TODO: a desarrollar&lt;br /&gt;
#*# [[IDE Client Basica]] : visualisacion de datos solamente&lt;br /&gt;
#*# [[IDE Client Avanzado]] : con diseno, para ciudadanos&lt;br /&gt;
#*# [[IDE Client Experto]] : visualisacion, aggregar, manipular&lt;br /&gt;
&lt;br /&gt;
== información útil y documentación  ==&lt;br /&gt;
*[[accessing server infra]]&lt;br /&gt;
*[[setting up osgeo vm]]&lt;br /&gt;
*[[setting up geonode]] and [[geonode data upload]]&lt;br /&gt;
*[[backup of geonode]]&lt;br /&gt;
*[[setting up tilestream]] and [[Setting up Tilestream VM on CEDEUSDB]]&lt;br /&gt;
* How to setup [http://docs.geoserver.org/stable/en/user/installation/linux/index.html GeoServer] is described in this blog entry: http://houhongru.com/blog/2013/01/07/How-to-install-GeoServer-on-Ubuntu-12.04/ . However, I am not sure if the install of Oracles Java instead of openJDK is necessary, since, as far as I recall, the OSGeo LiveDVD uses OpenJDK as well. Location of GeoServer will be ''/var/lib/tomcat7/webapps/'' . (Note, I should have a PDF of that in my projects/planyourplace/docs/development/wyp/)&lt;br /&gt;
*[[setting up walkyourplace]]&lt;br /&gt;
*[[moving the SF wiki]]&lt;br /&gt;
*[[installing OTP]] and [[updating OTP graph]]&lt;br /&gt;
*[[Setting up Elgg VM on CedeusGeoNode]]&lt;br /&gt;
*[[Cedeus DB backups]]&lt;br /&gt;
*[[Nominatim for Traffic Accident Database]]&lt;br /&gt;
*[[installing CartoDB for CEDEUS]]&lt;br /&gt;
*[[installing Omeka for CEDEUS]]&lt;br /&gt;
*[[Processing GeoData for CEDEUS]]&lt;br /&gt;
*[[Trabajo Cristian]]&lt;br /&gt;
**[[Walkyourplace Django]]&lt;br /&gt;
&lt;br /&gt;
== List of VMs ==&lt;br /&gt;
'''on CedeusGeoNode:''' (see also script: ''startcedeusvms.sh'')&lt;br /&gt;
* geonode1204 : 12GB : 6 cpus : 13080 (VRDE 7767) with 200GB (185GB) disk =&amp;gt; disk name: geonode1204b.vdi. How to enlarge the disk check [[Nominatim for Traffic Accident Database]] ... however, the Nominatim VM is using 14.04 and not 12.04. NB: this VM has the old pw &lt;br /&gt;
* opensuse132 2GB : 2 cpus : 18022 (with https webgui 18052+18547, not yet unblocked console 18161, VRDE 7772)&lt;br /&gt;
* wikicedeus : 2GB : 2 cpus : cedeus wiki on ''22080/wiki/'' (VRDE 7769)&lt;br /&gt;
* mediawiki : 2GB : 2 cpus : personal wiki on ''21080/mediawiki-1.22.7/'' (VRDE 7771)&lt;br /&gt;
* elgg : 4 GB : 4 cpus : 15080 (VRDE 7765) on basicubuntu1404 with LAMPS&lt;br /&gt;
* additional there are for testing:&lt;br /&gt;
** basicubuntu1404&lt;br /&gt;
** geonode1404 : 8GB : 6 cpus : 12080 (VRDE 7768) - this VM is not in use (without GeoNode install)&lt;br /&gt;
** wyp : 8GB : 4 cpus : 17080 (with Tomcat and Postgres: 17088 vs 17032, VRDE 3389) http://146.155.17.19:17080/wypwps/&lt;br /&gt;
** elgg18pyp : 2GB, 2cpus : 31080 (VRDE 31065) - VM should be shut down &lt;br /&gt;
** windows864 3GB : 3 cpus (VRDE 7773) 40 GB&lt;br /&gt;
** windowsml1 3GB : 3 cpus (VRDE 7774) 40 GB&lt;br /&gt;
&lt;br /&gt;
'''on CedeusDB:'''&lt;br /&gt;
(no startup script yet)&lt;br /&gt;
* tilestream :  8GB : 4 cpus : with Tilestream on ''16088/#!/map/Fondef'' (VRDE 3389) : http://146.155.17.18:16088/#!/map/Fondef&lt;br /&gt;
*: =&amp;gt; switched off&lt;br /&gt;
* nominatim: 4GB : 4 cpus 200GB : with Nominatim on 146.155.17.18:22080 (VRDE 7761) &lt;br /&gt;
*: =&amp;gt; Note, Nominatim has port CONFLICT with Gatherer; TODO: fix this&lt;br /&gt;
*: =&amp;gt; Running only when needed&lt;br /&gt;
* otp09: 4GB : 4cpus  : on 146.155.17.18:30088 (VRDE 7762) : http://146.155.17.18:30088/opentripplanner-webapp/#/ : (OpenTripPlanner 0.9)&lt;br /&gt;
* cartodb: 8 GB : 6 cpus : on 146.155.17.18:19080 (VRDE 7763) =&amp;gt; for testing, but never got it really to work&lt;br /&gt;
*: =&amp;gt; switched off &lt;br /&gt;
* omeka: 6 GB : 4 cpus : on 146.155.17.18:20080 (VRDE 7764) : http://146.155.17.18:20080/omeka/&lt;br /&gt;
* owncloud: 6GB : 4 cpus : on 146.155.17.18:17080 (VRDE 7765) : http://146.155.17.18:17080/owncloud/ =&amp;gt; http://owncloud.cedeus.cl&lt;br /&gt;
* gitlab: 4GB : 2 cpus : on 146.155.17.18:18080 (VRDE 7766) : http://146.155.17.18:18080/  (Off, trasladada a http://146.155.17.14:18080/ )&lt;br /&gt;
* indicator 1GB : 1 cpus : on 146.155.17.18:21080 (VRDE 7767) : http://146.155.17.18:21080/&lt;br /&gt;
* gatherer 2GB : 1 cpus : on 146.155.17.18:22080 (VRDE 7768) : &lt;br /&gt;
* otp 4GB : 4 cpus : on 146.155.17.18:23080 (VRDE 7769) : http://146.155.17.18:23080/ (OpenTripPlanner 0.20) (off, trasladada a http://146.155.17.19:17050/ )&lt;br /&gt;
* overpass : 4 GB : 2 cpus : on 146.155.17.18:24080 (VRDE 7770) : http://146.155.17.18:24080/api/interpreter/data=[data] (off, trasladada a http://146.155.17.19:17051/ )&lt;br /&gt;
* fondedoc : 2 GB : 1 cpus : on 146.155.17.18:25080 (VRDE 7772) : http://146.155.17.18:25080 para proyector, http://146.155.17.18:25080/tablet para tablet&lt;br /&gt;
* geonode20b : 12 GB : 6 cpus : on 146.155.17.18:16080 (VRDE 3389) : http://146.155.17.18:16080 =&amp;gt; Copy of GeoNode from June 2015 we used for bug fixing&lt;br /&gt;
*: =&amp;gt; Note, geonode20b has port CONFLICT with tilestream VM&lt;br /&gt;
*: =&amp;gt; switched off&lt;br /&gt;
* geonodeTest: 8 GB : 4 cpus : on 146.155.17.18:16080 (VRDE 7771) : http://146.155.17.18:16080 =&amp;gt; Test of Geonode 2.4&lt;br /&gt;
*: =&amp;gt; Note, port CONFLICT with tilestream and geonode20b&lt;br /&gt;
&lt;br /&gt;
'''CedeusGeoNode reverse-proxy + geosteiniger.cl DNS zone editor settings'''&lt;br /&gt;
* GeoNode: 146.155.17.19:13080 =&amp;gt; geonode1204 VM =&amp;gt; cedeusdata.geosteiniger.cl&lt;br /&gt;
* Personal wiki : 1146.155.17.19:21080/mediawiki-1.22.7/ =&amp;gt; wiki.geosteiniger.cl/wiki/&lt;br /&gt;
* Cedeus wiki : 146.155.17.19/wiki/ =&amp;gt; Wiki VM =&amp;gt; cedeuswiki.geosteiniger.cl/wiki/&lt;br /&gt;
* OTP : 146.155.17.54:8080/opentripplanner-webapp/ =&amp;gt; otp.geosteiniger.cl/opentripplanner-webapp/&lt;br /&gt;
* Tilestream 146.155.17.18:16088/#!/map/Fondef =&amp;gt; tilestream.geosteiniger.cl/#!/map/Fondef&lt;br /&gt;
&lt;br /&gt;
Hosting info for [http://www.tcpiputils.com/browse/domain/puc.cl Puc.cl] -&amp;gt; name servers etc.&lt;br /&gt;
&lt;br /&gt;
== presentaciones ==&lt;br /&gt;
* 18.Dic.2014 : Coloquio &amp;quot;IDE Universidades&amp;quot; de SNIT (M. Bienes) - [http://www.geo.uzh.ch/~sstein/presentations/cedeus/idecedeus.html#0 progreso parte tecnico]&lt;br /&gt;
* xxx&lt;br /&gt;
== cache == &lt;br /&gt;
[[blackboard]]&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2017-04-03T22:21:24Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Link de interes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
== Agregar -18 y .14 al apagado ==&lt;br /&gt;
&lt;br /&gt;
http://2tazasdelinux.blogspot.cl/2014/11/controlar-nuestro-sai-con-nut.html&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
== Actualizar la información ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información es necesario ir revisando los cambios de los archivos GTFS que se encuentran disponibles en la red, cuando notemos que uno es más nuevo es necesario descargarlo y ubicarlo en la carpeta que contiene todos los archivos similares (Actualmente se está utilizando la carpeta /home/csfuente/otpTransantiago ) por lo que entramos a dicha carpeta y descargamos los datos con '''wget'''. Finalmente reiniciamos la VM, esperamos a que inicie (cerca de ~10 minutos) y estará con todos los datos actualizados.&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CartoDB =&lt;br /&gt;
&lt;br /&gt;
== Levantar CartoDB cuando la máquina es encendida ==&lt;br /&gt;
&lt;br /&gt;
Subir CartoDB es un poco tedioso pero es posible sin complicaciónes, lo primero es exportar lo siguiente: (copy/paste a la terminal)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PATH=$PATH:/opt/rubies/ruby-2.2.3/bin&lt;br /&gt;
export CPLUS_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export C_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:$PWD/node_modules/grunt-cli/bin&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En mi cuenta agregué esas lineas al archivo .bashrc para que se ejecuten cada vez que entro por ssh a la VM.&lt;br /&gt;
Lo siguiente es ejecutar los procesos necesarios para que cartodb corra, para ello se ejecuta cada uno de ellos en una screen distinta (ya que no contamos con varias terminales por ssh)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/&lt;br /&gt;
screen&lt;br /&gt;
redis-server&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd cartodb&lt;br /&gt;
screen&lt;br /&gt;
bundle exec script/resque&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
bundle exec thin start --threaded -p 3000 --threadpool-size 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/Wireshark***&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/CartoDB-SQL-API&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
Con todo esto ahora podemos entrar a 146.155.17.18:3000 y usar cartodb.&lt;br /&gt;
&lt;br /&gt;
== Puertos utilizados en .18 por cartodb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Puerto&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Servicio&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:3000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb-SQL-API&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8181&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Wireshark&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:6379&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | redis-server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Obtener polígonos formato .poly de ciudades =&lt;br /&gt;
&lt;br /&gt;
Gracias a las instrucciones dadas en https://github.com/JamesChevalier/cities podemos obtener el polígono de la ciudad solicitada, los pasos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Entrar a http://nominatim.openstreetmap.org/ y poner en el buscador la ciudad que estamos buscando&lt;br /&gt;
* Al encontrarla, nos vamos a sus Detalles&lt;br /&gt;
* Copiamos el número que aparece en OSM: Relation '''XXXXXX'''&lt;br /&gt;
* Vamos a  http://polygons.openstreetmap.fr/ y pegamos éste número en '''Id of relation'''&lt;br /&gt;
* Descargamos la información en el link '''poly''' correspondiente&lt;br /&gt;
&lt;br /&gt;
= Migración OTP, Overpass en VM de WYP =&lt;br /&gt;
&lt;br /&gt;
== Migración de OTP ==&lt;br /&gt;
&lt;br /&gt;
Con el trabajo realizado ya de la instalación de OTP más arriba en esta wiki, se movió la carpeta en la cual fue compilado el repositorio junto con los graphs generados hasta entonces a la VM de WYP. los archivos quedaron en la carpeta /home/csfuente/OTP/ en donde se es posible ejecutar el servidor sin problemas.&lt;br /&gt;
OTP al ser ejecutado, su servidor trabaja en el puerto 5050 por lo que se creó una nueva regla nat para la VM el cual se es posible llegar a ella mediante el puerto 17050 en el servidor .19.&lt;br /&gt;
&lt;br /&gt;
El comando para ser ejecutado en esta VM es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Migración de Overpass ==&lt;br /&gt;
&lt;br /&gt;
Al igual que OTP, Overpass no es necesario ser recompilado. Los archivos de Overpass fueron trasladados a la VM a la carpeta /home/csfuente/Overpass/ y al ser ejecutado funciona directamente en el puerto 80. La regla nat fue modificada para apache redirigiendo lo del puerto 80 al puerto 17051 del servidor .19.&lt;br /&gt;
&lt;br /&gt;
Tambien fue necesario agregar las reglas de Apache2 correspondientes (también en esta misma wiki)&lt;br /&gt;
&lt;br /&gt;
Para ejecutarlo en esta VM es necesario escribir en la terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificaciones en arranque de WYP ==&lt;br /&gt;
&lt;br /&gt;
WYP estaba funcionando bajo Nginx, el cual se encargaba de redirigir el puerto 8000 al puerto 80 para que fuera leido por .19 en su puerto 17080. Para no modificar la URL de WYP fue necesario volver a cambiar a apache2 y ejecutar Django en el puerto 81. Crear una nueva regla nat para que leyera el puerto 81 de la VM y fuera ejecutado en 17080. De esta forma la URL no cambia para éste.&lt;br /&gt;
&lt;br /&gt;
El nuevo comando para ejeutar WYP es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar todos los procesos al iniciar la VM ==&lt;br /&gt;
&lt;br /&gt;
Para ello fue necesario editar el archivo '''/etc/rc.local'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
#&lt;br /&gt;
# rc.local&lt;br /&gt;
#&lt;br /&gt;
# This script is executed at the end of each multiuser runlevel.&lt;br /&gt;
# Make sure that the script will &amp;quot;exit 0&amp;quot; on success or any other&lt;br /&gt;
# value on error.&lt;br /&gt;
#&lt;br /&gt;
# In order to enable or disable this script just change the execution&lt;br /&gt;
# bits.&lt;br /&gt;
#&lt;br /&gt;
# By default this script does nothing.&lt;br /&gt;
&lt;br /&gt;
# Overpass&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# WYP&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# OTP&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
~        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Actualizar archivo OSM con un archivo OSC =&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información con calles/nodos/parques nuevos en un arhivo de formato OSM, es necesario generar un archivo OSC. Para combinarlos hay que usar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
osmchange -i=old.osm changefile.osc &amp;gt;new.osm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Link de interes ==&lt;br /&gt;
&lt;br /&gt;
http://wiki.openstreetmap.org/wiki/Osmchange_(program)&lt;br /&gt;
http://wiki.openstreetmap.org/wiki/Osmchange&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2017-04-03T22:21:17Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Actualizar archivo OSM con un archivo OSC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
== Agregar -18 y .14 al apagado ==&lt;br /&gt;
&lt;br /&gt;
http://2tazasdelinux.blogspot.cl/2014/11/controlar-nuestro-sai-con-nut.html&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
== Actualizar la información ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información es necesario ir revisando los cambios de los archivos GTFS que se encuentran disponibles en la red, cuando notemos que uno es más nuevo es necesario descargarlo y ubicarlo en la carpeta que contiene todos los archivos similares (Actualmente se está utilizando la carpeta /home/csfuente/otpTransantiago ) por lo que entramos a dicha carpeta y descargamos los datos con '''wget'''. Finalmente reiniciamos la VM, esperamos a que inicie (cerca de ~10 minutos) y estará con todos los datos actualizados.&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CartoDB =&lt;br /&gt;
&lt;br /&gt;
== Levantar CartoDB cuando la máquina es encendida ==&lt;br /&gt;
&lt;br /&gt;
Subir CartoDB es un poco tedioso pero es posible sin complicaciónes, lo primero es exportar lo siguiente: (copy/paste a la terminal)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PATH=$PATH:/opt/rubies/ruby-2.2.3/bin&lt;br /&gt;
export CPLUS_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export C_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:$PWD/node_modules/grunt-cli/bin&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En mi cuenta agregué esas lineas al archivo .bashrc para que se ejecuten cada vez que entro por ssh a la VM.&lt;br /&gt;
Lo siguiente es ejecutar los procesos necesarios para que cartodb corra, para ello se ejecuta cada uno de ellos en una screen distinta (ya que no contamos con varias terminales por ssh)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/&lt;br /&gt;
screen&lt;br /&gt;
redis-server&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd cartodb&lt;br /&gt;
screen&lt;br /&gt;
bundle exec script/resque&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
bundle exec thin start --threaded -p 3000 --threadpool-size 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/Wireshark***&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/CartoDB-SQL-API&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
Con todo esto ahora podemos entrar a 146.155.17.18:3000 y usar cartodb.&lt;br /&gt;
&lt;br /&gt;
== Puertos utilizados en .18 por cartodb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Puerto&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Servicio&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:3000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb-SQL-API&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8181&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Wireshark&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:6379&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | redis-server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Obtener polígonos formato .poly de ciudades =&lt;br /&gt;
&lt;br /&gt;
Gracias a las instrucciones dadas en https://github.com/JamesChevalier/cities podemos obtener el polígono de la ciudad solicitada, los pasos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Entrar a http://nominatim.openstreetmap.org/ y poner en el buscador la ciudad que estamos buscando&lt;br /&gt;
* Al encontrarla, nos vamos a sus Detalles&lt;br /&gt;
* Copiamos el número que aparece en OSM: Relation '''XXXXXX'''&lt;br /&gt;
* Vamos a  http://polygons.openstreetmap.fr/ y pegamos éste número en '''Id of relation'''&lt;br /&gt;
* Descargamos la información en el link '''poly''' correspondiente&lt;br /&gt;
&lt;br /&gt;
= Migración OTP, Overpass en VM de WYP =&lt;br /&gt;
&lt;br /&gt;
== Migración de OTP ==&lt;br /&gt;
&lt;br /&gt;
Con el trabajo realizado ya de la instalación de OTP más arriba en esta wiki, se movió la carpeta en la cual fue compilado el repositorio junto con los graphs generados hasta entonces a la VM de WYP. los archivos quedaron en la carpeta /home/csfuente/OTP/ en donde se es posible ejecutar el servidor sin problemas.&lt;br /&gt;
OTP al ser ejecutado, su servidor trabaja en el puerto 5050 por lo que se creó una nueva regla nat para la VM el cual se es posible llegar a ella mediante el puerto 17050 en el servidor .19.&lt;br /&gt;
&lt;br /&gt;
El comando para ser ejecutado en esta VM es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Migración de Overpass ==&lt;br /&gt;
&lt;br /&gt;
Al igual que OTP, Overpass no es necesario ser recompilado. Los archivos de Overpass fueron trasladados a la VM a la carpeta /home/csfuente/Overpass/ y al ser ejecutado funciona directamente en el puerto 80. La regla nat fue modificada para apache redirigiendo lo del puerto 80 al puerto 17051 del servidor .19.&lt;br /&gt;
&lt;br /&gt;
Tambien fue necesario agregar las reglas de Apache2 correspondientes (también en esta misma wiki)&lt;br /&gt;
&lt;br /&gt;
Para ejecutarlo en esta VM es necesario escribir en la terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificaciones en arranque de WYP ==&lt;br /&gt;
&lt;br /&gt;
WYP estaba funcionando bajo Nginx, el cual se encargaba de redirigir el puerto 8000 al puerto 80 para que fuera leido por .19 en su puerto 17080. Para no modificar la URL de WYP fue necesario volver a cambiar a apache2 y ejecutar Django en el puerto 81. Crear una nueva regla nat para que leyera el puerto 81 de la VM y fuera ejecutado en 17080. De esta forma la URL no cambia para éste.&lt;br /&gt;
&lt;br /&gt;
El nuevo comando para ejeutar WYP es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar todos los procesos al iniciar la VM ==&lt;br /&gt;
&lt;br /&gt;
Para ello fue necesario editar el archivo '''/etc/rc.local'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
#&lt;br /&gt;
# rc.local&lt;br /&gt;
#&lt;br /&gt;
# This script is executed at the end of each multiuser runlevel.&lt;br /&gt;
# Make sure that the script will &amp;quot;exit 0&amp;quot; on success or any other&lt;br /&gt;
# value on error.&lt;br /&gt;
#&lt;br /&gt;
# In order to enable or disable this script just change the execution&lt;br /&gt;
# bits.&lt;br /&gt;
#&lt;br /&gt;
# By default this script does nothing.&lt;br /&gt;
&lt;br /&gt;
# Overpass&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# WYP&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# OTP&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
~        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Actualizar archivo OSM con un archivo OSC =&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información con calles/nodos/parques nuevos en un arhivo de formato OSM, es necesario generar un archivo OSC. Para combinarlos hay que usar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
osmchange -i=old.osm changefile.osc &amp;gt;new.osm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Link de interes =&lt;br /&gt;
&lt;br /&gt;
http://wiki.openstreetmap.org/wiki/Osmchange_(program)&lt;br /&gt;
http://wiki.openstreetmap.org/wiki/Osmchange&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2017-04-03T22:20:53Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
== Agregar -18 y .14 al apagado ==&lt;br /&gt;
&lt;br /&gt;
http://2tazasdelinux.blogspot.cl/2014/11/controlar-nuestro-sai-con-nut.html&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
== Actualizar la información ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información es necesario ir revisando los cambios de los archivos GTFS que se encuentran disponibles en la red, cuando notemos que uno es más nuevo es necesario descargarlo y ubicarlo en la carpeta que contiene todos los archivos similares (Actualmente se está utilizando la carpeta /home/csfuente/otpTransantiago ) por lo que entramos a dicha carpeta y descargamos los datos con '''wget'''. Finalmente reiniciamos la VM, esperamos a que inicie (cerca de ~10 minutos) y estará con todos los datos actualizados.&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CartoDB =&lt;br /&gt;
&lt;br /&gt;
== Levantar CartoDB cuando la máquina es encendida ==&lt;br /&gt;
&lt;br /&gt;
Subir CartoDB es un poco tedioso pero es posible sin complicaciónes, lo primero es exportar lo siguiente: (copy/paste a la terminal)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PATH=$PATH:/opt/rubies/ruby-2.2.3/bin&lt;br /&gt;
export CPLUS_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export C_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:$PWD/node_modules/grunt-cli/bin&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En mi cuenta agregué esas lineas al archivo .bashrc para que se ejecuten cada vez que entro por ssh a la VM.&lt;br /&gt;
Lo siguiente es ejecutar los procesos necesarios para que cartodb corra, para ello se ejecuta cada uno de ellos en una screen distinta (ya que no contamos con varias terminales por ssh)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/&lt;br /&gt;
screen&lt;br /&gt;
redis-server&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd cartodb&lt;br /&gt;
screen&lt;br /&gt;
bundle exec script/resque&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
bundle exec thin start --threaded -p 3000 --threadpool-size 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/Wireshark***&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/CartoDB-SQL-API&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
Con todo esto ahora podemos entrar a 146.155.17.18:3000 y usar cartodb.&lt;br /&gt;
&lt;br /&gt;
== Puertos utilizados en .18 por cartodb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Puerto&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Servicio&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:3000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb-SQL-API&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8181&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Wireshark&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:6379&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | redis-server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Obtener polígonos formato .poly de ciudades =&lt;br /&gt;
&lt;br /&gt;
Gracias a las instrucciones dadas en https://github.com/JamesChevalier/cities podemos obtener el polígono de la ciudad solicitada, los pasos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Entrar a http://nominatim.openstreetmap.org/ y poner en el buscador la ciudad que estamos buscando&lt;br /&gt;
* Al encontrarla, nos vamos a sus Detalles&lt;br /&gt;
* Copiamos el número que aparece en OSM: Relation '''XXXXXX'''&lt;br /&gt;
* Vamos a  http://polygons.openstreetmap.fr/ y pegamos éste número en '''Id of relation'''&lt;br /&gt;
* Descargamos la información en el link '''poly''' correspondiente&lt;br /&gt;
&lt;br /&gt;
= Migración OTP, Overpass en VM de WYP =&lt;br /&gt;
&lt;br /&gt;
== Migración de OTP ==&lt;br /&gt;
&lt;br /&gt;
Con el trabajo realizado ya de la instalación de OTP más arriba en esta wiki, se movió la carpeta en la cual fue compilado el repositorio junto con los graphs generados hasta entonces a la VM de WYP. los archivos quedaron en la carpeta /home/csfuente/OTP/ en donde se es posible ejecutar el servidor sin problemas.&lt;br /&gt;
OTP al ser ejecutado, su servidor trabaja en el puerto 5050 por lo que se creó una nueva regla nat para la VM el cual se es posible llegar a ella mediante el puerto 17050 en el servidor .19.&lt;br /&gt;
&lt;br /&gt;
El comando para ser ejecutado en esta VM es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Migración de Overpass ==&lt;br /&gt;
&lt;br /&gt;
Al igual que OTP, Overpass no es necesario ser recompilado. Los archivos de Overpass fueron trasladados a la VM a la carpeta /home/csfuente/Overpass/ y al ser ejecutado funciona directamente en el puerto 80. La regla nat fue modificada para apache redirigiendo lo del puerto 80 al puerto 17051 del servidor .19.&lt;br /&gt;
&lt;br /&gt;
Tambien fue necesario agregar las reglas de Apache2 correspondientes (también en esta misma wiki)&lt;br /&gt;
&lt;br /&gt;
Para ejecutarlo en esta VM es necesario escribir en la terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificaciones en arranque de WYP ==&lt;br /&gt;
&lt;br /&gt;
WYP estaba funcionando bajo Nginx, el cual se encargaba de redirigir el puerto 8000 al puerto 80 para que fuera leido por .19 en su puerto 17080. Para no modificar la URL de WYP fue necesario volver a cambiar a apache2 y ejecutar Django en el puerto 81. Crear una nueva regla nat para que leyera el puerto 81 de la VM y fuera ejecutado en 17080. De esta forma la URL no cambia para éste.&lt;br /&gt;
&lt;br /&gt;
El nuevo comando para ejeutar WYP es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar todos los procesos al iniciar la VM ==&lt;br /&gt;
&lt;br /&gt;
Para ello fue necesario editar el archivo '''/etc/rc.local'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
#&lt;br /&gt;
# rc.local&lt;br /&gt;
#&lt;br /&gt;
# This script is executed at the end of each multiuser runlevel.&lt;br /&gt;
# Make sure that the script will &amp;quot;exit 0&amp;quot; on success or any other&lt;br /&gt;
# value on error.&lt;br /&gt;
#&lt;br /&gt;
# In order to enable or disable this script just change the execution&lt;br /&gt;
# bits.&lt;br /&gt;
#&lt;br /&gt;
# By default this script does nothing.&lt;br /&gt;
&lt;br /&gt;
# Overpass&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# WYP&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# OTP&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
~        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Actualizar archivo OSM con un archivo OSC ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información con calles/nodos/parques nuevos en un arhivo de formato OSM, es necesario generar un archivo OSC. Para combinarlos hay que usar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
osmchange -i=old.osm changefile.osc &amp;gt;new.osm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Link de interes =&lt;br /&gt;
&lt;br /&gt;
http://wiki.openstreetmap.org/wiki/Osmchange_(program)&lt;br /&gt;
http://wiki.openstreetmap.org/wiki/Osmchange&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2017-03-17T21:38:28Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Migración OTP, Overpass en VM de WYP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
== Agregar -18 y .14 al apagado ==&lt;br /&gt;
&lt;br /&gt;
http://2tazasdelinux.blogspot.cl/2014/11/controlar-nuestro-sai-con-nut.html&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
== Actualizar la información ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información es necesario ir revisando los cambios de los archivos GTFS que se encuentran disponibles en la red, cuando notemos que uno es más nuevo es necesario descargarlo y ubicarlo en la carpeta que contiene todos los archivos similares (Actualmente se está utilizando la carpeta /home/csfuente/otpTransantiago ) por lo que entramos a dicha carpeta y descargamos los datos con '''wget'''. Finalmente reiniciamos la VM, esperamos a que inicie (cerca de ~10 minutos) y estará con todos los datos actualizados.&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CartoDB =&lt;br /&gt;
&lt;br /&gt;
== Levantar CartoDB cuando la máquina es encendida ==&lt;br /&gt;
&lt;br /&gt;
Subir CartoDB es un poco tedioso pero es posible sin complicaciónes, lo primero es exportar lo siguiente: (copy/paste a la terminal)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PATH=$PATH:/opt/rubies/ruby-2.2.3/bin&lt;br /&gt;
export CPLUS_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export C_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:$PWD/node_modules/grunt-cli/bin&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En mi cuenta agregué esas lineas al archivo .bashrc para que se ejecuten cada vez que entro por ssh a la VM.&lt;br /&gt;
Lo siguiente es ejecutar los procesos necesarios para que cartodb corra, para ello se ejecuta cada uno de ellos en una screen distinta (ya que no contamos con varias terminales por ssh)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/&lt;br /&gt;
screen&lt;br /&gt;
redis-server&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd cartodb&lt;br /&gt;
screen&lt;br /&gt;
bundle exec script/resque&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
bundle exec thin start --threaded -p 3000 --threadpool-size 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/Wireshark***&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/CartoDB-SQL-API&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
Con todo esto ahora podemos entrar a 146.155.17.18:3000 y usar cartodb.&lt;br /&gt;
&lt;br /&gt;
== Puertos utilizados en .18 por cartodb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Puerto&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Servicio&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:3000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb-SQL-API&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8181&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Wireshark&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:6379&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | redis-server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Obtener polígonos formato .poly de ciudades =&lt;br /&gt;
&lt;br /&gt;
Gracias a las instrucciones dadas en https://github.com/JamesChevalier/cities podemos obtener el polígono de la ciudad solicitada, los pasos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Entrar a http://nominatim.openstreetmap.org/ y poner en el buscador la ciudad que estamos buscando&lt;br /&gt;
* Al encontrarla, nos vamos a sus Detalles&lt;br /&gt;
* Copiamos el número que aparece en OSM: Relation '''XXXXXX'''&lt;br /&gt;
* Vamos a  http://polygons.openstreetmap.fr/ y pegamos éste número en '''Id of relation'''&lt;br /&gt;
* Descargamos la información en el link '''poly''' correspondiente&lt;br /&gt;
&lt;br /&gt;
= Migración OTP, Overpass en VM de WYP =&lt;br /&gt;
&lt;br /&gt;
== Migración de OTP ==&lt;br /&gt;
&lt;br /&gt;
Con el trabajo realizado ya de la instalación de OTP más arriba en esta wiki, se movió la carpeta en la cual fue compilado el repositorio junto con los graphs generados hasta entonces a la VM de WYP. los archivos quedaron en la carpeta /home/csfuente/OTP/ en donde se es posible ejecutar el servidor sin problemas.&lt;br /&gt;
OTP al ser ejecutado, su servidor trabaja en el puerto 5050 por lo que se creó una nueva regla nat para la VM el cual se es posible llegar a ella mediante el puerto 17050 en el servidor .19.&lt;br /&gt;
&lt;br /&gt;
El comando para ser ejecutado en esta VM es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Migración de Overpass ==&lt;br /&gt;
&lt;br /&gt;
Al igual que OTP, Overpass no es necesario ser recompilado. Los archivos de Overpass fueron trasladados a la VM a la carpeta /home/csfuente/Overpass/ y al ser ejecutado funciona directamente en el puerto 80. La regla nat fue modificada para apache redirigiendo lo del puerto 80 al puerto 17051 del servidor .19.&lt;br /&gt;
&lt;br /&gt;
Tambien fue necesario agregar las reglas de Apache2 correspondientes (también en esta misma wiki)&lt;br /&gt;
&lt;br /&gt;
Para ejecutarlo en esta VM es necesario escribir en la terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificaciones en arranque de WYP ==&lt;br /&gt;
&lt;br /&gt;
WYP estaba funcionando bajo Nginx, el cual se encargaba de redirigir el puerto 8000 al puerto 80 para que fuera leido por .19 en su puerto 17080. Para no modificar la URL de WYP fue necesario volver a cambiar a apache2 y ejecutar Django en el puerto 81. Crear una nueva regla nat para que leyera el puerto 81 de la VM y fuera ejecutado en 17080. De esta forma la URL no cambia para éste.&lt;br /&gt;
&lt;br /&gt;
El nuevo comando para ejeutar WYP es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar todos los procesos al iniciar la VM ==&lt;br /&gt;
&lt;br /&gt;
Para ello fue necesario editar el archivo '''/etc/rc.local'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
#&lt;br /&gt;
# rc.local&lt;br /&gt;
#&lt;br /&gt;
# This script is executed at the end of each multiuser runlevel.&lt;br /&gt;
# Make sure that the script will &amp;quot;exit 0&amp;quot; on success or any other&lt;br /&gt;
# value on error.&lt;br /&gt;
#&lt;br /&gt;
# In order to enable or disable this script just change the execution&lt;br /&gt;
# bits.&lt;br /&gt;
#&lt;br /&gt;
# By default this script does nothing.&lt;br /&gt;
&lt;br /&gt;
# Overpass&lt;br /&gt;
rm /home/csfuente/Overpass/db/osm3s* || true&lt;br /&gt;
rm /dev/shm/osm3s* || true&lt;br /&gt;
cd /home/csfuente/Overpass &amp;amp;&amp;amp; bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# WYP&lt;br /&gt;
cd /home/csfuente/wyp-django/ &amp;amp;&amp;amp; python manage.py runserver 0.0.0.0:81 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
# OTP&lt;br /&gt;
./home/csfuente/OTP/otp --server --basePath /home/csfuente/OTP/ --router chile --preFlight --autoScan --autoReload --port 5050 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
~        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Cedeus_IDE</id>
		<title>Cedeus IDE</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Cedeus_IDE"/>
				<updated>2017-03-17T21:26:08Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* List of VMs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Centro de Desarrollo Urbano Sustentable - CEDEUS'''&lt;br /&gt;
&lt;br /&gt;
* Observatory Webpage: &lt;br /&gt;
** http://observatorio.cedeus.cl or http://www.datosurbanos.cl&lt;br /&gt;
* Other service domains:&lt;br /&gt;
** http://datos.cedeus.cl =&amp;gt; geonode direct access&lt;br /&gt;
** http://pubs.cedeus.cl =&amp;gt; omeka direct access&lt;br /&gt;
** http://wiki.cedeus.cl =&amp;gt; wiki direct access&lt;br /&gt;
** http://owncloud.cedeus.cl =&amp;gt; owncloud direct access =&amp;gt; path to add in OwnCloud client: http://owncloud.cedeus.cl/owncloud/ (not ''https'')&lt;br /&gt;
&lt;br /&gt;
'''Technical Configuration'''&lt;br /&gt;
* GeoNode WebServer is Cedeusgeonode: http://observatorio.cedeus.cl : open to world [http://live.osgeo.org/en/quickstart/geonode_quickstart.html OSGeo Quickstart]&lt;br /&gt;
* GeoNode DataServer is CedeusDB  : access is closed to world&lt;br /&gt;
&lt;br /&gt;
[[Libros del Observatorio]]&lt;br /&gt;
&lt;br /&gt;
== Funciones de Infraestructuras Científicos de Datos Espaciales ==&lt;br /&gt;
Bernard L, Mäs S, Müller M, Henzen C, y J Brauner (2013, [http://www.tandfonline.com/doi/abs/10.1080/17538947.2013.781244 J. o. Digital Earth]):&lt;br /&gt;
* encontrar y acceder al datos (=&amp;gt; importante: accuracy and scale, lineage and usage)&lt;br /&gt;
* integrar, procesar y analisar informaciones encontrados (=&amp;gt; oferecer servicios de procesamiento geo-espacial y permitir su integracion)&lt;br /&gt;
* publicar y compartir datos, métodos y resultados científicos&lt;br /&gt;
&lt;br /&gt;
== Tareas para crear la IDE de Cedeus ==&lt;br /&gt;
my [[CEDEUS ShortTime ToDo List]]&lt;br /&gt;
&lt;br /&gt;
CEDEUS Long term ToDo list:&lt;br /&gt;
# [[IDEs de Chile existente]]&lt;br /&gt;
# [[Cedeus Technical Architecture]]&lt;br /&gt;
#* TODO: security aspects of the IDE (user types, access management options)&lt;br /&gt;
# DOCUMENTO: Borrador de Proyecto -  development plan for future (clients v.2 v.3) - '''15. Dec.'''&lt;br /&gt;
# ENCUESTA : user and data survey&lt;br /&gt;
#* primero encuesta - hecho en '''Diciembre 2013''' por Nicolas, me mande archivos con la presentación y resultado&lt;br /&gt;
#* documents to prepare: (i) envisioned types of IDE use, (ii) list of data (themes) that may be in the institute (checklist?), (iii) data that should not be public, (iv) client types =&amp;gt; a mindmap exists already!!&lt;br /&gt;
# DATOS:&lt;br /&gt;
#* [[Cedeus Base Data]]&lt;br /&gt;
#* [[Cedeus Convenios]]&lt;br /&gt;
#* Notes:&lt;br /&gt;
#** EPSG Santiago (from OCUC dataset): 32719 (= UTM Zone 19 South), EPSG OSM: 4326&lt;br /&gt;
#** what exists&lt;br /&gt;
#** access rights (see GeoNode access options: public, logged-in user, group, user only)&lt;br /&gt;
#** stoarge/db structure (defined by storage structure of GeoNode for shapefiles, rasters are stored in web-folder)&lt;br /&gt;
# [[Cedeus Metadata]]&lt;br /&gt;
#* [[CEDEUS CSW]]&lt;br /&gt;
# TYPO DE CLIENTES&lt;br /&gt;
#* desktop clients - SIG : TODO inicio de encuesta en los grupos que usan: ArcGIS, QGIS, gvSIG, OpenJUMP, SAGA ... &lt;br /&gt;
#* web client- browsers : TODO: a desarrollar&lt;br /&gt;
#*# [[IDE Client Basica]] : visualisacion de datos solamente&lt;br /&gt;
#*# [[IDE Client Avanzado]] : con diseno, para ciudadanos&lt;br /&gt;
#*# [[IDE Client Experto]] : visualisacion, aggregar, manipular&lt;br /&gt;
&lt;br /&gt;
== información útil y documentación  ==&lt;br /&gt;
*[[accessing server infra]]&lt;br /&gt;
*[[setting up osgeo vm]]&lt;br /&gt;
*[[setting up geonode]] and [[geonode data upload]]&lt;br /&gt;
*[[backup of geonode]]&lt;br /&gt;
*[[setting up tilestream]] and [[Setting up Tilestream VM on CEDEUSDB]]&lt;br /&gt;
* How to setup [http://docs.geoserver.org/stable/en/user/installation/linux/index.html GeoServer] is described in this blog entry: http://houhongru.com/blog/2013/01/07/How-to-install-GeoServer-on-Ubuntu-12.04/ . However, I am not sure if the install of Oracles Java instead of openJDK is necessary, since, as far as I recall, the OSGeo LiveDVD uses OpenJDK as well. Location of GeoServer will be ''/var/lib/tomcat7/webapps/'' . (Note, I should have a PDF of that in my projects/planyourplace/docs/development/wyp/)&lt;br /&gt;
*[[setting up walkyourplace]]&lt;br /&gt;
*[[moving the SF wiki]]&lt;br /&gt;
*[[installing OTP]] and [[updating OTP graph]]&lt;br /&gt;
*[[Setting up Elgg VM on CedeusGeoNode]]&lt;br /&gt;
*[[Cedeus DB backups]]&lt;br /&gt;
*[[Nominatim for Traffic Accident Database]]&lt;br /&gt;
*[[installing CartoDB for CEDEUS]]&lt;br /&gt;
*[[installing Omeka for CEDEUS]]&lt;br /&gt;
*[[Processing GeoData for CEDEUS]]&lt;br /&gt;
*[[Trabajo Cristian]]&lt;br /&gt;
**[[Walkyourplace Django]]&lt;br /&gt;
&lt;br /&gt;
== List of VMs ==&lt;br /&gt;
'''on CedeusGeoNode:''' (see also script: ''startcedeusvms.sh'')&lt;br /&gt;
* geonode1204 : 12GB : 6 cpus : 13080 (VRDE 7767) with 200GB (185GB) disk =&amp;gt; disk name: geonode1204b.vdi. How to enlarge the disk check [[Nominatim for Traffic Accident Database]] ... however, the Nominatim VM is using 14.04 and not 12.04. NB: this VM has the old pw &lt;br /&gt;
* opensuse132 2GB : 2 cpus : 18022 (with https webgui 18052+18547, not yet unblocked console 18161, VRDE 7772)&lt;br /&gt;
* wikicedeus : 2GB : 2 cpus : cedeus wiki on ''22080/wiki/'' (VRDE 7769)&lt;br /&gt;
* mediawiki : 2GB : 2 cpus : personal wiki on ''21080/mediawiki-1.22.7/'' (VRDE 7771)&lt;br /&gt;
* elgg : 4 GB : 4 cpus : 15080 (VRDE 7765) on basicubuntu1404 with LAMPS&lt;br /&gt;
* additional there are for testing:&lt;br /&gt;
** basicubuntu1404&lt;br /&gt;
** geonode1404 : 8GB : 6 cpus : 12080 (VRDE 7768) - this VM is not in use (without GeoNode install)&lt;br /&gt;
** wyp : 8GB : 4 cpus : 17080 (with Tomcat and Postgres: 17088 vs 17032, VRDE 3389) http://146.155.17.19:17080/wypwps/&lt;br /&gt;
** elgg18pyp : 2GB, 2cpus : 31080 (VRDE 31065) - VM should be shut down &lt;br /&gt;
** windows864 3GB : 3 cpus (VRDE 7773) 40 GB&lt;br /&gt;
** windowsml1 3GB : 3 cpus (VRDE 7774) 40 GB&lt;br /&gt;
&lt;br /&gt;
'''on CedeusDB:'''&lt;br /&gt;
(no startup script yet)&lt;br /&gt;
* tilestream :  8GB : 4 cpus : with Tilestream on ''16088/#!/map/Fondef'' (VRDE 3389) : http://146.155.17.18:16088/#!/map/Fondef&lt;br /&gt;
*: =&amp;gt; switched off&lt;br /&gt;
* nominatim: 4GB : 4 cpus 200GB : with Nominatim on 146.155.17.18:22080 (VRDE 7761) &lt;br /&gt;
*: =&amp;gt; Note, Nominatim has port CONFLICT with Gatherer; TODO: fix this&lt;br /&gt;
*: =&amp;gt; Running only when needed&lt;br /&gt;
* otp09: 4GB : 4cpus  : on 146.155.17.18:30088 (VRDE 7762) : http://146.155.17.18:30088/opentripplanner-webapp/#/ : (OpenTripPlanner 0.9)&lt;br /&gt;
* cartodb: 8 GB : 6 cpus : on 146.155.17.18:19080 (VRDE 7763) =&amp;gt; for testing, but never got it really to work&lt;br /&gt;
*: =&amp;gt; switched off &lt;br /&gt;
* omeka: 6 GB : 4 cpus : on 146.155.17.18:20080 (VRDE 7764) : http://146.155.17.18:20080/omeka/&lt;br /&gt;
* owncloud: 6GB : 4 cpus : on 146.155.17.18:17080 (VRDE 7765) : http://146.155.17.18:17080/owncloud/ =&amp;gt; http://owncloud.cedeus.cl&lt;br /&gt;
* gitlab: 4GB : 2 cpus : on 146.155.17.18:18080 (VRDE 7766) : http://146.155.17.18:18080/  (Off, trasladada a http://146.155.17.14:18080/ )&lt;br /&gt;
* indicator 1GB : 1 cpus : on 146.155.17.18:21080 (VRDE 7767) : http://146.155.17.18:21080/&lt;br /&gt;
* gatherer 2GB : 1 cpus : on 146.155.17.18:22080 (VRDE 7768) : &lt;br /&gt;
* otp 4GB : 4 cpus : on 146.155.17.18:23080 (VRDE 7769) : http://146.155.17.18:23080/ (OpenTripPlanner 0.20) (off, trasladada a http://146.155.17.19:17050/ )&lt;br /&gt;
* overpass : 4 GB : 2 cpus : on 146.155.17.18:24080 (VRDE 7770) : http://146.155.17.18:24080/api/interpreter/data=[data] (off, trasladada a http://146.155.17.19:17051/ )&lt;br /&gt;
* geonode20b : 12 GB : 6 cpus : on 146.155.17.18:16080 (VRDE 3389) : http://146.155.17.18:16080 =&amp;gt; Copy of GeoNode from June 2015 we used for bug fixing&lt;br /&gt;
*: =&amp;gt; Note, geonode20b has port CONFLICT with tilestream VM&lt;br /&gt;
*: =&amp;gt; switched off&lt;br /&gt;
* geonodeTest: 8 GB : 4 cpus : on 146.155.17.18:16080 (VRDE 7771) : http://146.155.17.18:16080 =&amp;gt; Test of Geonode 2.4&lt;br /&gt;
*: =&amp;gt; Note, port CONFLICT with tilestream and geonode20b&lt;br /&gt;
&lt;br /&gt;
'''CedeusGeoNode reverse-proxy + geosteiniger.cl DNS zone editor settings'''&lt;br /&gt;
* GeoNode: 146.155.17.19:13080 =&amp;gt; geonode1204 VM =&amp;gt; cedeusdata.geosteiniger.cl&lt;br /&gt;
* Personal wiki : 1146.155.17.19:21080/mediawiki-1.22.7/ =&amp;gt; wiki.geosteiniger.cl/wiki/&lt;br /&gt;
* Cedeus wiki : 146.155.17.19/wiki/ =&amp;gt; Wiki VM =&amp;gt; cedeuswiki.geosteiniger.cl/wiki/&lt;br /&gt;
* OTP : 146.155.17.54:8080/opentripplanner-webapp/ =&amp;gt; otp.geosteiniger.cl/opentripplanner-webapp/&lt;br /&gt;
* Tilestream 146.155.17.18:16088/#!/map/Fondef =&amp;gt; tilestream.geosteiniger.cl/#!/map/Fondef&lt;br /&gt;
&lt;br /&gt;
Hosting info for [http://www.tcpiputils.com/browse/domain/puc.cl Puc.cl] -&amp;gt; name servers etc.&lt;br /&gt;
&lt;br /&gt;
== presentaciones ==&lt;br /&gt;
* 18.Dic.2014 : Coloquio &amp;quot;IDE Universidades&amp;quot; de SNIT (M. Bienes) - [http://www.geo.uzh.ch/~sstein/presentations/cedeus/idecedeus.html#0 progreso parte tecnico]&lt;br /&gt;
* xxx&lt;br /&gt;
== cache == &lt;br /&gt;
[[blackboard]]&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2017-03-17T21:19:21Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Obtener polígonos formato .poly de ciudades */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
== Agregar -18 y .14 al apagado ==&lt;br /&gt;
&lt;br /&gt;
http://2tazasdelinux.blogspot.cl/2014/11/controlar-nuestro-sai-con-nut.html&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
== Actualizar la información ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información es necesario ir revisando los cambios de los archivos GTFS que se encuentran disponibles en la red, cuando notemos que uno es más nuevo es necesario descargarlo y ubicarlo en la carpeta que contiene todos los archivos similares (Actualmente se está utilizando la carpeta /home/csfuente/otpTransantiago ) por lo que entramos a dicha carpeta y descargamos los datos con '''wget'''. Finalmente reiniciamos la VM, esperamos a que inicie (cerca de ~10 minutos) y estará con todos los datos actualizados.&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CartoDB =&lt;br /&gt;
&lt;br /&gt;
== Levantar CartoDB cuando la máquina es encendida ==&lt;br /&gt;
&lt;br /&gt;
Subir CartoDB es un poco tedioso pero es posible sin complicaciónes, lo primero es exportar lo siguiente: (copy/paste a la terminal)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PATH=$PATH:/opt/rubies/ruby-2.2.3/bin&lt;br /&gt;
export CPLUS_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export C_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:$PWD/node_modules/grunt-cli/bin&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En mi cuenta agregué esas lineas al archivo .bashrc para que se ejecuten cada vez que entro por ssh a la VM.&lt;br /&gt;
Lo siguiente es ejecutar los procesos necesarios para que cartodb corra, para ello se ejecuta cada uno de ellos en una screen distinta (ya que no contamos con varias terminales por ssh)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/&lt;br /&gt;
screen&lt;br /&gt;
redis-server&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd cartodb&lt;br /&gt;
screen&lt;br /&gt;
bundle exec script/resque&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
bundle exec thin start --threaded -p 3000 --threadpool-size 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/Wireshark***&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/CartoDB-SQL-API&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
Con todo esto ahora podemos entrar a 146.155.17.18:3000 y usar cartodb.&lt;br /&gt;
&lt;br /&gt;
== Puertos utilizados en .18 por cartodb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Puerto&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Servicio&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:3000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb-SQL-API&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8181&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Wireshark&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:6379&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | redis-server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Obtener polígonos formato .poly de ciudades =&lt;br /&gt;
&lt;br /&gt;
Gracias a las instrucciones dadas en https://github.com/JamesChevalier/cities podemos obtener el polígono de la ciudad solicitada, los pasos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Entrar a http://nominatim.openstreetmap.org/ y poner en el buscador la ciudad que estamos buscando&lt;br /&gt;
* Al encontrarla, nos vamos a sus Detalles&lt;br /&gt;
* Copiamos el número que aparece en OSM: Relation '''XXXXXX'''&lt;br /&gt;
* Vamos a  http://polygons.openstreetmap.fr/ y pegamos éste número en '''Id of relation'''&lt;br /&gt;
* Descargamos la información en el link '''poly''' correspondiente&lt;br /&gt;
&lt;br /&gt;
= Migración OTP, Overpass en VM de WYP =&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/AccesoBarrio</id>
		<title>AccesoBarrio</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/AccesoBarrio"/>
				<updated>2017-03-06T20:25:51Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Comparative table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Django Prototype Santiago: http://146.155.17.19:17080/&lt;br /&gt;
&lt;br /&gt;
== Aim ==&lt;br /&gt;
Development of a web-based platform to&lt;br /&gt;
* evaluate urban accessibility&lt;br /&gt;
* model and evaluate changes in accessibility due to transportation infrastructure changes &lt;br /&gt;
&lt;br /&gt;
== Team == &lt;br /&gt;
* Stefan Steiniger (lead, PUC)&lt;br /&gt;
* Cris Fuentes (developer)&lt;br /&gt;
* co-investigators:&lt;br /&gt;
** Ricardo Crespo (UBO),&lt;br /&gt;
** Juan Carlos Muñoz (PUC), &lt;br /&gt;
** Ricardo Hurtubia (PUC),&lt;br /&gt;
** Olga Barbosa (UACH), &lt;br /&gt;
** Carolina Rojas (UdeC)&lt;br /&gt;
* PhD Student:&lt;br /&gt;
** Ignacio Tiznado (2015-17)&lt;br /&gt;
** Tomas Cox (2015)&lt;br /&gt;
* Thesis students:&lt;br /&gt;
** David Muñoz (UdeC, 2016-17)&lt;br /&gt;
** Tomas Galdames (UdeC, 2016-17)&lt;br /&gt;
* part time contributors:&lt;br /&gt;
** Gonzalo Arias (data analyst, 4m, 2016)&lt;br /&gt;
** Ricardo Ardiles (web development, 4m, 2016-17) &lt;br /&gt;
** Cristian Villaleiva (UAV drone pilot, 4m, 2016)&lt;br /&gt;
** survey team:&lt;br /&gt;
*** Santiago: Daniel Scott, Daniela Zamora &lt;br /&gt;
*** Concepcion: Tomas Galdames, Juan Varas &lt;br /&gt;
*** Valdivia: --&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
* Workstation: accesobarrio-wk 146.155.17.15&lt;br /&gt;
* Server: camila 146.155.17.14&lt;br /&gt;
** WYP VM : ???&lt;br /&gt;
** RServer VM : 146.155.17.14:17080 - VRDE 7701&lt;br /&gt;
** Gitlab VM : http://146.155.17.14:18080&lt;br /&gt;
&lt;br /&gt;
== Doc ==&lt;br /&gt;
=== WalkYourPlace Calgary (Andrew Hunter, Ebrahim Pooraziz, Stefan Steiniger) ===&lt;br /&gt;
* documentation: http://gisciencegroup.ucalgary.ca/wiki/index.php/Accessibility_Assessment&lt;br /&gt;
* access score prototype: http://webmapping.ucalgary.ca/WPSClient/&lt;br /&gt;
* sources: https://github.com/mepa1363?tab=repositories&lt;br /&gt;
* publications:&lt;br /&gt;
** Steiniger, S., M.E. Poorazizi, and A.J.S. Hunter (2015).&amp;lt;br&amp;gt; '''WalkYourPlace – Development of a web-based tool to evaluate urban accessibility.''' In L. Rizzi, R. Hurtubia, P. Galilea et al. (eds): ''XVII Congreso Chileno de Ingeniería de Transporte'', Concepcion, Chile. [http://xviicongresotransporte.ubiobio.cl/tmp/CCIT-17_submission_19.pdf Paper - pdf]&lt;br /&gt;
** Steiniger, S., M.E. Poorazizi, and A.J.S. Hunter (2013).&amp;lt;br&amp;gt; '''WalkYourPlace – Evaluating Neighbourhood Accessibility at Street Level.''' In C. Ellul, S. Zlatanova, M. Rumor, and R. Laurini (eds): ''29th Urban Data Management Symposium''. ISPRS Archives – Volume XL-4/W1, 2013, pp. 1-6. [http://www.int-arch-photogramm-remote-sens-spatial-inf-sci.net/XL-4-W1/1/2013/isprsarchives-XL-4-W1-1-2013.pdf Paper - pdf]&lt;br /&gt;
&lt;br /&gt;
=== WalkYourPlace Santiago ===&lt;br /&gt;
* [[setting up walkyourplace]]&lt;br /&gt;
* access score web service: http://146.155.17.19:17080/wypwps/&lt;br /&gt;
&lt;br /&gt;
=== OSM Survey ===&lt;br /&gt;
* [[OSM Survey Preparation and Execution]]&lt;br /&gt;
&lt;br /&gt;
== Publications ==&lt;br /&gt;
* Steiniger, S., Poorazizi, M. E., and A.J.S. Hunter (2016).&amp;lt;br&amp;gt;'''Planning with Citizens: Implementation of an e-Planning Platform and Analysis of Research Needs.'''  ''Urban Planning'' 1(2): 49-64. DOI: 10.17645/up.v1i2.607 - Open Access/free download: [http://www.cogitatiopress.com/ojs/index.php/urbanplanning/article/view/607 pdf]&lt;br /&gt;
* Steiniger, S., Poorazizi, M. E., D.R. Scott, C. Fuentes and R. Crespo (2016).&amp;lt;br&amp;gt;'''Can we use OpenStreetMap POIs for the Evaluation of Urban Accessibility?''' In: ''Proceedings of GISciene 2016'', Montreal (CAN), short paper [http://pubs.cedeus.cl/omeka/document/83 pdf]&lt;br /&gt;
* xxx Carol Rojas xxx&lt;br /&gt;
* xxx Ignacion - Mexico xxx&lt;br /&gt;
* xxx Tomas Cox - Australia xxx&lt;br /&gt;
&lt;br /&gt;
== Comparative table ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Software&lt;br /&gt;
! Open Source&lt;br /&gt;
! GTFS&lt;br /&gt;
! Isochrone&lt;br /&gt;
! Instalación en servidor local&lt;br /&gt;
! Lenguaje de programación&lt;br /&gt;
! Detalle&lt;br /&gt;
! Url&lt;br /&gt;
|-&lt;br /&gt;
| Open Route Service&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| Php, JavaScript&lt;br /&gt;
| Open Route Service permite calcular isochronos, pero no trabaja con archivos GTFS. Utiliza Leaflet y bootstrap para el diseño e interacción usuaria&lt;br /&gt;
| http://openrouteservice.org/&lt;br /&gt;
|-&lt;br /&gt;
| Iso4app&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| JavaScript&lt;br /&gt;
| Si bien puede ser una buena alternativa, sólo podría ser utilizada como API REST ya que se necesita licencia&lt;br /&gt;
| https://www.iso4app.net/&lt;br /&gt;
|-&lt;br /&gt;
| Mapzen&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| JavaScript&lt;br /&gt;
| Es una buena alternativa de desarrollo pero con una instalación compleja, se necesita hacer pruebas para comparar con OTP&lt;br /&gt;
| https://mapzen.com/&lt;br /&gt;
|-&lt;br /&gt;
| Valhalla&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| JavaScript&lt;br /&gt;
| Es un motor de ruteo utilizado por Mapzen, la instalación es compleja y necesita hacer pruebas para definir que es mejor opción que OTP&lt;br /&gt;
| https://github.com/valhalla/valhalla&lt;br /&gt;
|-&lt;br /&gt;
| Route360&lt;br /&gt;
| ✗&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| Java&lt;br /&gt;
| Es un servicio web privativo que, a base de una solicitud de una key, permite realizar consultas en isochrone&lt;br /&gt;
| https://www.route360.net/&lt;br /&gt;
|-&lt;br /&gt;
| Pysochrone&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| Python&lt;br /&gt;
| Código en Python el cual permite generar isochrones teniendo el archivo .osm.pbf, se encuentra incompleto hasta el momento, como trabajo futuro considera incluir los archivos GTFS&lt;br /&gt;
| https://github.com/joshdoe/pysochrone&lt;br /&gt;
|-&lt;br /&gt;
| OSRM&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| C++&lt;br /&gt;
| Actual Back-End de OSM, código OpenSource que permite el ruteo de viajes, no está orientado a transporte público&lt;br /&gt;
| https://github.com/Project-OSRM/osrm-backend&lt;br /&gt;
|-&lt;br /&gt;
| Mapnificient&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| JavaScript&lt;br /&gt;
| Servicio web que permite generar isochrones en tiempo real en su plataforma, sólo contiene algunos paises y no incluye Chile, no se especifica tampoco como generar la data para crearlo uno mismo.&lt;br /&gt;
| https://github.com/mapnificent/mapnificent&lt;br /&gt;
|-&lt;br /&gt;
| rrrr&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| C&lt;br /&gt;
| Caracterizado por su rapidez, ,es un software OpenSource que permite el ruteo de viajes considerando un GTFS. No permite cálculos de isochrones&lt;br /&gt;
| https://github.com/bliksemlabs/rrrr&lt;br /&gt;
|-&lt;br /&gt;
| r5&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| Java&lt;br /&gt;
| Es una API OpenSource para cálculos de rutas e isochrones considerando GTFS y la data de OSM, requere puebas para comparar con OTP&lt;br /&gt;
| https://github.com/conveyal/r5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
also http://wiki.openstreetmap.org/wiki/Routing/online_routers&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/AccesoBarrio</id>
		<title>AccesoBarrio</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/AccesoBarrio"/>
				<updated>2017-03-06T20:25:31Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Django Prototype Santiago: http://146.155.17.19:17080/&lt;br /&gt;
&lt;br /&gt;
== Aim ==&lt;br /&gt;
Development of a web-based platform to&lt;br /&gt;
* evaluate urban accessibility&lt;br /&gt;
* model and evaluate changes in accessibility due to transportation infrastructure changes &lt;br /&gt;
&lt;br /&gt;
== Team == &lt;br /&gt;
* Stefan Steiniger (lead, PUC)&lt;br /&gt;
* Cris Fuentes (developer)&lt;br /&gt;
* co-investigators:&lt;br /&gt;
** Ricardo Crespo (UBO),&lt;br /&gt;
** Juan Carlos Muñoz (PUC), &lt;br /&gt;
** Ricardo Hurtubia (PUC),&lt;br /&gt;
** Olga Barbosa (UACH), &lt;br /&gt;
** Carolina Rojas (UdeC)&lt;br /&gt;
* PhD Student:&lt;br /&gt;
** Ignacio Tiznado (2015-17)&lt;br /&gt;
** Tomas Cox (2015)&lt;br /&gt;
* Thesis students:&lt;br /&gt;
** David Muñoz (UdeC, 2016-17)&lt;br /&gt;
** Tomas Galdames (UdeC, 2016-17)&lt;br /&gt;
* part time contributors:&lt;br /&gt;
** Gonzalo Arias (data analyst, 4m, 2016)&lt;br /&gt;
** Ricardo Ardiles (web development, 4m, 2016-17) &lt;br /&gt;
** Cristian Villaleiva (UAV drone pilot, 4m, 2016)&lt;br /&gt;
** survey team:&lt;br /&gt;
*** Santiago: Daniel Scott, Daniela Zamora &lt;br /&gt;
*** Concepcion: Tomas Galdames, Juan Varas &lt;br /&gt;
*** Valdivia: --&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
* Workstation: accesobarrio-wk 146.155.17.15&lt;br /&gt;
* Server: camila 146.155.17.14&lt;br /&gt;
** WYP VM : ???&lt;br /&gt;
** RServer VM : 146.155.17.14:17080 - VRDE 7701&lt;br /&gt;
** Gitlab VM : http://146.155.17.14:18080&lt;br /&gt;
&lt;br /&gt;
== Doc ==&lt;br /&gt;
=== WalkYourPlace Calgary (Andrew Hunter, Ebrahim Pooraziz, Stefan Steiniger) ===&lt;br /&gt;
* documentation: http://gisciencegroup.ucalgary.ca/wiki/index.php/Accessibility_Assessment&lt;br /&gt;
* access score prototype: http://webmapping.ucalgary.ca/WPSClient/&lt;br /&gt;
* sources: https://github.com/mepa1363?tab=repositories&lt;br /&gt;
* publications:&lt;br /&gt;
** Steiniger, S., M.E. Poorazizi, and A.J.S. Hunter (2015).&amp;lt;br&amp;gt; '''WalkYourPlace – Development of a web-based tool to evaluate urban accessibility.''' In L. Rizzi, R. Hurtubia, P. Galilea et al. (eds): ''XVII Congreso Chileno de Ingeniería de Transporte'', Concepcion, Chile. [http://xviicongresotransporte.ubiobio.cl/tmp/CCIT-17_submission_19.pdf Paper - pdf]&lt;br /&gt;
** Steiniger, S., M.E. Poorazizi, and A.J.S. Hunter (2013).&amp;lt;br&amp;gt; '''WalkYourPlace – Evaluating Neighbourhood Accessibility at Street Level.''' In C. Ellul, S. Zlatanova, M. Rumor, and R. Laurini (eds): ''29th Urban Data Management Symposium''. ISPRS Archives – Volume XL-4/W1, 2013, pp. 1-6. [http://www.int-arch-photogramm-remote-sens-spatial-inf-sci.net/XL-4-W1/1/2013/isprsarchives-XL-4-W1-1-2013.pdf Paper - pdf]&lt;br /&gt;
&lt;br /&gt;
=== WalkYourPlace Santiago ===&lt;br /&gt;
* [[setting up walkyourplace]]&lt;br /&gt;
* access score web service: http://146.155.17.19:17080/wypwps/&lt;br /&gt;
&lt;br /&gt;
=== OSM Survey ===&lt;br /&gt;
* [[OSM Survey Preparation and Execution]]&lt;br /&gt;
&lt;br /&gt;
== Publications ==&lt;br /&gt;
* Steiniger, S., Poorazizi, M. E., and A.J.S. Hunter (2016).&amp;lt;br&amp;gt;'''Planning with Citizens: Implementation of an e-Planning Platform and Analysis of Research Needs.'''  ''Urban Planning'' 1(2): 49-64. DOI: 10.17645/up.v1i2.607 - Open Access/free download: [http://www.cogitatiopress.com/ojs/index.php/urbanplanning/article/view/607 pdf]&lt;br /&gt;
* Steiniger, S., Poorazizi, M. E., D.R. Scott, C. Fuentes and R. Crespo (2016).&amp;lt;br&amp;gt;'''Can we use OpenStreetMap POIs for the Evaluation of Urban Accessibility?''' In: ''Proceedings of GISciene 2016'', Montreal (CAN), short paper [http://pubs.cedeus.cl/omeka/document/83 pdf]&lt;br /&gt;
* xxx Carol Rojas xxx&lt;br /&gt;
* xxx Ignacion - Mexico xxx&lt;br /&gt;
* xxx Tomas Cox - Australia xxx&lt;br /&gt;
&lt;br /&gt;
== Comparative table ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Software&lt;br /&gt;
! Open Source&lt;br /&gt;
! GTFS&lt;br /&gt;
! Isochrone&lt;br /&gt;
! Instalación en servidor local&lt;br /&gt;
! Lenguaje de programación&lt;br /&gt;
! Detalle&lt;br /&gt;
! Url&lt;br /&gt;
|-&lt;br /&gt;
| Open Route Service&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| Php, JavaScript&lt;br /&gt;
| Open Route Service permite calcular isochronos, pero no trabaja con archivos GTFS. Utiliza Leaflet y bootstrap para el diseño e interacción usuaria&lt;br /&gt;
| http://openrouteservice.org/&lt;br /&gt;
|-&lt;br /&gt;
| Iso4app&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| JavaScript&lt;br /&gt;
| Si bien puede ser una buena alternativa, sólo podría ser utilizada como API REST ya que se necesita licencia&lt;br /&gt;
| https://www.iso4app.net/&lt;br /&gt;
|-&lt;br /&gt;
| Mapzen&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| JavaScript&lt;br /&gt;
| Es una buena alternativa de desarrollo pero con una instalación compleja, se necesita hacer pruebas para comparar con OTP&lt;br /&gt;
| https://mapzen.com/&lt;br /&gt;
|-&lt;br /&gt;
| Valhalla&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| JavaScript&lt;br /&gt;
| Es un motor de ruteo utilizado por Mapzen, la instalación es compleja y necesita hacer pruebas para definir que es mejor opción que OTP&lt;br /&gt;
| https://github.com/valhalla/valhalla&lt;br /&gt;
|-&lt;br /&gt;
| Route360&lt;br /&gt;
| ✗&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| Java&lt;br /&gt;
| Es un servicio web privativo que, a base de una solicitud de una key, permite realizar consultas en isochrone&lt;br /&gt;
| https://www.route360.net/&lt;br /&gt;
|-&lt;br /&gt;
| Pysochrone&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| Python&lt;br /&gt;
| Código en Python el cual permite generar isochrones teniendo el archivo .osm.pbf, se encuentra incompleto hasta el momento, como trabajo futuro considera incluir los archivos GTFS&lt;br /&gt;
| https://github.com/joshdoe/pysochrone&lt;br /&gt;
|-&lt;br /&gt;
| OSRM&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| C++&lt;br /&gt;
| Actual Back-End de OSM, código OpenSource que permite el ruteo de viajes, no está orientado a transporte público&lt;br /&gt;
| https://github.com/Project-OSRM/osrm-backend&lt;br /&gt;
|-&lt;br /&gt;
| Mapnificient&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| JavaScript&lt;br /&gt;
| Servicio web que permite generar isochrones en tiempo real en su plataforma, sólo contiene algunos paises y no incluye Chile, no se especifica tampoco como generar la data para crearlo uno mismo.&lt;br /&gt;
| https://github.com/mapnificent/mapnificent&lt;br /&gt;
|-&lt;br /&gt;
| rrrr&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✗&lt;br /&gt;
| ✓&lt;br /&gt;
| C&lt;br /&gt;
| Caracterizado por su rapidez, ,es un software OpenSource que permite el ruteo de viajes considerando un GTFS. No permite cálculos de isochrones&lt;br /&gt;
| https://github.com/bliksemlabs/rrrr&lt;br /&gt;
|-&lt;br /&gt;
| r5&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
| Java&lt;br /&gt;
| Es una API OpenSource para cálculos de rutas e isochrones considerando GTFS y la data de OSM, requere puebas para comparar con OTP&lt;br /&gt;
| https://github.com/conveyal/r5&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2017-03-03T12:41:21Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* CartoDB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
== Agregar -18 y .14 al apagado ==&lt;br /&gt;
&lt;br /&gt;
http://2tazasdelinux.blogspot.cl/2014/11/controlar-nuestro-sai-con-nut.html&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
== Actualizar la información ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información es necesario ir revisando los cambios de los archivos GTFS que se encuentran disponibles en la red, cuando notemos que uno es más nuevo es necesario descargarlo y ubicarlo en la carpeta que contiene todos los archivos similares (Actualmente se está utilizando la carpeta /home/csfuente/otpTransantiago ) por lo que entramos a dicha carpeta y descargamos los datos con '''wget'''. Finalmente reiniciamos la VM, esperamos a que inicie (cerca de ~10 minutos) y estará con todos los datos actualizados.&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CartoDB =&lt;br /&gt;
&lt;br /&gt;
== Levantar CartoDB cuando la máquina es encendida ==&lt;br /&gt;
&lt;br /&gt;
Subir CartoDB es un poco tedioso pero es posible sin complicaciónes, lo primero es exportar lo siguiente: (copy/paste a la terminal)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PATH=$PATH:/opt/rubies/ruby-2.2.3/bin&lt;br /&gt;
export CPLUS_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export C_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:$PWD/node_modules/grunt-cli/bin&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En mi cuenta agregué esas lineas al archivo .bashrc para que se ejecuten cada vez que entro por ssh a la VM.&lt;br /&gt;
Lo siguiente es ejecutar los procesos necesarios para que cartodb corra, para ello se ejecuta cada uno de ellos en una screen distinta (ya que no contamos con varias terminales por ssh)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/&lt;br /&gt;
screen&lt;br /&gt;
redis-server&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd cartodb&lt;br /&gt;
screen&lt;br /&gt;
bundle exec script/resque&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
bundle exec thin start --threaded -p 3000 --threadpool-size 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/Wireshark***&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/CartoDB-SQL-API&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
Con todo esto ahora podemos entrar a 146.155.17.18:3000 y usar cartodb.&lt;br /&gt;
&lt;br /&gt;
== Puertos utilizados en .18 por cartodb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Puerto&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Servicio&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:3000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb-SQL-API&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8181&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Wireshark&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:6379&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | redis-server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Obtener polígonos formato .poly de ciudades =&lt;br /&gt;
&lt;br /&gt;
Gracias a las instrucciones dadas en https://github.com/JamesChevalier/cities podemos obtener el polígono de la ciudad solicitada, los pasos son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Entrar a http://nominatim.openstreetmap.org/ y poner en el buscador la ciudad que estamos buscando&lt;br /&gt;
* Al encontrarla, nos vamos a sus Detalles&lt;br /&gt;
* Copiamos el número que aparece en OSM: Relation '''XXXXXX'''&lt;br /&gt;
* Vamos a  http://polygons.openstreetmap.fr/ y pegamos éste número en '''Id of relation'''&lt;br /&gt;
* Descargamos la información en el link '''poly''' correspondiente&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2017-02-16T19:22:35Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Ver estado de la UPS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
== Agregar -18 y .14 al apagado ==&lt;br /&gt;
&lt;br /&gt;
http://2tazasdelinux.blogspot.cl/2014/11/controlar-nuestro-sai-con-nut.html&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
== Actualizar la información ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información es necesario ir revisando los cambios de los archivos GTFS que se encuentran disponibles en la red, cuando notemos que uno es más nuevo es necesario descargarlo y ubicarlo en la carpeta que contiene todos los archivos similares (Actualmente se está utilizando la carpeta /home/csfuente/otpTransantiago ) por lo que entramos a dicha carpeta y descargamos los datos con '''wget'''. Finalmente reiniciamos la VM, esperamos a que inicie (cerca de ~10 minutos) y estará con todos los datos actualizados.&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CartoDB =&lt;br /&gt;
&lt;br /&gt;
== Levantar CartoDB cuando la máquina es encendida ==&lt;br /&gt;
&lt;br /&gt;
Subir CartoDB es un poco tedioso pero es posible sin complicaciónes, lo primero es exportar lo siguiente: (copy/paste a la terminal)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PATH=$PATH:/opt/rubies/ruby-2.2.3/bin&lt;br /&gt;
export CPLUS_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export C_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:$PWD/node_modules/grunt-cli/bin&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En mi cuenta agregué esas lineas al archivo .bashrc para que se ejecuten cada vez que entro por ssh a la VM.&lt;br /&gt;
Lo siguiente es ejecutar los procesos necesarios para que cartodb corra, para ello se ejecuta cada uno de ellos en una screen distinta (ya que no contamos con varias terminales por ssh)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/&lt;br /&gt;
screen&lt;br /&gt;
redis-server&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd cartodb&lt;br /&gt;
screen&lt;br /&gt;
bundle exec script/resque&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
bundle exec thin start --threaded -p 3000 --threadpool-size 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/Wireshark***&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/CartoDB-SQL-API&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
Con todo esto ahora podemos entrar a 146.155.17.18:3000 y usar cartodb.&lt;br /&gt;
&lt;br /&gt;
== Puertos utilizados en .18 por cartodb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Puerto&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Servicio&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:3000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb-SQL-API&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8181&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Wireshark&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:6379&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | redis-server&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-12-27T21:31:07Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Cambio de frecuencia de buses editando el archivo GTFS de Santiago */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike Model ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian &amp;amp; Transit Model ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y editamos el archivo wyp/views.py para que acepte los datos de Pedestrian:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
&lt;br /&gt;
def xml(request):&lt;br /&gt;
...&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y probamos como va funcionando con&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para Transit hay que seguir pasos similares a Pedestrian, observar el código para ver como queda configurado.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Finalmente el programa queda funcionando con muchos menos procesos y de forma más independiente, no requiere de una instalación de geoserver, tan solo Django Python, html, css y js.&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Gracias a Django fue posible crear un panel de administración para modificar ciertos valores dentro del código, además de agregar características nuevas que se explicarán a continuación:&lt;br /&gt;
&lt;br /&gt;
== Demographic group ==&lt;br /&gt;
&lt;br /&gt;
La idea es evaluar los POIs para distintos grupos demográficos, quien hace ese trabajo es la función de AggregationService.py, pero para que la petición llegue desde la interfaz también debe de llegarle a ManagementService.py, por lo que realizaremos estas modificaciones:&lt;br /&gt;
&lt;br /&gt;
Primero creamos el modelo de datos que contendrá a las opciones de grupos demográficos en la base de datos, para ello editamos el archivo wyp/models.py y agregamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.db import models&lt;br /&gt;
&lt;br /&gt;
class Demographic(models.Model):&lt;br /&gt;
	value = models.CharField(max_length=255)                #Nombre de la opcion demografica&lt;br /&gt;
	bank = models.CharField(max_length=255)                 #Pesos&lt;br /&gt;
	grocery = models.CharField(max_length=255)&lt;br /&gt;
	restaurant = models.CharField(max_length=255)&lt;br /&gt;
	shopping = models.CharField(max_length=255)&lt;br /&gt;
	entertainment = models.CharField(max_length=255)&lt;br /&gt;
	school = models.CharField(max_length=255)&lt;br /&gt;
	library = models.CharField(max_length=255)&lt;br /&gt;
	health = models.CharField(max_length=255)&lt;br /&gt;
	sum = models.FloatField(blank=True,default=0)           #Suma de los pesos anteriores&lt;br /&gt;
	score_factor = models.FloatField(blank=True,default=0)  #Valor de ponderacion&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.value&lt;br /&gt;
&lt;br /&gt;
        #Generar el resultado de sum y score_factor automaticamente al guardar&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		sumando = 0&lt;br /&gt;
		for i in ast.literal_eval(self.bank):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.grocery):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.restaurant):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.shopping):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.entertainment):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.school):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.library):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.health):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		self.sum = sumando&lt;br /&gt;
		self.score_factor = 100.0/float(sumando)&lt;br /&gt;
		super(Demographic,self).save(*args, **kwargs)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos este modelo al panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic&lt;br /&gt;
&lt;br /&gt;
admin.site.register(Demographic)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modificamos el archivo wyp/views.py para mandar estos datos a la vista html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  demographic = Demographic.objects.all()&lt;br /&gt;
  return render_to_response('index.html',{'demographic':demographic},context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego modificamos el archivo html que se encuentra en template para que éstos aparezcan dinámicamente como una lista de opciones. template/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Cycling Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_bike&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_bike&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_bike&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('bike')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_pedestrian&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_pedestrian&amp;quot; name=&amp;quot;start_point_pedestrian&amp;quot;&lt;br /&gt;
                           readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                        &amp;lt;div id=&amp;quot;walking_speed_pedestrian&amp;quot;&lt;br /&gt;
                             style=&amp;quot;width: 100px; height: 6px; margin:15px 10px auto 15px; display: inline-block;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
                        &amp;lt;span style=&amp;quot;font-size: 10px;&amp;quot;&amp;gt;Fast&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                &amp;lt;select id=&amp;quot;demographic_pedestrian&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_pedestrian&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('pedestrian')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Transit and Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_transit&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_transit&amp;quot; name=&amp;quot;start_point_transit&amp;quot; readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_transit&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                &lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('transit')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que estos valores sean reconocidos por el js que llama a la url /call_wps.php hay que modificar el archivo template/js/main.js para cada una de las opciones que se le agregó la opción demográfica&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function call_wps(approach){&lt;br /&gt;
    var start_point;&lt;br /&gt;
    ...&lt;br /&gt;
    var wps_call;&lt;br /&gt;
    var demographic;&lt;br /&gt;
&lt;br /&gt;
    switch (approach) {&lt;br /&gt;
        case &amp;quot;bike&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_bike').val();&lt;br /&gt;
            biking_time_period = $('#biking_time_period_amount').val();&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_bike').prop('checked');&lt;br /&gt;
            demographic = $('#demographic_bike option:selected').text();&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=bike&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;biking_time_period=&amp;quot; + biking_time_period + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;pedestrian&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_pedestrian').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_pedestrian').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_pedestrian').val();&lt;br /&gt;
            demographic = $('#demographic_pedestrian option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_pedestrian').prop('checked');&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=pedestrian&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;transit&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_transit').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_transit').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_transit').val();&lt;br /&gt;
            demographic = $('#demographic_transit option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_transit').prop('checked');&lt;br /&gt;
            walking_start_time = $('#walking_start_time').val() + &amp;quot;:00&amp;quot;;&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=transit&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_start_time=&amp;quot; + walking_start_time + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;bus_waiting_time=0&amp;amp;bus_riding_time=0&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Con ésto, ahora podemos recibir el valor escogido para la opción demográfica vía GET, por lo que ahora nos vamos a editar el archivo '''wyp/views.py''' para manejarlo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'transit':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic', default=None)&lt;br /&gt;
    return HttpResponse(managementTransit(start_point,walking_start_time,walking_time_period,walking_speed,bus_waiting_time,bus_riding_time, distance_decay_function,demographic))&lt;br /&gt;
  else:&lt;br /&gt;
  	return HttpResponse('')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos, ahora enviamos también la opción demográfica como nuevo parámetro de la función management* por lo que debemos modificar cada uno de ellos, de todas formas para todo es lo mismo por lo que solo se explicará el cambio realizado en Bike en el archivo '''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function,demographic):&lt;br /&gt;
    ...&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period,demographic)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente debemos editar el archivo en cuestión que nos retorna la puntuación, '''wyp/AggregationService.py'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from models import Demographic&lt;br /&gt;
&lt;br /&gt;
def aggregation(start_point, walkshed, crime_data, poi_data, distance_decay_function, walking_time_period,demographic):&lt;br /&gt;
    if poi_data != '&amp;quot;NULL&amp;quot;':&lt;br /&gt;
&lt;br /&gt;
        demographic_value = Demographic.objects.get(value=demographic)&lt;br /&gt;
&lt;br /&gt;
        poi_weights = {&amp;quot;Bank&amp;quot;: ast.literal_eval(demographic_value.bank),  #bank&lt;br /&gt;
                       &amp;quot;Grocery&amp;quot;: ast.literal_eval(demographic_value.grocery),  #grocery&lt;br /&gt;
                       &amp;quot;Restaurant&amp;quot;: ast.literal_eval(demographic_value.restaurant),  #restaurant and coffee&lt;br /&gt;
                       &amp;quot;Shopping&amp;quot;: ast.literal_eval(demographic_value.shopping),  #shopping&lt;br /&gt;
                       &amp;quot;Entertainment&amp;quot;: ast.literal_eval(demographic_value.entertainment),  #entertainment&lt;br /&gt;
                       &amp;quot;School&amp;quot;: ast.literal_eval(demographic_value.school),  #school&lt;br /&gt;
                       &amp;quot;Library&amp;quot;: ast.literal_eval(demographic_value.library),  #library&lt;br /&gt;
                       &amp;quot;Health&amp;quot;: ast.literal_eval(demographic_value.health)  #health&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entonces, para probar que todo esto funciona debemos ejecutar estos comandos desde la raíz del proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics  #por la midificacion de template/js/main.js&lt;br /&gt;
python manage.py makemigrations  # por la creacion del modelo Demographic&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alerta cuando uno de los servidores externos está caido ==&lt;br /&gt;
&lt;br /&gt;
Ha pasado que las VMs de OTP y de Overpass se caen por alguna razón o simplemente no parten correctamente lo que afecta directamente el funcionamiento de esta aplicación, para ello es importante saber cuál es la que está causando el problema, con ello necesitamos primero encontrar el error por lo que editaremos lo siguiente (nuevamente se mostrará con Bike, se realizó lo mismo con Pedestrian y Transit)&lt;br /&gt;
&lt;br /&gt;
En el archivo '''wyp/ManagementServiceBike.py''' agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    ...&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para generar la alerta lo haremos gracias a la ayuda del archivo '''template/js/main.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
        },&lt;br /&gt;
        success: function (data, status) {&lt;br /&gt;
            var wps_results = $.parseJSON(data);&lt;br /&gt;
&lt;br /&gt;
            var error_result = wps_results['error'];&lt;br /&gt;
            if (error_result){&lt;br /&gt;
                $.unblockUI();&lt;br /&gt;
                alert(error_result);&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de servidores de OTP y de overpass por panel de administración ==&lt;br /&gt;
&lt;br /&gt;
Una de las cosas principales que tiene Django es que cuenta con un panel de administración para poder editar la información de la base de datos o controlar ciertas configuraciones. En este caso crearemos un panel que permita intercambiar el servidor de OTP o de Overpass a cual queramos, para ello la guardaremos en la base de datos editando el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Server(models.Model):&lt;br /&gt;
	overpass = models.CharField(max_length=255,default='http://146.155.17.18:24080/api/interpreter')&lt;br /&gt;
	otp_bike = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochrone?&amp;amp;')&lt;br /&gt;
	otp_walk = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochroneOld?')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo agregamos al panel de administración agregando estas líneas en '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server&lt;br /&gt;
admin.site.register(Server)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos las siguientes líneas de comando para agregar la información a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py createsuperuser #crear un superusuario&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos ahora a la dirección http://localhost:8000/admin/ e ingresamos con el superusuario, entramos a Servers y creamos un elemento, los campos vendrán listos por lo que solo hay que guardar tal cual como sale.&lt;br /&gt;
&lt;br /&gt;
Luego editamos los archivos en donde se encuentra esta información&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_bike&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServicePedestrian.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceTransit.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/POIService.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = Server.objects.all()[0].overpass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análisis de muchos puntos mediante la subida de un archivo CSV ==&lt;br /&gt;
&lt;br /&gt;
Este trabajo se realiza netamente desde el panel de administración por lo que no se necesita de intervenir la interfaz. Se necesita de un sistema que reciba el archiv csv, lo lea línea por línea y lo analice según corresponda, la solución fue implementar un proceso extra (fuera de la interfaz) que realice el trabajo con tal de dejarlo funcionar toda la noche, por ejemplo.&lt;br /&gt;
&lt;br /&gt;
Como lo queremos ver en el panel de administración necesitamos crearle un modelo, para ello editamos nuevamente el archivo '''wyp/models.py''' agregando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
TYPES_OF_ANALYSYS = (&lt;br /&gt;
		('Bike','Cycling Model'),&lt;br /&gt;
		('Walk','Walking Model'),&lt;br /&gt;
		('Transit','Transit &amp;amp; Walking Model')&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
class Multiple_point_analysis(models.Model):&lt;br /&gt;
	csv_upload = models.FileField(upload_to='csv_uploads/')&lt;br /&gt;
	type_of_analysis = models.CharField(max_length=10,choices=TYPES_OF_ANALYSYS)&lt;br /&gt;
	demographic_group = models.ForeignKey(Demographic)&lt;br /&gt;
	analysed_pointset = models.BooleanField(default=False,blank=True,editable=False)&lt;br /&gt;
	results = models.FileField(upload_to='results/', blank=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.csv_upload.url.split('csv_uploads/')[-1]&lt;br /&gt;
&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		super(Multiple_point_analysis,self).save(*args, **kwargs)&lt;br /&gt;
		if not self.analysed_pointset:&lt;br /&gt;
			subprocess.Popen(shlex.split('python manage.py mass_analysis -i '+str(self.id)))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo mostramos en el panel editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis&lt;br /&gt;
admin.site.register(Multiple_point_analysis)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Además debemos agregar toda la siguiente rama de archivos:&lt;br /&gt;
* wyp/&lt;br /&gt;
** management/&lt;br /&gt;
*** __init__.py&lt;br /&gt;
*** commands/&lt;br /&gt;
**** __init__.py&lt;br /&gt;
**** _private.py&lt;br /&gt;
**** mass_analysis.py&lt;br /&gt;
&lt;br /&gt;
En donde ambos __init__.py y _private.py son archivos vacíos, management y commands carpetas y mass_analysis.py nuestra función que analizará el archivo csv. Entonces construimos el archivo '''wyp/management/commands/mass_analysis.py''' agregando las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wypdjango import settings&lt;br /&gt;
from wyp.models import Multiple_point_analysis&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
from wyp.ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
from wyp.ManagementServiceTransit import management as managementTransit&lt;br /&gt;
from django.core.files import File&lt;br /&gt;
import json&lt;br /&gt;
from time import time&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
	help = &amp;quot;Performs mass analysis from a csv file.\nIt requires id model to analyze.&amp;quot;&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-i',action='store',&lt;br /&gt;
				dest='i',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='id of the csv file in the model'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		csv_model = options['i']&lt;br /&gt;
		csv_model = Multiple_point_analysis.objects.get(id=int(csv_model))&lt;br /&gt;
&lt;br /&gt;
		filename = csv_model.csv_upload.url.split('/media/')[-1]&lt;br /&gt;
&lt;br /&gt;
		url = settings.MEDIA_ROOT + filename&lt;br /&gt;
&lt;br /&gt;
		csv = open(url,'r')&lt;br /&gt;
		lines = csv.read().split('\n')&lt;br /&gt;
		csv.close()&lt;br /&gt;
&lt;br /&gt;
		temp = open('/tmp/analysis_from_wyp.csv','w')&lt;br /&gt;
		temp.write('id;x;y;score;area;time;POI count;\n')&lt;br /&gt;
&lt;br /&gt;
		id_result = 1&lt;br /&gt;
&lt;br /&gt;
		try:&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Bike':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;biking_time_period;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+','+aux[2]&lt;br /&gt;
						biking_time_period = aux[3]&lt;br /&gt;
						distance_decay_function = aux[4]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementBike(start_point,biking_time_period,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result)+';'+aux[1]+';'+aux[2]+';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Walk':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						#aux = id;x;y;walking_time_period;walking_speed;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+';'+aux[2]&lt;br /&gt;
						walking_time_period = aux[3]&lt;br /&gt;
						walking_speed = aux[4]&lt;br /&gt;
						distance_decay_function = aux[5]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementPedestrian(start_point, walking_time_period, walking_speed, distance_decay_function, csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
			if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;start_time;walking_time_period;walking_speed;bus_waiting_time;bus_ride_time;distance_decay_function&lt;br /&gt;
						start_point = aux[1] + ';' + aux[2]&lt;br /&gt;
						start_time_transit = aux[3]&lt;br /&gt;
						walking_time_period = aux[4]&lt;br /&gt;
						walking_speed = aux[5]&lt;br /&gt;
						#bus_waiting_time = aux[6]&lt;br /&gt;
						bus_waiting_time = '0'&lt;br /&gt;
						#bus_ride_time = aux[7]&lt;br /&gt;
						bus_ride_time = '0'&lt;br /&gt;
						distance_decay_function = aux[6]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementTransit(start_point,start_time_transit,walking_time_period,walking_speed,bus_waiting_time,bus_ride_time,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
		except Exception as e:&lt;br /&gt;
			pass&lt;br /&gt;
&lt;br /&gt;
		#Pendiente!!!!!&lt;br /&gt;
		if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
			management(start_point, start_time, walking_time_period, walking_speed, bus_waiting_time, bus_ride_time, distance_decay_function)&lt;br /&gt;
			pass			&lt;br /&gt;
&lt;br /&gt;
		temp.close()&lt;br /&gt;
&lt;br /&gt;
		csv_model.analysed_pointset = True&lt;br /&gt;
		csv_model.results.save('results/' + csv_model.csv_upload.name.split('csv_uploads/')[-1] + '.csv', File(open('/tmp/analysis_from_wyp.csv')))&lt;br /&gt;
		csv_model.save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecuntamos estas líneas de comando para agregar el modelo a la base de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos a http://localhost:8000/admin y nos encontraremos con la opción de Multiple_point_analysis en donde tenemos que hacer click en &amp;quot;add multiple_point_analysis&amp;quot;. Llenamos los campos que se encuentran en negrita y apretamos en &amp;quot;SAVE&amp;quot;. Esperamos a que finalice (~15 segundos por línea de CSV) y los resultados estarán en el campo &amp;quot;Results&amp;quot; como archivo csv para descargar.&lt;br /&gt;
&lt;br /&gt;
== Sistema de Log para análisis de archivos CSV ==&lt;br /&gt;
&lt;br /&gt;
Como no se sabe si de verdad está funcionando o hay problemas de por medio al momento de analizar un archivo CSV, se creó un sistema de log que nos permita saber que es lo que está sucediendo. Para ello lo creamos como proceso al igual que el análisis del archivo. por lo que creamos el archivo '''wyp/management/commands/log.py''' y le agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wyp.models import Log_wyp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
&lt;br /&gt;
	help = &amp;quot;Save logs to the system&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-l',action='store',&lt;br /&gt;
				dest='l',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='message log'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		message = options['l']&lt;br /&gt;
&lt;br /&gt;
		if message != '':&lt;br /&gt;
			if len(message)&amp;gt;255:&lt;br /&gt;
				Log_wyp(log=message[:255]).save()&lt;br /&gt;
			else:&lt;br /&gt;
				Log_wyp(log=message).save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos el modelo en el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Log_wyp(models.Model):&lt;br /&gt;
	log = models.CharField(max_length=255,default='')&lt;br /&gt;
	created = models.DateTimeField(auto_now_add=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return str(self.created.strftime('%Y-%m-%d %H:%M:%S')) + ' ' +self.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo mostramos en el panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis, Log_wyp&lt;br /&gt;
admin.site.register(Log_wyp)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos los comandos para agregar el modelo a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ahora, para poder agregar cualquier log lo podemos hacer ejecutando el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py log -l &amp;quot;Mensaje a registrar&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que, por ejemplo, al integrarlo al archivo '''wyp/management/commands/mass_analysis.py''' se realizó lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
subprocess.Popen(shlex.split('python manage.py log -l &amp;quot;' + filename + ' Starting analysis&amp;quot;'))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de frecuencia de buses editando el archivo GTFS de Santiago ==&lt;br /&gt;
&lt;br /&gt;
Se trabaja actualmente en la construcción de una herramienta que permia cambiar las frecuencias de las líneas de buses y metro de la ciudad de Santiago con el objetivo de poder analizar los cambios de accesibilidad urbana derivadas de ésto. Con ello, en Django Python, se cargó en una base de datos SQLite (aparte de la que ya utiliza Django) el GTFS de los datos de la ciudad en cuestión gracias al módulo pygtfs. Para utilizar sus datos solo basta con llamarlos con sus funciones.&lt;br /&gt;
&lt;br /&gt;
Con ello, las frecuencias de los recorridos se encuentran en el archivo frequencies.txt dentro del archivo comprimido GTFS.zip. Con el módulo pygtfs previamente configurado se pueden llamar dichos datos con los comandos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
sched = pygtfs.Schedule(MEDIA_ROOT + 'gtfs.sqlite')&lt;br /&gt;
frequencies = sched.frequencies&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
generando en '''frequencies''' una lista con todas las frecuencias y los datos adjuntos que podemos ver en el mismo archivo de texto pero como objeto python.&lt;br /&gt;
&lt;br /&gt;
Luego se creó una vista en [http://146.155.17.19:17080/gtfs/update_frequencies] en donde encontraremos un espacio de selección de viaje identificado por su ID en la cual al ser seleccionada se desplegará su información, tal como su hora de inicio, hora de fin y su frecuencia de salida, este último en un campo editable. Cuando ya cambiamos este valor, podemos guardar este dato en una lista de futuros datos para ser actualizados, la cual la podemos ver en la zona inferior de este formulario. Ésta lista puede ser tan grande como SQLite aguante.&lt;br /&gt;
&lt;br /&gt;
Para construir esta lista, se debió de crear una copia de los modelos que hay en pygtfs en la base de datos local de Django manteniendo solo los datos que se desean cambiar, al ser eliminados de la lista también son eliminados de la base de datos para evitar que éste se llene o cause algún tipo de inconveniente.&lt;br /&gt;
&lt;br /&gt;
Ya cuando tengamos todos nuestros cambios guardados, apretamos en el botón de '''Actualizar GTFS'''. Éste proceso puede llegar a tardar entre 7 a 8 minutos en ser completado, por lo que el botón se bloqueará durante este tiempo. Una vez finalizado debemos dirigirnos al panel de administración para cambiar el router de evaluación y utilizar el que acabamos de construir. Para ello se entra a [http://146.155.17.19:17080/admin/wyp/server/1/change/] y se modifica la URL en cuestion para cambiar '''/routers/&amp;lt;texto-a-cambiar&amp;gt;/isochrone?''' por '''/routers/WYP/isochrone?'''. Una vez realizado este cambio podemos efectuar las consultas con nuestras nuevas frecuencias de buses.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que este proceso es temporal mientras no se construya un front-end ideal, ésta herramienta se construyó de esta forma para probar su funcionalidad y no garantiza lo más óptimo.&lt;br /&gt;
&lt;br /&gt;
== API REST para obtener datos del archivo de frecuencia de buses ==&lt;br /&gt;
&lt;br /&gt;
Para que el putno anterior de esta documentación funcione correctamente, fue necesario que se creara una API REST que nos permita obtener datos de las frecuencias mientras que por GET le enviemos la ID correspondiente al tramo a evaluar. En otras palabras, debemos ingresar una URL como ésta [http://146.155.17.19:17080/gtfs/frec_REST?f=101-I-S_V25-B14] y obtendremos un objeto Json con la información en cuestión.&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
El código se puede encontrar acá: http://146.155.17.14:18080/csfuente/wyp-django/ y se encuentra funcionando en http://146.155.17.19:17080/&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-12-27T21:26:27Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Funcionamiento actual */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike Model ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian &amp;amp; Transit Model ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y editamos el archivo wyp/views.py para que acepte los datos de Pedestrian:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
&lt;br /&gt;
def xml(request):&lt;br /&gt;
...&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y probamos como va funcionando con&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para Transit hay que seguir pasos similares a Pedestrian, observar el código para ver como queda configurado.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Finalmente el programa queda funcionando con muchos menos procesos y de forma más independiente, no requiere de una instalación de geoserver, tan solo Django Python, html, css y js.&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Gracias a Django fue posible crear un panel de administración para modificar ciertos valores dentro del código, además de agregar características nuevas que se explicarán a continuación:&lt;br /&gt;
&lt;br /&gt;
== Demographic group ==&lt;br /&gt;
&lt;br /&gt;
La idea es evaluar los POIs para distintos grupos demográficos, quien hace ese trabajo es la función de AggregationService.py, pero para que la petición llegue desde la interfaz también debe de llegarle a ManagementService.py, por lo que realizaremos estas modificaciones:&lt;br /&gt;
&lt;br /&gt;
Primero creamos el modelo de datos que contendrá a las opciones de grupos demográficos en la base de datos, para ello editamos el archivo wyp/models.py y agregamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.db import models&lt;br /&gt;
&lt;br /&gt;
class Demographic(models.Model):&lt;br /&gt;
	value = models.CharField(max_length=255)                #Nombre de la opcion demografica&lt;br /&gt;
	bank = models.CharField(max_length=255)                 #Pesos&lt;br /&gt;
	grocery = models.CharField(max_length=255)&lt;br /&gt;
	restaurant = models.CharField(max_length=255)&lt;br /&gt;
	shopping = models.CharField(max_length=255)&lt;br /&gt;
	entertainment = models.CharField(max_length=255)&lt;br /&gt;
	school = models.CharField(max_length=255)&lt;br /&gt;
	library = models.CharField(max_length=255)&lt;br /&gt;
	health = models.CharField(max_length=255)&lt;br /&gt;
	sum = models.FloatField(blank=True,default=0)           #Suma de los pesos anteriores&lt;br /&gt;
	score_factor = models.FloatField(blank=True,default=0)  #Valor de ponderacion&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.value&lt;br /&gt;
&lt;br /&gt;
        #Generar el resultado de sum y score_factor automaticamente al guardar&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		sumando = 0&lt;br /&gt;
		for i in ast.literal_eval(self.bank):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.grocery):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.restaurant):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.shopping):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.entertainment):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.school):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.library):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.health):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		self.sum = sumando&lt;br /&gt;
		self.score_factor = 100.0/float(sumando)&lt;br /&gt;
		super(Demographic,self).save(*args, **kwargs)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos este modelo al panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic&lt;br /&gt;
&lt;br /&gt;
admin.site.register(Demographic)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modificamos el archivo wyp/views.py para mandar estos datos a la vista html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  demographic = Demographic.objects.all()&lt;br /&gt;
  return render_to_response('index.html',{'demographic':demographic},context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego modificamos el archivo html que se encuentra en template para que éstos aparezcan dinámicamente como una lista de opciones. template/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Cycling Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_bike&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_bike&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_bike&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('bike')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_pedestrian&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_pedestrian&amp;quot; name=&amp;quot;start_point_pedestrian&amp;quot;&lt;br /&gt;
                           readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                        &amp;lt;div id=&amp;quot;walking_speed_pedestrian&amp;quot;&lt;br /&gt;
                             style=&amp;quot;width: 100px; height: 6px; margin:15px 10px auto 15px; display: inline-block;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
                        &amp;lt;span style=&amp;quot;font-size: 10px;&amp;quot;&amp;gt;Fast&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                &amp;lt;select id=&amp;quot;demographic_pedestrian&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_pedestrian&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('pedestrian')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Transit and Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_transit&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_transit&amp;quot; name=&amp;quot;start_point_transit&amp;quot; readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_transit&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                &lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('transit')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que estos valores sean reconocidos por el js que llama a la url /call_wps.php hay que modificar el archivo template/js/main.js para cada una de las opciones que se le agregó la opción demográfica&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function call_wps(approach){&lt;br /&gt;
    var start_point;&lt;br /&gt;
    ...&lt;br /&gt;
    var wps_call;&lt;br /&gt;
    var demographic;&lt;br /&gt;
&lt;br /&gt;
    switch (approach) {&lt;br /&gt;
        case &amp;quot;bike&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_bike').val();&lt;br /&gt;
            biking_time_period = $('#biking_time_period_amount').val();&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_bike').prop('checked');&lt;br /&gt;
            demographic = $('#demographic_bike option:selected').text();&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=bike&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;biking_time_period=&amp;quot; + biking_time_period + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;pedestrian&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_pedestrian').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_pedestrian').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_pedestrian').val();&lt;br /&gt;
            demographic = $('#demographic_pedestrian option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_pedestrian').prop('checked');&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=pedestrian&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;transit&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_transit').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_transit').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_transit').val();&lt;br /&gt;
            demographic = $('#demographic_transit option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_transit').prop('checked');&lt;br /&gt;
            walking_start_time = $('#walking_start_time').val() + &amp;quot;:00&amp;quot;;&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=transit&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_start_time=&amp;quot; + walking_start_time + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;bus_waiting_time=0&amp;amp;bus_riding_time=0&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Con ésto, ahora podemos recibir el valor escogido para la opción demográfica vía GET, por lo que ahora nos vamos a editar el archivo '''wyp/views.py''' para manejarlo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'transit':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic', default=None)&lt;br /&gt;
    return HttpResponse(managementTransit(start_point,walking_start_time,walking_time_period,walking_speed,bus_waiting_time,bus_riding_time, distance_decay_function,demographic))&lt;br /&gt;
  else:&lt;br /&gt;
  	return HttpResponse('')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos, ahora enviamos también la opción demográfica como nuevo parámetro de la función management* por lo que debemos modificar cada uno de ellos, de todas formas para todo es lo mismo por lo que solo se explicará el cambio realizado en Bike en el archivo '''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function,demographic):&lt;br /&gt;
    ...&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period,demographic)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente debemos editar el archivo en cuestión que nos retorna la puntuación, '''wyp/AggregationService.py'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from models import Demographic&lt;br /&gt;
&lt;br /&gt;
def aggregation(start_point, walkshed, crime_data, poi_data, distance_decay_function, walking_time_period,demographic):&lt;br /&gt;
    if poi_data != '&amp;quot;NULL&amp;quot;':&lt;br /&gt;
&lt;br /&gt;
        demographic_value = Demographic.objects.get(value=demographic)&lt;br /&gt;
&lt;br /&gt;
        poi_weights = {&amp;quot;Bank&amp;quot;: ast.literal_eval(demographic_value.bank),  #bank&lt;br /&gt;
                       &amp;quot;Grocery&amp;quot;: ast.literal_eval(demographic_value.grocery),  #grocery&lt;br /&gt;
                       &amp;quot;Restaurant&amp;quot;: ast.literal_eval(demographic_value.restaurant),  #restaurant and coffee&lt;br /&gt;
                       &amp;quot;Shopping&amp;quot;: ast.literal_eval(demographic_value.shopping),  #shopping&lt;br /&gt;
                       &amp;quot;Entertainment&amp;quot;: ast.literal_eval(demographic_value.entertainment),  #entertainment&lt;br /&gt;
                       &amp;quot;School&amp;quot;: ast.literal_eval(demographic_value.school),  #school&lt;br /&gt;
                       &amp;quot;Library&amp;quot;: ast.literal_eval(demographic_value.library),  #library&lt;br /&gt;
                       &amp;quot;Health&amp;quot;: ast.literal_eval(demographic_value.health)  #health&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entonces, para probar que todo esto funciona debemos ejecutar estos comandos desde la raíz del proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics  #por la midificacion de template/js/main.js&lt;br /&gt;
python manage.py makemigrations  # por la creacion del modelo Demographic&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alerta cuando uno de los servidores externos está caido ==&lt;br /&gt;
&lt;br /&gt;
Ha pasado que las VMs de OTP y de Overpass se caen por alguna razón o simplemente no parten correctamente lo que afecta directamente el funcionamiento de esta aplicación, para ello es importante saber cuál es la que está causando el problema, con ello necesitamos primero encontrar el error por lo que editaremos lo siguiente (nuevamente se mostrará con Bike, se realizó lo mismo con Pedestrian y Transit)&lt;br /&gt;
&lt;br /&gt;
En el archivo '''wyp/ManagementServiceBike.py''' agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    ...&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para generar la alerta lo haremos gracias a la ayuda del archivo '''template/js/main.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
        },&lt;br /&gt;
        success: function (data, status) {&lt;br /&gt;
            var wps_results = $.parseJSON(data);&lt;br /&gt;
&lt;br /&gt;
            var error_result = wps_results['error'];&lt;br /&gt;
            if (error_result){&lt;br /&gt;
                $.unblockUI();&lt;br /&gt;
                alert(error_result);&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de servidores de OTP y de overpass por panel de administración ==&lt;br /&gt;
&lt;br /&gt;
Una de las cosas principales que tiene Django es que cuenta con un panel de administración para poder editar la información de la base de datos o controlar ciertas configuraciones. En este caso crearemos un panel que permita intercambiar el servidor de OTP o de Overpass a cual queramos, para ello la guardaremos en la base de datos editando el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Server(models.Model):&lt;br /&gt;
	overpass = models.CharField(max_length=255,default='http://146.155.17.18:24080/api/interpreter')&lt;br /&gt;
	otp_bike = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochrone?&amp;amp;')&lt;br /&gt;
	otp_walk = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochroneOld?')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo agregamos al panel de administración agregando estas líneas en '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server&lt;br /&gt;
admin.site.register(Server)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos las siguientes líneas de comando para agregar la información a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py createsuperuser #crear un superusuario&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos ahora a la dirección http://localhost:8000/admin/ e ingresamos con el superusuario, entramos a Servers y creamos un elemento, los campos vendrán listos por lo que solo hay que guardar tal cual como sale.&lt;br /&gt;
&lt;br /&gt;
Luego editamos los archivos en donde se encuentra esta información&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_bike&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServicePedestrian.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceTransit.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/POIService.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = Server.objects.all()[0].overpass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análisis de muchos puntos mediante la subida de un archivo CSV ==&lt;br /&gt;
&lt;br /&gt;
Este trabajo se realiza netamente desde el panel de administración por lo que no se necesita de intervenir la interfaz. Se necesita de un sistema que reciba el archiv csv, lo lea línea por línea y lo analice según corresponda, la solución fue implementar un proceso extra (fuera de la interfaz) que realice el trabajo con tal de dejarlo funcionar toda la noche, por ejemplo.&lt;br /&gt;
&lt;br /&gt;
Como lo queremos ver en el panel de administración necesitamos crearle un modelo, para ello editamos nuevamente el archivo '''wyp/models.py''' agregando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
TYPES_OF_ANALYSYS = (&lt;br /&gt;
		('Bike','Cycling Model'),&lt;br /&gt;
		('Walk','Walking Model'),&lt;br /&gt;
		('Transit','Transit &amp;amp; Walking Model')&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
class Multiple_point_analysis(models.Model):&lt;br /&gt;
	csv_upload = models.FileField(upload_to='csv_uploads/')&lt;br /&gt;
	type_of_analysis = models.CharField(max_length=10,choices=TYPES_OF_ANALYSYS)&lt;br /&gt;
	demographic_group = models.ForeignKey(Demographic)&lt;br /&gt;
	analysed_pointset = models.BooleanField(default=False,blank=True,editable=False)&lt;br /&gt;
	results = models.FileField(upload_to='results/', blank=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.csv_upload.url.split('csv_uploads/')[-1]&lt;br /&gt;
&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		super(Multiple_point_analysis,self).save(*args, **kwargs)&lt;br /&gt;
		if not self.analysed_pointset:&lt;br /&gt;
			subprocess.Popen(shlex.split('python manage.py mass_analysis -i '+str(self.id)))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo mostramos en el panel editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis&lt;br /&gt;
admin.site.register(Multiple_point_analysis)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Además debemos agregar toda la siguiente rama de archivos:&lt;br /&gt;
* wyp/&lt;br /&gt;
** management/&lt;br /&gt;
*** __init__.py&lt;br /&gt;
*** commands/&lt;br /&gt;
**** __init__.py&lt;br /&gt;
**** _private.py&lt;br /&gt;
**** mass_analysis.py&lt;br /&gt;
&lt;br /&gt;
En donde ambos __init__.py y _private.py son archivos vacíos, management y commands carpetas y mass_analysis.py nuestra función que analizará el archivo csv. Entonces construimos el archivo '''wyp/management/commands/mass_analysis.py''' agregando las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wypdjango import settings&lt;br /&gt;
from wyp.models import Multiple_point_analysis&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
from wyp.ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
from wyp.ManagementServiceTransit import management as managementTransit&lt;br /&gt;
from django.core.files import File&lt;br /&gt;
import json&lt;br /&gt;
from time import time&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
	help = &amp;quot;Performs mass analysis from a csv file.\nIt requires id model to analyze.&amp;quot;&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-i',action='store',&lt;br /&gt;
				dest='i',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='id of the csv file in the model'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		csv_model = options['i']&lt;br /&gt;
		csv_model = Multiple_point_analysis.objects.get(id=int(csv_model))&lt;br /&gt;
&lt;br /&gt;
		filename = csv_model.csv_upload.url.split('/media/')[-1]&lt;br /&gt;
&lt;br /&gt;
		url = settings.MEDIA_ROOT + filename&lt;br /&gt;
&lt;br /&gt;
		csv = open(url,'r')&lt;br /&gt;
		lines = csv.read().split('\n')&lt;br /&gt;
		csv.close()&lt;br /&gt;
&lt;br /&gt;
		temp = open('/tmp/analysis_from_wyp.csv','w')&lt;br /&gt;
		temp.write('id;x;y;score;area;time;POI count;\n')&lt;br /&gt;
&lt;br /&gt;
		id_result = 1&lt;br /&gt;
&lt;br /&gt;
		try:&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Bike':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;biking_time_period;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+','+aux[2]&lt;br /&gt;
						biking_time_period = aux[3]&lt;br /&gt;
						distance_decay_function = aux[4]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementBike(start_point,biking_time_period,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result)+';'+aux[1]+';'+aux[2]+';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Walk':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						#aux = id;x;y;walking_time_period;walking_speed;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+';'+aux[2]&lt;br /&gt;
						walking_time_period = aux[3]&lt;br /&gt;
						walking_speed = aux[4]&lt;br /&gt;
						distance_decay_function = aux[5]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementPedestrian(start_point, walking_time_period, walking_speed, distance_decay_function, csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
			if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;start_time;walking_time_period;walking_speed;bus_waiting_time;bus_ride_time;distance_decay_function&lt;br /&gt;
						start_point = aux[1] + ';' + aux[2]&lt;br /&gt;
						start_time_transit = aux[3]&lt;br /&gt;
						walking_time_period = aux[4]&lt;br /&gt;
						walking_speed = aux[5]&lt;br /&gt;
						#bus_waiting_time = aux[6]&lt;br /&gt;
						bus_waiting_time = '0'&lt;br /&gt;
						#bus_ride_time = aux[7]&lt;br /&gt;
						bus_ride_time = '0'&lt;br /&gt;
						distance_decay_function = aux[6]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementTransit(start_point,start_time_transit,walking_time_period,walking_speed,bus_waiting_time,bus_ride_time,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
		except Exception as e:&lt;br /&gt;
			pass&lt;br /&gt;
&lt;br /&gt;
		#Pendiente!!!!!&lt;br /&gt;
		if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
			management(start_point, start_time, walking_time_period, walking_speed, bus_waiting_time, bus_ride_time, distance_decay_function)&lt;br /&gt;
			pass			&lt;br /&gt;
&lt;br /&gt;
		temp.close()&lt;br /&gt;
&lt;br /&gt;
		csv_model.analysed_pointset = True&lt;br /&gt;
		csv_model.results.save('results/' + csv_model.csv_upload.name.split('csv_uploads/')[-1] + '.csv', File(open('/tmp/analysis_from_wyp.csv')))&lt;br /&gt;
		csv_model.save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecuntamos estas líneas de comando para agregar el modelo a la base de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos a http://localhost:8000/admin y nos encontraremos con la opción de Multiple_point_analysis en donde tenemos que hacer click en &amp;quot;add multiple_point_analysis&amp;quot;. Llenamos los campos que se encuentran en negrita y apretamos en &amp;quot;SAVE&amp;quot;. Esperamos a que finalice (~15 segundos por línea de CSV) y los resultados estarán en el campo &amp;quot;Results&amp;quot; como archivo csv para descargar.&lt;br /&gt;
&lt;br /&gt;
== Sistema de Log para análisis de archivos CSV ==&lt;br /&gt;
&lt;br /&gt;
Como no se sabe si de verdad está funcionando o hay problemas de por medio al momento de analizar un archivo CSV, se creó un sistema de log que nos permita saber que es lo que está sucediendo. Para ello lo creamos como proceso al igual que el análisis del archivo. por lo que creamos el archivo '''wyp/management/commands/log.py''' y le agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wyp.models import Log_wyp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
&lt;br /&gt;
	help = &amp;quot;Save logs to the system&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-l',action='store',&lt;br /&gt;
				dest='l',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='message log'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		message = options['l']&lt;br /&gt;
&lt;br /&gt;
		if message != '':&lt;br /&gt;
			if len(message)&amp;gt;255:&lt;br /&gt;
				Log_wyp(log=message[:255]).save()&lt;br /&gt;
			else:&lt;br /&gt;
				Log_wyp(log=message).save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos el modelo en el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Log_wyp(models.Model):&lt;br /&gt;
	log = models.CharField(max_length=255,default='')&lt;br /&gt;
	created = models.DateTimeField(auto_now_add=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return str(self.created.strftime('%Y-%m-%d %H:%M:%S')) + ' ' +self.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo mostramos en el panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis, Log_wyp&lt;br /&gt;
admin.site.register(Log_wyp)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos los comandos para agregar el modelo a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ahora, para poder agregar cualquier log lo podemos hacer ejecutando el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py log -l &amp;quot;Mensaje a registrar&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que, por ejemplo, al integrarlo al archivo '''wyp/management/commands/mass_analysis.py''' se realizó lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
subprocess.Popen(shlex.split('python manage.py log -l &amp;quot;' + filename + ' Starting analysis&amp;quot;'))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de frecuencia de buses editando el archivo GTFS de Santiago ==&lt;br /&gt;
&lt;br /&gt;
Se trabaja actualmente en la construcción de una herramienta que permia cambiar las frecuencias de las líneas de buses y metro de la ciudad de Santiago con el objetivo de poder analizar los cambios de accesibilidad urbana derivadas de ésto. Con ello, en Django Python, se cargó en una base de datos SQLite (aparte de la que ya utiliza Django) el GTFS de los datos de la ciudad en cuestión gracias al módulo pygtfs. Para utilizar sus datos solo basta con llamarlos con sus funciones.&lt;br /&gt;
&lt;br /&gt;
Con ello, las frecuencias de los recorridos se encuentran en el archivo frequencies.txt dentro del archivo comprimido GTFS.zip. Con el módulo pygtfs previamente configurado se pueden llamar dichos datos con los comandos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
sched = pygtfs.Schedule(MEDIA_ROOT + 'gtfs.sqlite')&lt;br /&gt;
frequencies = sched.frequencies&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
generando en '''frequencies''' una lista con todas las frecuencias y los datos adjuntos que podemos ver en el mismo archivo de texto pero como objeto python.&lt;br /&gt;
&lt;br /&gt;
Luego se creó una vista en [http://146.155.17.19:17080/gtfs/update_frequencies] en donde encontraremos un espacio de selección de viaje identificado por su ID en la cual al ser seleccionada se desplegará su información, tal como su hora de inicio, hora de fin y su frecuencia de salida, este último en un campo editable. Cuando ya cambiamos este valor, podemos guardar este dato en una lista de futuros datos para ser actualizados, la cual la podemos ver en la zona inferior de este formulario. Ésta lista puede ser tan grande como SQLite aguante.&lt;br /&gt;
&lt;br /&gt;
Para construir esta lista, se debió de crear una copia de los modelos que hay en pygtfs en la base de datos local de Django manteniendo solo los datos que se desean cambiar, al ser eliminados de la lista también son eliminados de la base de datos para evitar que éste se llene o cause algún tipo de inconveniente.&lt;br /&gt;
&lt;br /&gt;
Ya cuando tengamos todos nuestros cambios guardados, apretamos en el botón de '''Actualizar GTFS'''. Éste proceso puede llegar a tardar entre 7 a 8 minutos en ser completado, por lo que el botón se bloqueará durante este tiempo. Una vez finalizado debemos dirigirnos al panel de administración para cambiar el router de evaluación y utilizar el que acabamos de construir. Para ello se entra a [http://146.155.17.19:17080/admin/wyp/server/1/change/] y se modifica la URL en cuestion para cambiar '''/routers/&amp;lt;texto-a-cambiar&amp;gt;/isochrone?''' por '''/routers/WYP/isochrone?'''. Una vez realizado este cambio podemos efectuar las consultas con nuestras nuevas frecuencias de buses.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que este proceso es temporal mientras no se construya un front-end ideal, ésta herramienta se construyó de esta forma para probar su funcionalidad y no garantiza lo más óptimo.&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
El código se puede encontrar acá: http://146.155.17.14:18080/csfuente/wyp-django/ y se encuentra funcionando en http://146.155.17.19:17080/&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-12-27T21:26:00Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Cambio de frecuencia de buses editando el archivo GTFS de Santiago */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike Model ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian &amp;amp; Transit Model ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y editamos el archivo wyp/views.py para que acepte los datos de Pedestrian:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
&lt;br /&gt;
def xml(request):&lt;br /&gt;
...&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y probamos como va funcionando con&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para Transit hay que seguir pasos similares a Pedestrian, observar el código para ver como queda configurado.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Finalmente el programa queda funcionando con muchos menos procesos y de forma más independiente, no requiere de una instalación de geoserver, tan solo Django Python, html, css y js.&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Gracias a Django fue posible crear un panel de administración para modificar ciertos valores dentro del código, además de agregar características nuevas que se explicarán a continuación:&lt;br /&gt;
&lt;br /&gt;
== Demographic group ==&lt;br /&gt;
&lt;br /&gt;
La idea es evaluar los POIs para distintos grupos demográficos, quien hace ese trabajo es la función de AggregationService.py, pero para que la petición llegue desde la interfaz también debe de llegarle a ManagementService.py, por lo que realizaremos estas modificaciones:&lt;br /&gt;
&lt;br /&gt;
Primero creamos el modelo de datos que contendrá a las opciones de grupos demográficos en la base de datos, para ello editamos el archivo wyp/models.py y agregamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.db import models&lt;br /&gt;
&lt;br /&gt;
class Demographic(models.Model):&lt;br /&gt;
	value = models.CharField(max_length=255)                #Nombre de la opcion demografica&lt;br /&gt;
	bank = models.CharField(max_length=255)                 #Pesos&lt;br /&gt;
	grocery = models.CharField(max_length=255)&lt;br /&gt;
	restaurant = models.CharField(max_length=255)&lt;br /&gt;
	shopping = models.CharField(max_length=255)&lt;br /&gt;
	entertainment = models.CharField(max_length=255)&lt;br /&gt;
	school = models.CharField(max_length=255)&lt;br /&gt;
	library = models.CharField(max_length=255)&lt;br /&gt;
	health = models.CharField(max_length=255)&lt;br /&gt;
	sum = models.FloatField(blank=True,default=0)           #Suma de los pesos anteriores&lt;br /&gt;
	score_factor = models.FloatField(blank=True,default=0)  #Valor de ponderacion&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.value&lt;br /&gt;
&lt;br /&gt;
        #Generar el resultado de sum y score_factor automaticamente al guardar&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		sumando = 0&lt;br /&gt;
		for i in ast.literal_eval(self.bank):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.grocery):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.restaurant):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.shopping):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.entertainment):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.school):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.library):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.health):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		self.sum = sumando&lt;br /&gt;
		self.score_factor = 100.0/float(sumando)&lt;br /&gt;
		super(Demographic,self).save(*args, **kwargs)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos este modelo al panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic&lt;br /&gt;
&lt;br /&gt;
admin.site.register(Demographic)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modificamos el archivo wyp/views.py para mandar estos datos a la vista html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  demographic = Demographic.objects.all()&lt;br /&gt;
  return render_to_response('index.html',{'demographic':demographic},context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego modificamos el archivo html que se encuentra en template para que éstos aparezcan dinámicamente como una lista de opciones. template/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Cycling Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_bike&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_bike&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_bike&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('bike')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_pedestrian&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_pedestrian&amp;quot; name=&amp;quot;start_point_pedestrian&amp;quot;&lt;br /&gt;
                           readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                        &amp;lt;div id=&amp;quot;walking_speed_pedestrian&amp;quot;&lt;br /&gt;
                             style=&amp;quot;width: 100px; height: 6px; margin:15px 10px auto 15px; display: inline-block;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
                        &amp;lt;span style=&amp;quot;font-size: 10px;&amp;quot;&amp;gt;Fast&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                &amp;lt;select id=&amp;quot;demographic_pedestrian&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_pedestrian&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('pedestrian')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Transit and Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_transit&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_transit&amp;quot; name=&amp;quot;start_point_transit&amp;quot; readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_transit&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                &lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('transit')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que estos valores sean reconocidos por el js que llama a la url /call_wps.php hay que modificar el archivo template/js/main.js para cada una de las opciones que se le agregó la opción demográfica&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function call_wps(approach){&lt;br /&gt;
    var start_point;&lt;br /&gt;
    ...&lt;br /&gt;
    var wps_call;&lt;br /&gt;
    var demographic;&lt;br /&gt;
&lt;br /&gt;
    switch (approach) {&lt;br /&gt;
        case &amp;quot;bike&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_bike').val();&lt;br /&gt;
            biking_time_period = $('#biking_time_period_amount').val();&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_bike').prop('checked');&lt;br /&gt;
            demographic = $('#demographic_bike option:selected').text();&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=bike&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;biking_time_period=&amp;quot; + biking_time_period + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;pedestrian&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_pedestrian').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_pedestrian').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_pedestrian').val();&lt;br /&gt;
            demographic = $('#demographic_pedestrian option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_pedestrian').prop('checked');&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=pedestrian&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;transit&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_transit').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_transit').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_transit').val();&lt;br /&gt;
            demographic = $('#demographic_transit option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_transit').prop('checked');&lt;br /&gt;
            walking_start_time = $('#walking_start_time').val() + &amp;quot;:00&amp;quot;;&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=transit&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_start_time=&amp;quot; + walking_start_time + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;bus_waiting_time=0&amp;amp;bus_riding_time=0&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Con ésto, ahora podemos recibir el valor escogido para la opción demográfica vía GET, por lo que ahora nos vamos a editar el archivo '''wyp/views.py''' para manejarlo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'transit':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic', default=None)&lt;br /&gt;
    return HttpResponse(managementTransit(start_point,walking_start_time,walking_time_period,walking_speed,bus_waiting_time,bus_riding_time, distance_decay_function,demographic))&lt;br /&gt;
  else:&lt;br /&gt;
  	return HttpResponse('')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos, ahora enviamos también la opción demográfica como nuevo parámetro de la función management* por lo que debemos modificar cada uno de ellos, de todas formas para todo es lo mismo por lo que solo se explicará el cambio realizado en Bike en el archivo '''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function,demographic):&lt;br /&gt;
    ...&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period,demographic)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente debemos editar el archivo en cuestión que nos retorna la puntuación, '''wyp/AggregationService.py'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from models import Demographic&lt;br /&gt;
&lt;br /&gt;
def aggregation(start_point, walkshed, crime_data, poi_data, distance_decay_function, walking_time_period,demographic):&lt;br /&gt;
    if poi_data != '&amp;quot;NULL&amp;quot;':&lt;br /&gt;
&lt;br /&gt;
        demographic_value = Demographic.objects.get(value=demographic)&lt;br /&gt;
&lt;br /&gt;
        poi_weights = {&amp;quot;Bank&amp;quot;: ast.literal_eval(demographic_value.bank),  #bank&lt;br /&gt;
                       &amp;quot;Grocery&amp;quot;: ast.literal_eval(demographic_value.grocery),  #grocery&lt;br /&gt;
                       &amp;quot;Restaurant&amp;quot;: ast.literal_eval(demographic_value.restaurant),  #restaurant and coffee&lt;br /&gt;
                       &amp;quot;Shopping&amp;quot;: ast.literal_eval(demographic_value.shopping),  #shopping&lt;br /&gt;
                       &amp;quot;Entertainment&amp;quot;: ast.literal_eval(demographic_value.entertainment),  #entertainment&lt;br /&gt;
                       &amp;quot;School&amp;quot;: ast.literal_eval(demographic_value.school),  #school&lt;br /&gt;
                       &amp;quot;Library&amp;quot;: ast.literal_eval(demographic_value.library),  #library&lt;br /&gt;
                       &amp;quot;Health&amp;quot;: ast.literal_eval(demographic_value.health)  #health&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entonces, para probar que todo esto funciona debemos ejecutar estos comandos desde la raíz del proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics  #por la midificacion de template/js/main.js&lt;br /&gt;
python manage.py makemigrations  # por la creacion del modelo Demographic&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alerta cuando uno de los servidores externos está caido ==&lt;br /&gt;
&lt;br /&gt;
Ha pasado que las VMs de OTP y de Overpass se caen por alguna razón o simplemente no parten correctamente lo que afecta directamente el funcionamiento de esta aplicación, para ello es importante saber cuál es la que está causando el problema, con ello necesitamos primero encontrar el error por lo que editaremos lo siguiente (nuevamente se mostrará con Bike, se realizó lo mismo con Pedestrian y Transit)&lt;br /&gt;
&lt;br /&gt;
En el archivo '''wyp/ManagementServiceBike.py''' agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    ...&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para generar la alerta lo haremos gracias a la ayuda del archivo '''template/js/main.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
        },&lt;br /&gt;
        success: function (data, status) {&lt;br /&gt;
            var wps_results = $.parseJSON(data);&lt;br /&gt;
&lt;br /&gt;
            var error_result = wps_results['error'];&lt;br /&gt;
            if (error_result){&lt;br /&gt;
                $.unblockUI();&lt;br /&gt;
                alert(error_result);&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de servidores de OTP y de overpass por panel de administración ==&lt;br /&gt;
&lt;br /&gt;
Una de las cosas principales que tiene Django es que cuenta con un panel de administración para poder editar la información de la base de datos o controlar ciertas configuraciones. En este caso crearemos un panel que permita intercambiar el servidor de OTP o de Overpass a cual queramos, para ello la guardaremos en la base de datos editando el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Server(models.Model):&lt;br /&gt;
	overpass = models.CharField(max_length=255,default='http://146.155.17.18:24080/api/interpreter')&lt;br /&gt;
	otp_bike = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochrone?&amp;amp;')&lt;br /&gt;
	otp_walk = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochroneOld?')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo agregamos al panel de administración agregando estas líneas en '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server&lt;br /&gt;
admin.site.register(Server)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos las siguientes líneas de comando para agregar la información a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py createsuperuser #crear un superusuario&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos ahora a la dirección http://localhost:8000/admin/ e ingresamos con el superusuario, entramos a Servers y creamos un elemento, los campos vendrán listos por lo que solo hay que guardar tal cual como sale.&lt;br /&gt;
&lt;br /&gt;
Luego editamos los archivos en donde se encuentra esta información&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_bike&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServicePedestrian.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceTransit.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/POIService.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = Server.objects.all()[0].overpass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análisis de muchos puntos mediante la subida de un archivo CSV ==&lt;br /&gt;
&lt;br /&gt;
Este trabajo se realiza netamente desde el panel de administración por lo que no se necesita de intervenir la interfaz. Se necesita de un sistema que reciba el archiv csv, lo lea línea por línea y lo analice según corresponda, la solución fue implementar un proceso extra (fuera de la interfaz) que realice el trabajo con tal de dejarlo funcionar toda la noche, por ejemplo.&lt;br /&gt;
&lt;br /&gt;
Como lo queremos ver en el panel de administración necesitamos crearle un modelo, para ello editamos nuevamente el archivo '''wyp/models.py''' agregando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
TYPES_OF_ANALYSYS = (&lt;br /&gt;
		('Bike','Cycling Model'),&lt;br /&gt;
		('Walk','Walking Model'),&lt;br /&gt;
		('Transit','Transit &amp;amp; Walking Model')&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
class Multiple_point_analysis(models.Model):&lt;br /&gt;
	csv_upload = models.FileField(upload_to='csv_uploads/')&lt;br /&gt;
	type_of_analysis = models.CharField(max_length=10,choices=TYPES_OF_ANALYSYS)&lt;br /&gt;
	demographic_group = models.ForeignKey(Demographic)&lt;br /&gt;
	analysed_pointset = models.BooleanField(default=False,blank=True,editable=False)&lt;br /&gt;
	results = models.FileField(upload_to='results/', blank=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.csv_upload.url.split('csv_uploads/')[-1]&lt;br /&gt;
&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		super(Multiple_point_analysis,self).save(*args, **kwargs)&lt;br /&gt;
		if not self.analysed_pointset:&lt;br /&gt;
			subprocess.Popen(shlex.split('python manage.py mass_analysis -i '+str(self.id)))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo mostramos en el panel editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis&lt;br /&gt;
admin.site.register(Multiple_point_analysis)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Además debemos agregar toda la siguiente rama de archivos:&lt;br /&gt;
* wyp/&lt;br /&gt;
** management/&lt;br /&gt;
*** __init__.py&lt;br /&gt;
*** commands/&lt;br /&gt;
**** __init__.py&lt;br /&gt;
**** _private.py&lt;br /&gt;
**** mass_analysis.py&lt;br /&gt;
&lt;br /&gt;
En donde ambos __init__.py y _private.py son archivos vacíos, management y commands carpetas y mass_analysis.py nuestra función que analizará el archivo csv. Entonces construimos el archivo '''wyp/management/commands/mass_analysis.py''' agregando las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wypdjango import settings&lt;br /&gt;
from wyp.models import Multiple_point_analysis&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
from wyp.ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
from wyp.ManagementServiceTransit import management as managementTransit&lt;br /&gt;
from django.core.files import File&lt;br /&gt;
import json&lt;br /&gt;
from time import time&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
	help = &amp;quot;Performs mass analysis from a csv file.\nIt requires id model to analyze.&amp;quot;&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-i',action='store',&lt;br /&gt;
				dest='i',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='id of the csv file in the model'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		csv_model = options['i']&lt;br /&gt;
		csv_model = Multiple_point_analysis.objects.get(id=int(csv_model))&lt;br /&gt;
&lt;br /&gt;
		filename = csv_model.csv_upload.url.split('/media/')[-1]&lt;br /&gt;
&lt;br /&gt;
		url = settings.MEDIA_ROOT + filename&lt;br /&gt;
&lt;br /&gt;
		csv = open(url,'r')&lt;br /&gt;
		lines = csv.read().split('\n')&lt;br /&gt;
		csv.close()&lt;br /&gt;
&lt;br /&gt;
		temp = open('/tmp/analysis_from_wyp.csv','w')&lt;br /&gt;
		temp.write('id;x;y;score;area;time;POI count;\n')&lt;br /&gt;
&lt;br /&gt;
		id_result = 1&lt;br /&gt;
&lt;br /&gt;
		try:&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Bike':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;biking_time_period;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+','+aux[2]&lt;br /&gt;
						biking_time_period = aux[3]&lt;br /&gt;
						distance_decay_function = aux[4]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementBike(start_point,biking_time_period,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result)+';'+aux[1]+';'+aux[2]+';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Walk':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						#aux = id;x;y;walking_time_period;walking_speed;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+';'+aux[2]&lt;br /&gt;
						walking_time_period = aux[3]&lt;br /&gt;
						walking_speed = aux[4]&lt;br /&gt;
						distance_decay_function = aux[5]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementPedestrian(start_point, walking_time_period, walking_speed, distance_decay_function, csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
			if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;start_time;walking_time_period;walking_speed;bus_waiting_time;bus_ride_time;distance_decay_function&lt;br /&gt;
						start_point = aux[1] + ';' + aux[2]&lt;br /&gt;
						start_time_transit = aux[3]&lt;br /&gt;
						walking_time_period = aux[4]&lt;br /&gt;
						walking_speed = aux[5]&lt;br /&gt;
						#bus_waiting_time = aux[6]&lt;br /&gt;
						bus_waiting_time = '0'&lt;br /&gt;
						#bus_ride_time = aux[7]&lt;br /&gt;
						bus_ride_time = '0'&lt;br /&gt;
						distance_decay_function = aux[6]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementTransit(start_point,start_time_transit,walking_time_period,walking_speed,bus_waiting_time,bus_ride_time,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
		except Exception as e:&lt;br /&gt;
			pass&lt;br /&gt;
&lt;br /&gt;
		#Pendiente!!!!!&lt;br /&gt;
		if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
			management(start_point, start_time, walking_time_period, walking_speed, bus_waiting_time, bus_ride_time, distance_decay_function)&lt;br /&gt;
			pass			&lt;br /&gt;
&lt;br /&gt;
		temp.close()&lt;br /&gt;
&lt;br /&gt;
		csv_model.analysed_pointset = True&lt;br /&gt;
		csv_model.results.save('results/' + csv_model.csv_upload.name.split('csv_uploads/')[-1] + '.csv', File(open('/tmp/analysis_from_wyp.csv')))&lt;br /&gt;
		csv_model.save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecuntamos estas líneas de comando para agregar el modelo a la base de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos a http://localhost:8000/admin y nos encontraremos con la opción de Multiple_point_analysis en donde tenemos que hacer click en &amp;quot;add multiple_point_analysis&amp;quot;. Llenamos los campos que se encuentran en negrita y apretamos en &amp;quot;SAVE&amp;quot;. Esperamos a que finalice (~15 segundos por línea de CSV) y los resultados estarán en el campo &amp;quot;Results&amp;quot; como archivo csv para descargar.&lt;br /&gt;
&lt;br /&gt;
== Sistema de Log para análisis de archivos CSV ==&lt;br /&gt;
&lt;br /&gt;
Como no se sabe si de verdad está funcionando o hay problemas de por medio al momento de analizar un archivo CSV, se creó un sistema de log que nos permita saber que es lo que está sucediendo. Para ello lo creamos como proceso al igual que el análisis del archivo. por lo que creamos el archivo '''wyp/management/commands/log.py''' y le agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wyp.models import Log_wyp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
&lt;br /&gt;
	help = &amp;quot;Save logs to the system&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-l',action='store',&lt;br /&gt;
				dest='l',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='message log'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		message = options['l']&lt;br /&gt;
&lt;br /&gt;
		if message != '':&lt;br /&gt;
			if len(message)&amp;gt;255:&lt;br /&gt;
				Log_wyp(log=message[:255]).save()&lt;br /&gt;
			else:&lt;br /&gt;
				Log_wyp(log=message).save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos el modelo en el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Log_wyp(models.Model):&lt;br /&gt;
	log = models.CharField(max_length=255,default='')&lt;br /&gt;
	created = models.DateTimeField(auto_now_add=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return str(self.created.strftime('%Y-%m-%d %H:%M:%S')) + ' ' +self.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo mostramos en el panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis, Log_wyp&lt;br /&gt;
admin.site.register(Log_wyp)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos los comandos para agregar el modelo a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ahora, para poder agregar cualquier log lo podemos hacer ejecutando el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py log -l &amp;quot;Mensaje a registrar&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que, por ejemplo, al integrarlo al archivo '''wyp/management/commands/mass_analysis.py''' se realizó lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
subprocess.Popen(shlex.split('python manage.py log -l &amp;quot;' + filename + ' Starting analysis&amp;quot;'))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de frecuencia de buses editando el archivo GTFS de Santiago ==&lt;br /&gt;
&lt;br /&gt;
Se trabaja actualmente en la construcción de una herramienta que permia cambiar las frecuencias de las líneas de buses y metro de la ciudad de Santiago con el objetivo de poder analizar los cambios de accesibilidad urbana derivadas de ésto. Con ello, en Django Python, se cargó en una base de datos SQLite (aparte de la que ya utiliza Django) el GTFS de los datos de la ciudad en cuestión gracias al módulo pygtfs. Para utilizar sus datos solo basta con llamarlos con sus funciones.&lt;br /&gt;
&lt;br /&gt;
Con ello, las frecuencias de los recorridos se encuentran en el archivo frequencies.txt dentro del archivo comprimido GTFS.zip. Con el módulo pygtfs previamente configurado se pueden llamar dichos datos con los comandos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
sched = pygtfs.Schedule(MEDIA_ROOT + 'gtfs.sqlite')&lt;br /&gt;
frequencies = sched.frequencies&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
generando en '''frequencies''' una lista con todas las frecuencias y los datos adjuntos que podemos ver en el mismo archivo de texto pero como objeto python.&lt;br /&gt;
&lt;br /&gt;
Luego se creó una vista en [http://146.155.17.19:17080/gtfs/update_frequencies] en donde encontraremos un espacio de selección de viaje identificado por su ID en la cual al ser seleccionada se desplegará su información, tal como su hora de inicio, hora de fin y su frecuencia de salida, este último en un campo editable. Cuando ya cambiamos este valor, podemos guardar este dato en una lista de futuros datos para ser actualizados, la cual la podemos ver en la zona inferior de este formulario. Ésta lista puede ser tan grande como SQLite aguante.&lt;br /&gt;
&lt;br /&gt;
Para construir esta lista, se debió de crear una copia de los modelos que hay en pygtfs en la base de datos local de Django manteniendo solo los datos que se desean cambiar, al ser eliminados de la lista también son eliminados de la base de datos para evitar que éste se llene o cause algún tipo de inconveniente.&lt;br /&gt;
&lt;br /&gt;
Ya cuando tengamos todos nuestros cambios guardados, apretamos en el botón de '''Actualizar GTFS'''. Éste proceso puede llegar a tardar entre 7 a 8 minutos en ser completado, por lo que el botón se bloqueará durante este tiempo. Una vez finalizado debemos dirigirnos al panel de administración para cambiar el router de evaluación y utilizar el que acabamos de construir. Para ello se entra a [http://146.155.17.19:17080/admin/wyp/server/1/change/] y se modifica la URL en cuestion para cambiar '''/routers/&amp;lt;texto-a-cambiar&amp;gt;/isochrone?''' por '''/routers/WYP/isochrone?'''. Una vez realizado este cambio podemos efectuar las consultas con nuestras nuevas frecuencias de buses.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que este proceso es temporal mientras no se construya un front-end ideal, ésta herramienta se construyó de esta forma para probar su funcionalidad y no garantiza lo más óptimo.&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
El código se puede encontrar acá: http://146.155.17.18:18080/csfuente/wyp-django/ y se encuentra funcionando en http://146.155.17.19:17080/&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-12-27T21:06:33Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Sistema de Log para análisis de archivos CSV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike Model ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian &amp;amp; Transit Model ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y editamos el archivo wyp/views.py para que acepte los datos de Pedestrian:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
&lt;br /&gt;
def xml(request):&lt;br /&gt;
...&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y probamos como va funcionando con&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para Transit hay que seguir pasos similares a Pedestrian, observar el código para ver como queda configurado.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Finalmente el programa queda funcionando con muchos menos procesos y de forma más independiente, no requiere de una instalación de geoserver, tan solo Django Python, html, css y js.&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Gracias a Django fue posible crear un panel de administración para modificar ciertos valores dentro del código, además de agregar características nuevas que se explicarán a continuación:&lt;br /&gt;
&lt;br /&gt;
== Demographic group ==&lt;br /&gt;
&lt;br /&gt;
La idea es evaluar los POIs para distintos grupos demográficos, quien hace ese trabajo es la función de AggregationService.py, pero para que la petición llegue desde la interfaz también debe de llegarle a ManagementService.py, por lo que realizaremos estas modificaciones:&lt;br /&gt;
&lt;br /&gt;
Primero creamos el modelo de datos que contendrá a las opciones de grupos demográficos en la base de datos, para ello editamos el archivo wyp/models.py y agregamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.db import models&lt;br /&gt;
&lt;br /&gt;
class Demographic(models.Model):&lt;br /&gt;
	value = models.CharField(max_length=255)                #Nombre de la opcion demografica&lt;br /&gt;
	bank = models.CharField(max_length=255)                 #Pesos&lt;br /&gt;
	grocery = models.CharField(max_length=255)&lt;br /&gt;
	restaurant = models.CharField(max_length=255)&lt;br /&gt;
	shopping = models.CharField(max_length=255)&lt;br /&gt;
	entertainment = models.CharField(max_length=255)&lt;br /&gt;
	school = models.CharField(max_length=255)&lt;br /&gt;
	library = models.CharField(max_length=255)&lt;br /&gt;
	health = models.CharField(max_length=255)&lt;br /&gt;
	sum = models.FloatField(blank=True,default=0)           #Suma de los pesos anteriores&lt;br /&gt;
	score_factor = models.FloatField(blank=True,default=0)  #Valor de ponderacion&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.value&lt;br /&gt;
&lt;br /&gt;
        #Generar el resultado de sum y score_factor automaticamente al guardar&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		sumando = 0&lt;br /&gt;
		for i in ast.literal_eval(self.bank):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.grocery):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.restaurant):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.shopping):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.entertainment):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.school):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.library):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.health):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		self.sum = sumando&lt;br /&gt;
		self.score_factor = 100.0/float(sumando)&lt;br /&gt;
		super(Demographic,self).save(*args, **kwargs)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos este modelo al panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic&lt;br /&gt;
&lt;br /&gt;
admin.site.register(Demographic)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modificamos el archivo wyp/views.py para mandar estos datos a la vista html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  demographic = Demographic.objects.all()&lt;br /&gt;
  return render_to_response('index.html',{'demographic':demographic},context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego modificamos el archivo html que se encuentra en template para que éstos aparezcan dinámicamente como una lista de opciones. template/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Cycling Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_bike&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_bike&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_bike&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('bike')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_pedestrian&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_pedestrian&amp;quot; name=&amp;quot;start_point_pedestrian&amp;quot;&lt;br /&gt;
                           readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                        &amp;lt;div id=&amp;quot;walking_speed_pedestrian&amp;quot;&lt;br /&gt;
                             style=&amp;quot;width: 100px; height: 6px; margin:15px 10px auto 15px; display: inline-block;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
                        &amp;lt;span style=&amp;quot;font-size: 10px;&amp;quot;&amp;gt;Fast&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                &amp;lt;select id=&amp;quot;demographic_pedestrian&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_pedestrian&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('pedestrian')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Transit and Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_transit&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_transit&amp;quot; name=&amp;quot;start_point_transit&amp;quot; readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_transit&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                &lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('transit')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que estos valores sean reconocidos por el js que llama a la url /call_wps.php hay que modificar el archivo template/js/main.js para cada una de las opciones que se le agregó la opción demográfica&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function call_wps(approach){&lt;br /&gt;
    var start_point;&lt;br /&gt;
    ...&lt;br /&gt;
    var wps_call;&lt;br /&gt;
    var demographic;&lt;br /&gt;
&lt;br /&gt;
    switch (approach) {&lt;br /&gt;
        case &amp;quot;bike&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_bike').val();&lt;br /&gt;
            biking_time_period = $('#biking_time_period_amount').val();&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_bike').prop('checked');&lt;br /&gt;
            demographic = $('#demographic_bike option:selected').text();&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=bike&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;biking_time_period=&amp;quot; + biking_time_period + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;pedestrian&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_pedestrian').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_pedestrian').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_pedestrian').val();&lt;br /&gt;
            demographic = $('#demographic_pedestrian option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_pedestrian').prop('checked');&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=pedestrian&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;transit&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_transit').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_transit').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_transit').val();&lt;br /&gt;
            demographic = $('#demographic_transit option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_transit').prop('checked');&lt;br /&gt;
            walking_start_time = $('#walking_start_time').val() + &amp;quot;:00&amp;quot;;&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=transit&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_start_time=&amp;quot; + walking_start_time + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;bus_waiting_time=0&amp;amp;bus_riding_time=0&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Con ésto, ahora podemos recibir el valor escogido para la opción demográfica vía GET, por lo que ahora nos vamos a editar el archivo '''wyp/views.py''' para manejarlo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'transit':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic', default=None)&lt;br /&gt;
    return HttpResponse(managementTransit(start_point,walking_start_time,walking_time_period,walking_speed,bus_waiting_time,bus_riding_time, distance_decay_function,demographic))&lt;br /&gt;
  else:&lt;br /&gt;
  	return HttpResponse('')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos, ahora enviamos también la opción demográfica como nuevo parámetro de la función management* por lo que debemos modificar cada uno de ellos, de todas formas para todo es lo mismo por lo que solo se explicará el cambio realizado en Bike en el archivo '''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function,demographic):&lt;br /&gt;
    ...&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period,demographic)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente debemos editar el archivo en cuestión que nos retorna la puntuación, '''wyp/AggregationService.py'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from models import Demographic&lt;br /&gt;
&lt;br /&gt;
def aggregation(start_point, walkshed, crime_data, poi_data, distance_decay_function, walking_time_period,demographic):&lt;br /&gt;
    if poi_data != '&amp;quot;NULL&amp;quot;':&lt;br /&gt;
&lt;br /&gt;
        demographic_value = Demographic.objects.get(value=demographic)&lt;br /&gt;
&lt;br /&gt;
        poi_weights = {&amp;quot;Bank&amp;quot;: ast.literal_eval(demographic_value.bank),  #bank&lt;br /&gt;
                       &amp;quot;Grocery&amp;quot;: ast.literal_eval(demographic_value.grocery),  #grocery&lt;br /&gt;
                       &amp;quot;Restaurant&amp;quot;: ast.literal_eval(demographic_value.restaurant),  #restaurant and coffee&lt;br /&gt;
                       &amp;quot;Shopping&amp;quot;: ast.literal_eval(demographic_value.shopping),  #shopping&lt;br /&gt;
                       &amp;quot;Entertainment&amp;quot;: ast.literal_eval(demographic_value.entertainment),  #entertainment&lt;br /&gt;
                       &amp;quot;School&amp;quot;: ast.literal_eval(demographic_value.school),  #school&lt;br /&gt;
                       &amp;quot;Library&amp;quot;: ast.literal_eval(demographic_value.library),  #library&lt;br /&gt;
                       &amp;quot;Health&amp;quot;: ast.literal_eval(demographic_value.health)  #health&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entonces, para probar que todo esto funciona debemos ejecutar estos comandos desde la raíz del proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics  #por la midificacion de template/js/main.js&lt;br /&gt;
python manage.py makemigrations  # por la creacion del modelo Demographic&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alerta cuando uno de los servidores externos está caido ==&lt;br /&gt;
&lt;br /&gt;
Ha pasado que las VMs de OTP y de Overpass se caen por alguna razón o simplemente no parten correctamente lo que afecta directamente el funcionamiento de esta aplicación, para ello es importante saber cuál es la que está causando el problema, con ello necesitamos primero encontrar el error por lo que editaremos lo siguiente (nuevamente se mostrará con Bike, se realizó lo mismo con Pedestrian y Transit)&lt;br /&gt;
&lt;br /&gt;
En el archivo '''wyp/ManagementServiceBike.py''' agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    ...&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para generar la alerta lo haremos gracias a la ayuda del archivo '''template/js/main.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
        },&lt;br /&gt;
        success: function (data, status) {&lt;br /&gt;
            var wps_results = $.parseJSON(data);&lt;br /&gt;
&lt;br /&gt;
            var error_result = wps_results['error'];&lt;br /&gt;
            if (error_result){&lt;br /&gt;
                $.unblockUI();&lt;br /&gt;
                alert(error_result);&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de servidores de OTP y de overpass por panel de administración ==&lt;br /&gt;
&lt;br /&gt;
Una de las cosas principales que tiene Django es que cuenta con un panel de administración para poder editar la información de la base de datos o controlar ciertas configuraciones. En este caso crearemos un panel que permita intercambiar el servidor de OTP o de Overpass a cual queramos, para ello la guardaremos en la base de datos editando el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Server(models.Model):&lt;br /&gt;
	overpass = models.CharField(max_length=255,default='http://146.155.17.18:24080/api/interpreter')&lt;br /&gt;
	otp_bike = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochrone?&amp;amp;')&lt;br /&gt;
	otp_walk = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochroneOld?')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo agregamos al panel de administración agregando estas líneas en '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server&lt;br /&gt;
admin.site.register(Server)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos las siguientes líneas de comando para agregar la información a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py createsuperuser #crear un superusuario&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos ahora a la dirección http://localhost:8000/admin/ e ingresamos con el superusuario, entramos a Servers y creamos un elemento, los campos vendrán listos por lo que solo hay que guardar tal cual como sale.&lt;br /&gt;
&lt;br /&gt;
Luego editamos los archivos en donde se encuentra esta información&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_bike&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServicePedestrian.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceTransit.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/POIService.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = Server.objects.all()[0].overpass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análisis de muchos puntos mediante la subida de un archivo CSV ==&lt;br /&gt;
&lt;br /&gt;
Este trabajo se realiza netamente desde el panel de administración por lo que no se necesita de intervenir la interfaz. Se necesita de un sistema que reciba el archiv csv, lo lea línea por línea y lo analice según corresponda, la solución fue implementar un proceso extra (fuera de la interfaz) que realice el trabajo con tal de dejarlo funcionar toda la noche, por ejemplo.&lt;br /&gt;
&lt;br /&gt;
Como lo queremos ver en el panel de administración necesitamos crearle un modelo, para ello editamos nuevamente el archivo '''wyp/models.py''' agregando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
TYPES_OF_ANALYSYS = (&lt;br /&gt;
		('Bike','Cycling Model'),&lt;br /&gt;
		('Walk','Walking Model'),&lt;br /&gt;
		('Transit','Transit &amp;amp; Walking Model')&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
class Multiple_point_analysis(models.Model):&lt;br /&gt;
	csv_upload = models.FileField(upload_to='csv_uploads/')&lt;br /&gt;
	type_of_analysis = models.CharField(max_length=10,choices=TYPES_OF_ANALYSYS)&lt;br /&gt;
	demographic_group = models.ForeignKey(Demographic)&lt;br /&gt;
	analysed_pointset = models.BooleanField(default=False,blank=True,editable=False)&lt;br /&gt;
	results = models.FileField(upload_to='results/', blank=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.csv_upload.url.split('csv_uploads/')[-1]&lt;br /&gt;
&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		super(Multiple_point_analysis,self).save(*args, **kwargs)&lt;br /&gt;
		if not self.analysed_pointset:&lt;br /&gt;
			subprocess.Popen(shlex.split('python manage.py mass_analysis -i '+str(self.id)))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo mostramos en el panel editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis&lt;br /&gt;
admin.site.register(Multiple_point_analysis)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Además debemos agregar toda la siguiente rama de archivos:&lt;br /&gt;
* wyp/&lt;br /&gt;
** management/&lt;br /&gt;
*** __init__.py&lt;br /&gt;
*** commands/&lt;br /&gt;
**** __init__.py&lt;br /&gt;
**** _private.py&lt;br /&gt;
**** mass_analysis.py&lt;br /&gt;
&lt;br /&gt;
En donde ambos __init__.py y _private.py son archivos vacíos, management y commands carpetas y mass_analysis.py nuestra función que analizará el archivo csv. Entonces construimos el archivo '''wyp/management/commands/mass_analysis.py''' agregando las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wypdjango import settings&lt;br /&gt;
from wyp.models import Multiple_point_analysis&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
from wyp.ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
from wyp.ManagementServiceTransit import management as managementTransit&lt;br /&gt;
from django.core.files import File&lt;br /&gt;
import json&lt;br /&gt;
from time import time&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
	help = &amp;quot;Performs mass analysis from a csv file.\nIt requires id model to analyze.&amp;quot;&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-i',action='store',&lt;br /&gt;
				dest='i',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='id of the csv file in the model'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		csv_model = options['i']&lt;br /&gt;
		csv_model = Multiple_point_analysis.objects.get(id=int(csv_model))&lt;br /&gt;
&lt;br /&gt;
		filename = csv_model.csv_upload.url.split('/media/')[-1]&lt;br /&gt;
&lt;br /&gt;
		url = settings.MEDIA_ROOT + filename&lt;br /&gt;
&lt;br /&gt;
		csv = open(url,'r')&lt;br /&gt;
		lines = csv.read().split('\n')&lt;br /&gt;
		csv.close()&lt;br /&gt;
&lt;br /&gt;
		temp = open('/tmp/analysis_from_wyp.csv','w')&lt;br /&gt;
		temp.write('id;x;y;score;area;time;POI count;\n')&lt;br /&gt;
&lt;br /&gt;
		id_result = 1&lt;br /&gt;
&lt;br /&gt;
		try:&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Bike':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;biking_time_period;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+','+aux[2]&lt;br /&gt;
						biking_time_period = aux[3]&lt;br /&gt;
						distance_decay_function = aux[4]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementBike(start_point,biking_time_period,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result)+';'+aux[1]+';'+aux[2]+';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Walk':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						#aux = id;x;y;walking_time_period;walking_speed;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+';'+aux[2]&lt;br /&gt;
						walking_time_period = aux[3]&lt;br /&gt;
						walking_speed = aux[4]&lt;br /&gt;
						distance_decay_function = aux[5]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementPedestrian(start_point, walking_time_period, walking_speed, distance_decay_function, csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
			if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;start_time;walking_time_period;walking_speed;bus_waiting_time;bus_ride_time;distance_decay_function&lt;br /&gt;
						start_point = aux[1] + ';' + aux[2]&lt;br /&gt;
						start_time_transit = aux[3]&lt;br /&gt;
						walking_time_period = aux[4]&lt;br /&gt;
						walking_speed = aux[5]&lt;br /&gt;
						#bus_waiting_time = aux[6]&lt;br /&gt;
						bus_waiting_time = '0'&lt;br /&gt;
						#bus_ride_time = aux[7]&lt;br /&gt;
						bus_ride_time = '0'&lt;br /&gt;
						distance_decay_function = aux[6]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementTransit(start_point,start_time_transit,walking_time_period,walking_speed,bus_waiting_time,bus_ride_time,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
		except Exception as e:&lt;br /&gt;
			pass&lt;br /&gt;
&lt;br /&gt;
		#Pendiente!!!!!&lt;br /&gt;
		if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
			management(start_point, start_time, walking_time_period, walking_speed, bus_waiting_time, bus_ride_time, distance_decay_function)&lt;br /&gt;
			pass			&lt;br /&gt;
&lt;br /&gt;
		temp.close()&lt;br /&gt;
&lt;br /&gt;
		csv_model.analysed_pointset = True&lt;br /&gt;
		csv_model.results.save('results/' + csv_model.csv_upload.name.split('csv_uploads/')[-1] + '.csv', File(open('/tmp/analysis_from_wyp.csv')))&lt;br /&gt;
		csv_model.save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecuntamos estas líneas de comando para agregar el modelo a la base de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos a http://localhost:8000/admin y nos encontraremos con la opción de Multiple_point_analysis en donde tenemos que hacer click en &amp;quot;add multiple_point_analysis&amp;quot;. Llenamos los campos que se encuentran en negrita y apretamos en &amp;quot;SAVE&amp;quot;. Esperamos a que finalice (~15 segundos por línea de CSV) y los resultados estarán en el campo &amp;quot;Results&amp;quot; como archivo csv para descargar.&lt;br /&gt;
&lt;br /&gt;
== Sistema de Log para análisis de archivos CSV ==&lt;br /&gt;
&lt;br /&gt;
Como no se sabe si de verdad está funcionando o hay problemas de por medio al momento de analizar un archivo CSV, se creó un sistema de log que nos permita saber que es lo que está sucediendo. Para ello lo creamos como proceso al igual que el análisis del archivo. por lo que creamos el archivo '''wyp/management/commands/log.py''' y le agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wyp.models import Log_wyp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
&lt;br /&gt;
	help = &amp;quot;Save logs to the system&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-l',action='store',&lt;br /&gt;
				dest='l',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='message log'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		message = options['l']&lt;br /&gt;
&lt;br /&gt;
		if message != '':&lt;br /&gt;
			if len(message)&amp;gt;255:&lt;br /&gt;
				Log_wyp(log=message[:255]).save()&lt;br /&gt;
			else:&lt;br /&gt;
				Log_wyp(log=message).save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos el modelo en el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Log_wyp(models.Model):&lt;br /&gt;
	log = models.CharField(max_length=255,default='')&lt;br /&gt;
	created = models.DateTimeField(auto_now_add=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return str(self.created.strftime('%Y-%m-%d %H:%M:%S')) + ' ' +self.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo mostramos en el panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis, Log_wyp&lt;br /&gt;
admin.site.register(Log_wyp)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos los comandos para agregar el modelo a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ahora, para poder agregar cualquier log lo podemos hacer ejecutando el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py log -l &amp;quot;Mensaje a registrar&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que, por ejemplo, al integrarlo al archivo '''wyp/management/commands/mass_analysis.py''' se realizó lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
subprocess.Popen(shlex.split('python manage.py log -l &amp;quot;' + filename + ' Starting analysis&amp;quot;'))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de frecuencia de buses editando el archivo GTFS de Santiago ==&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
El código se puede encontrar acá: http://146.155.17.18:18080/csfuente/wyp-django/ y se encuentra funcionando en http://146.155.17.19:17080/&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Installing_Omeka_for_CEDEUS</id>
		<title>Installing Omeka for CEDEUS</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Installing_Omeka_for_CEDEUS"/>
				<updated>2016-11-07T19:51:42Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;gt;&amp;gt; return to [[Cedeus IDE]]&lt;br /&gt;
----&lt;br /&gt;
== Installing Omeka ==&lt;br /&gt;
&lt;br /&gt;
=== Setup of Omeka VM ===&lt;br /&gt;
==== Setup of VM based on Ubuntu 1404 VM ====&lt;br /&gt;
# copying basicubuntu1404.vdi file and renaming to omeka_ubuntu.vdi (note, accidentally I i used the nominatim VM disc, so I copied and renamed the VDI file to omeka_w_nominatim.vdi)&lt;br /&gt;
# creating the omeka VM on CedeusDB (ip.18):&lt;br /&gt;
#* &amp;lt;code&amp;gt;VBoxManage createvm --name omeka --ostype Ubuntu_64 --register&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;VBoxManage modifyvm omeka --memory 8096&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;VBoxManage modifyvm omeka --cpus 4&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;VBoxManage modifyvm omeka --nic1 nat&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;VBoxManage storagectl omeka --name &amp;quot;SATA Controller&amp;quot; --add sata --controller IntelAhci&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;VBoxManage internalcommands sethduuid omeka_w_nominatim.vdi&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;VBoxManage storageattach &amp;quot;omeka&amp;quot; --storagectl &amp;quot;SATA Controller&amp;quot; --port 0 --device 0 --type hdd --medium omeka_w_nominatim.vdi&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;VBoxManage storagectl omeka --name &amp;quot;IDE Controller&amp;quot; --add ide --controller PIIX4&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;VBoxManage modifyvm omeka --natpf1 &amp;quot;ssh,tcp,,20022,,22&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;VBoxManage modifyvm omeka --natpf1 &amp;quot;apache,tcp,,20080,,80&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;VBoxManage modifyvm omeka --vrdeport 7764&amp;lt;/code&amp;gt;&lt;br /&gt;
# start VM and change the computers name:&lt;br /&gt;
#* &amp;lt;code&amp;gt;VBoxHeadless -s omeka --vrde on &amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
#* change computers name in /etc/hosts and /etc/hostname to omeka&lt;br /&gt;
#* restarting Apache gives the error message: &amp;quot;apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 ...&amp;quot;&lt;br /&gt;
#:: =&amp;gt; solve this by adding ServerName nominatim as the last line in /etc/apache2/apache2.conf file &lt;br /&gt;
#* add additional users&lt;br /&gt;
&lt;br /&gt;
==== Adjustments to Apache config file ====&lt;br /&gt;
changes to ''/etc/apache2/sites-available/000-default.conf''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;VirtualHost *:80 146.155.17.18:20022&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        #ServerName www.example.com&lt;br /&gt;
        ServerName cedeuspubs.geosteiniger.cl&lt;br /&gt;
        ServerAdmin webmaster@localhost&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
 &lt;br /&gt;
        Redirect /pubs http://cedeuspubs.geosteiniger.cl/omeka/&lt;br /&gt;
 &lt;br /&gt;
        ErrorLog ${APACHE_LOG_DIR}/error.log&lt;br /&gt;
        CustomLog ${APACHE_LOG_DIR}/access.log combined&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;Directory &amp;quot;/var/www/html/nominatim/&amp;quot;&amp;gt;&lt;br /&gt;
           Options FollowSymLinks MultiViews&lt;br /&gt;
           AddType text/html   .php&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
           Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
           AllowOverride All&lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           allow from all&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt;&lt;br /&gt;
           AllowOverride All&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;Directory &amp;quot;/var/www/html/omeka&amp;quot;&amp;gt;&lt;br /&gt;
           AllowOverride All&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        RedirectMatch ^/$ /omeka/&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes on Omeka ==&lt;br /&gt;
&lt;br /&gt;
=== starting to use Omeka ===&lt;br /&gt;
* Make a plan on how it should be used first, as described here: http://omeka.org/codex/Site_Planning_Tips&lt;br /&gt;
* items and collection (formed of items) are the basic elements: &lt;br /&gt;
** items: http://omeka.org/codex/Managing_Items_2.0&lt;br /&gt;
** collections: http://omeka.org/codex/Managing_Collections_2.0&lt;br /&gt;
&lt;br /&gt;
=== public vs private items ===&lt;br /&gt;
see:&lt;br /&gt;
* http://omeka.org/forums/topic/issues-with-contributor-user-role&lt;br /&gt;
* plugins:&lt;br /&gt;
** http://omeka.org/codex/Plugins/Contribution_2.0 and, corresponding &amp;quot;guest user plugin&amp;quot;:&lt;br /&gt;
** http://omeka.org/codex/Plugins/GuestUser_2.0&lt;br /&gt;
* and, perhaps ??? for (filter) plugin development: http://omeka.org/forums/topic/ability-to-set-files-to-public-or-private&lt;br /&gt;
&lt;br /&gt;
=== changing file upload size ===&lt;br /&gt;
&lt;br /&gt;
Omeka uses the PhP default settings. So how to do that see http://www.cyberciti.biz/faq/linux-unix-apache-increase-php-upload-limit/&lt;br /&gt;
&lt;br /&gt;
* open ''/etc/php5/apache2/php.ini'' &lt;br /&gt;
* set the following variables:&lt;br /&gt;
** &amp;lt;code&amp;gt;upload_max_filesize&amp;lt;/code&amp;gt; (I chose 60MB)&lt;br /&gt;
** &amp;lt;code&amp;gt;memory_limit&amp;lt;/code&amp;gt; (I chose 128MB)&lt;br /&gt;
** &amp;lt;code&amp;gt;post_max_size&amp;lt;/code&amp;gt; (I chose 80MB)&lt;br /&gt;
&lt;br /&gt;
=== Zotero and Omeka ===&lt;br /&gt;
&lt;br /&gt;
Omeka can import data from a Zotero Group, so...&lt;br /&gt;
* I created a new Zotero group with my account (public visible, but private membership): https://www.zotero.org/groups/observatorio_cedeus&lt;br /&gt;
* Then I generated an API access key for this group (from my Zotero home/account page) that allows read access only to this new Observatory group&lt;br /&gt;
* Then I copied the Atom Feed URL to the Omeka Form, including the Zotero Access key&lt;br /&gt;
* Then I was able to select/and access stuff stored in the new group library (Ebrhaims 2015 IJGI paper) and importing it as item into Omeka.&lt;br /&gt;
*: =&amp;gt; Note, the '''pdf''' of the publication was '''not attached'''! I added the pdf file later manually from my desktop using ''Item'' &amp;gt; ''Editar'' &amp;gt; ''Archivos''.&lt;br /&gt;
&lt;br /&gt;
= Solution for hdd problem =&lt;br /&gt;
&lt;br /&gt;
for the problem '''Error: failed to start machine. Error message: UUID {64c8360e-8ce4-48de-844a-f3182a6815f1} of the medium '/home/ssteinig/omeka_w_nominatim.vdi' does not match the value {b7f765c4-c84e-4a34-87ac-c0fda5a6bdcf} stored in the media registry ('/home/ssteinig/.config/VirtualBox/VirtualBox.xml')'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
VBoxManage storageattach &amp;quot;omeka2&amp;quot; --storagectl &amp;quot;SATA Controller&amp;quot; --port 0 --device 0 --type hdd --medium none&lt;br /&gt;
VBoxManage closemedium disk b7f765c4-c84e-4a34-87ac-c0fda5a6bdcf&lt;br /&gt;
VBoxManage storageattach &amp;quot;omeka2&amp;quot; --storagectl &amp;quot;SATA Controller&amp;quot; --port 0 --device 0 --type hdd --medium omeka_w_nominatim.vdi &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2016-09-22T22:19:52Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Arrancar web cuando páginas están en Django Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
== Actualizar la información ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información es necesario ir revisando los cambios de los archivos GTFS que se encuentran disponibles en la red, cuando notemos que uno es más nuevo es necesario descargarlo y ubicarlo en la carpeta que contiene todos los archivos similares (Actualmente se está utilizando la carpeta /home/csfuente/otpTransantiago ) por lo que entramos a dicha carpeta y descargamos los datos con '''wget'''. Finalmente reiniciamos la VM, esperamos a que inicie (cerca de ~10 minutos) y estará con todos los datos actualizados.&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= CartoDB =&lt;br /&gt;
&lt;br /&gt;
== Levantar CartoDB cuando la máquina es encendida ==&lt;br /&gt;
&lt;br /&gt;
Subir CartoDB es un poco tedioso pero es posible sin complicaciónes, lo primero es exportar lo siguiente: (copy/paste a la terminal)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PATH=$PATH:/opt/rubies/ruby-2.2.3/bin&lt;br /&gt;
export CPLUS_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export C_INCLUDE_PATH=/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:/usr/include/gdal&lt;br /&gt;
export PATH=$PATH:$PWD/node_modules/grunt-cli/bin&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En mi cuenta agregué esas lineas al archivo .bashrc para que se ejecuten cada vez que entro por ssh a la VM.&lt;br /&gt;
Lo siguiente es ejecutar los procesos necesarios para que cartodb corra, para ello se ejecuta cada uno de ellos en una screen distinta (ya que no contamos con varias terminales por ssh)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/&lt;br /&gt;
screen&lt;br /&gt;
redis-server&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd cartodb&lt;br /&gt;
screen&lt;br /&gt;
bundle exec script/resque&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
bundle exec thin start --threaded -p 3000 --threadpool-size 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/Wireshark***&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /home/csfuente/CartoDB-SQL-API&lt;br /&gt;
screen&lt;br /&gt;
node app.js development&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ctrl+a''' y '''ctrl+d'''&lt;br /&gt;
&lt;br /&gt;
Con todo esto ahora podemos entrar a 146.155.17.18:3000 y usar cartodb.&lt;br /&gt;
&lt;br /&gt;
== Puertos utilizados en .18 por cartodb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Puerto&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Servicio&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:3000&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | cartodb-SQL-API&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:8181&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | Wireshark&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:6379&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | redis-server&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2016-09-20T15:23:11Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* OpenTripPlanner */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
== Actualizar la información ==&lt;br /&gt;
&lt;br /&gt;
Para actualizar la información es necesario ir revisando los cambios de los archivos GTFS que se encuentran disponibles en la red, cuando notemos que uno es más nuevo es necesario descargarlo y ubicarlo en la carpeta que contiene todos los archivos similares (Actualmente se está utilizando la carpeta /home/csfuente/otpTransantiago ) por lo que entramos a dicha carpeta y descargamos los datos con '''wget'''. Finalmente reiniciamos la VM, esperamos a que inicie (cerca de ~10 minutos) y estará con todos los datos actualizados.&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2016-09-20T15:19:58Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Instalación de Overpass API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actualización de Overpass ===&lt;br /&gt;
&lt;br /&gt;
Para la actualización debemos realizar nuevamente una instalación completa por cada vez que sale una versión, por lo que tenemos que comenzar con descargar la nueva versión desde el comando '''wget''' en adelante.&lt;br /&gt;
La última versión instalada actualmente es la '''0.7.53'''. Es posible utilizar el mismo archivo .osm.bz2 para evitar descargarlo nuevamente, éste lo encontraremos dentro de la carpeta de la versión anterior.&lt;br /&gt;
&lt;br /&gt;
En la edición del archivo /etc/apache2/sites-available/000-default.conf debemos cambiar la ruta '''[YOUR_EXEC_DIR]''' por la nueva generada por la descompresión de la nueva versión.&lt;br /&gt;
&lt;br /&gt;
Para encontrar las nuevas versiones de Overpass es necesario visitar http://dev.overpass-api.de/releases/&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2016-09-20T15:12:30Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Instalación de Overpass API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OwnCloud =&lt;br /&gt;
&lt;br /&gt;
backup location after clicking on OwnCloud update: /var/www/html/owncloud/data/updater_backup/8.2.2.2-8fa08547&lt;br /&gt;
&lt;br /&gt;
Variable for URL name:&lt;br /&gt;
 'overwrite.cli.url' =&amp;gt; 'http://146.155.17.18:17080/owncloud',&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
Y para todo Chile:&lt;br /&gt;
  ./otp --build /home/csfuente/otpTransantiago --inMemory&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Arrancar web cuando páginas están en Django Python =&lt;br /&gt;
&lt;br /&gt;
Cuando una VM se encuentra con una web en etapa de desarrollo con Django Python, para que ésta corra hay que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
Primero entrar a la VM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh 146.155.17.18 -p 22022&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posicionarse en la carpeta del proyecto (Ejemplo con VM de Gatherer)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd hibridinterfaz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Iniciar Screen, aplicación que abre una nueva terminal que es independiente a SSH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correr el servidor de Django con el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto ya la web está corriendo sin problemas, para salir de Screen hay que apretar '''Ctrl+a''' y luego '''Ctrl+d'''.&lt;br /&gt;
&lt;br /&gt;
== VMs con Django ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | VM&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; | Carpeta de proyecto&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:22080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/hibridinterfaz&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 18:21080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/Indicadores&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | 19:17080&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | /home/csfuente/wyp-django&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-09T04:14:59Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Funcionamiento actual */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike Model ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian &amp;amp; Transit Model ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y editamos el archivo wyp/views.py para que acepte los datos de Pedestrian:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
&lt;br /&gt;
def xml(request):&lt;br /&gt;
...&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y probamos como va funcionando con&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para Transit hay que seguir pasos similares a Pedestrian, observar el código para ver como queda configurado.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Finalmente el programa queda funcionando con muchos menos procesos y de forma más independiente, no requiere de una instalación de geoserver, tan solo Django Python, html, css y js.&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Gracias a Django fue posible crear un panel de administración para modificar ciertos valores dentro del código, además de agregar características nuevas que se explicarán a continuación:&lt;br /&gt;
&lt;br /&gt;
== Demographic group ==&lt;br /&gt;
&lt;br /&gt;
La idea es evaluar los POIs para distintos grupos demográficos, quien hace ese trabajo es la función de AggregationService.py, pero para que la petición llegue desde la interfaz también debe de llegarle a ManagementService.py, por lo que realizaremos estas modificaciones:&lt;br /&gt;
&lt;br /&gt;
Primero creamos el modelo de datos que contendrá a las opciones de grupos demográficos en la base de datos, para ello editamos el archivo wyp/models.py y agregamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.db import models&lt;br /&gt;
&lt;br /&gt;
class Demographic(models.Model):&lt;br /&gt;
	value = models.CharField(max_length=255)                #Nombre de la opcion demografica&lt;br /&gt;
	bank = models.CharField(max_length=255)                 #Pesos&lt;br /&gt;
	grocery = models.CharField(max_length=255)&lt;br /&gt;
	restaurant = models.CharField(max_length=255)&lt;br /&gt;
	shopping = models.CharField(max_length=255)&lt;br /&gt;
	entertainment = models.CharField(max_length=255)&lt;br /&gt;
	school = models.CharField(max_length=255)&lt;br /&gt;
	library = models.CharField(max_length=255)&lt;br /&gt;
	health = models.CharField(max_length=255)&lt;br /&gt;
	sum = models.FloatField(blank=True,default=0)           #Suma de los pesos anteriores&lt;br /&gt;
	score_factor = models.FloatField(blank=True,default=0)  #Valor de ponderacion&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.value&lt;br /&gt;
&lt;br /&gt;
        #Generar el resultado de sum y score_factor automaticamente al guardar&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		sumando = 0&lt;br /&gt;
		for i in ast.literal_eval(self.bank):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.grocery):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.restaurant):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.shopping):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.entertainment):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.school):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.library):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.health):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		self.sum = sumando&lt;br /&gt;
		self.score_factor = 100.0/float(sumando)&lt;br /&gt;
		super(Demographic,self).save(*args, **kwargs)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos este modelo al panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic&lt;br /&gt;
&lt;br /&gt;
admin.site.register(Demographic)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modificamos el archivo wyp/views.py para mandar estos datos a la vista html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  demographic = Demographic.objects.all()&lt;br /&gt;
  return render_to_response('index.html',{'demographic':demographic},context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego modificamos el archivo html que se encuentra en template para que éstos aparezcan dinámicamente como una lista de opciones. template/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Cycling Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_bike&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_bike&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_bike&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('bike')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_pedestrian&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_pedestrian&amp;quot; name=&amp;quot;start_point_pedestrian&amp;quot;&lt;br /&gt;
                           readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                        &amp;lt;div id=&amp;quot;walking_speed_pedestrian&amp;quot;&lt;br /&gt;
                             style=&amp;quot;width: 100px; height: 6px; margin:15px 10px auto 15px; display: inline-block;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
                        &amp;lt;span style=&amp;quot;font-size: 10px;&amp;quot;&amp;gt;Fast&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                &amp;lt;select id=&amp;quot;demographic_pedestrian&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_pedestrian&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('pedestrian')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Transit and Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_transit&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_transit&amp;quot; name=&amp;quot;start_point_transit&amp;quot; readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_transit&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                &lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('transit')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que estos valores sean reconocidos por el js que llama a la url /call_wps.php hay que modificar el archivo template/js/main.js para cada una de las opciones que se le agregó la opción demográfica&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function call_wps(approach){&lt;br /&gt;
    var start_point;&lt;br /&gt;
    ...&lt;br /&gt;
    var wps_call;&lt;br /&gt;
    var demographic;&lt;br /&gt;
&lt;br /&gt;
    switch (approach) {&lt;br /&gt;
        case &amp;quot;bike&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_bike').val();&lt;br /&gt;
            biking_time_period = $('#biking_time_period_amount').val();&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_bike').prop('checked');&lt;br /&gt;
            demographic = $('#demographic_bike option:selected').text();&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=bike&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;biking_time_period=&amp;quot; + biking_time_period + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;pedestrian&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_pedestrian').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_pedestrian').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_pedestrian').val();&lt;br /&gt;
            demographic = $('#demographic_pedestrian option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_pedestrian').prop('checked');&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=pedestrian&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;transit&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_transit').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_transit').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_transit').val();&lt;br /&gt;
            demographic = $('#demographic_transit option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_transit').prop('checked');&lt;br /&gt;
            walking_start_time = $('#walking_start_time').val() + &amp;quot;:00&amp;quot;;&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=transit&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_start_time=&amp;quot; + walking_start_time + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;bus_waiting_time=0&amp;amp;bus_riding_time=0&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Con ésto, ahora podemos recibir el valor escogido para la opción demográfica vía GET, por lo que ahora nos vamos a editar el archivo '''wyp/views.py''' para manejarlo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'transit':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic', default=None)&lt;br /&gt;
    return HttpResponse(managementTransit(start_point,walking_start_time,walking_time_period,walking_speed,bus_waiting_time,bus_riding_time, distance_decay_function,demographic))&lt;br /&gt;
  else:&lt;br /&gt;
  	return HttpResponse('')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos, ahora enviamos también la opción demográfica como nuevo parámetro de la función management* por lo que debemos modificar cada uno de ellos, de todas formas para todo es lo mismo por lo que solo se explicará el cambio realizado en Bike en el archivo '''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function,demographic):&lt;br /&gt;
    ...&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period,demographic)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente debemos editar el archivo en cuestión que nos retorna la puntuación, '''wyp/AggregationService.py'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from models import Demographic&lt;br /&gt;
&lt;br /&gt;
def aggregation(start_point, walkshed, crime_data, poi_data, distance_decay_function, walking_time_period,demographic):&lt;br /&gt;
    if poi_data != '&amp;quot;NULL&amp;quot;':&lt;br /&gt;
&lt;br /&gt;
        demographic_value = Demographic.objects.get(value=demographic)&lt;br /&gt;
&lt;br /&gt;
        poi_weights = {&amp;quot;Bank&amp;quot;: ast.literal_eval(demographic_value.bank),  #bank&lt;br /&gt;
                       &amp;quot;Grocery&amp;quot;: ast.literal_eval(demographic_value.grocery),  #grocery&lt;br /&gt;
                       &amp;quot;Restaurant&amp;quot;: ast.literal_eval(demographic_value.restaurant),  #restaurant and coffee&lt;br /&gt;
                       &amp;quot;Shopping&amp;quot;: ast.literal_eval(demographic_value.shopping),  #shopping&lt;br /&gt;
                       &amp;quot;Entertainment&amp;quot;: ast.literal_eval(demographic_value.entertainment),  #entertainment&lt;br /&gt;
                       &amp;quot;School&amp;quot;: ast.literal_eval(demographic_value.school),  #school&lt;br /&gt;
                       &amp;quot;Library&amp;quot;: ast.literal_eval(demographic_value.library),  #library&lt;br /&gt;
                       &amp;quot;Health&amp;quot;: ast.literal_eval(demographic_value.health)  #health&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entonces, para probar que todo esto funciona debemos ejecutar estos comandos desde la raíz del proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics  #por la midificacion de template/js/main.js&lt;br /&gt;
python manage.py makemigrations  # por la creacion del modelo Demographic&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alerta cuando uno de los servidores externos está caido ==&lt;br /&gt;
&lt;br /&gt;
Ha pasado que las VMs de OTP y de Overpass se caen por alguna razón o simplemente no parten correctamente lo que afecta directamente el funcionamiento de esta aplicación, para ello es importante saber cuál es la que está causando el problema, con ello necesitamos primero encontrar el error por lo que editaremos lo siguiente (nuevamente se mostrará con Bike, se realizó lo mismo con Pedestrian y Transit)&lt;br /&gt;
&lt;br /&gt;
En el archivo '''wyp/ManagementServiceBike.py''' agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    ...&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para generar la alerta lo haremos gracias a la ayuda del archivo '''template/js/main.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
        },&lt;br /&gt;
        success: function (data, status) {&lt;br /&gt;
            var wps_results = $.parseJSON(data);&lt;br /&gt;
&lt;br /&gt;
            var error_result = wps_results['error'];&lt;br /&gt;
            if (error_result){&lt;br /&gt;
                $.unblockUI();&lt;br /&gt;
                alert(error_result);&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de servidores de OTP y de overpass por panel de administración ==&lt;br /&gt;
&lt;br /&gt;
Una de las cosas principales que tiene Django es que cuenta con un panel de administración para poder editar la información de la base de datos o controlar ciertas configuraciones. En este caso crearemos un panel que permita intercambiar el servidor de OTP o de Overpass a cual queramos, para ello la guardaremos en la base de datos editando el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Server(models.Model):&lt;br /&gt;
	overpass = models.CharField(max_length=255,default='http://146.155.17.18:24080/api/interpreter')&lt;br /&gt;
	otp_bike = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochrone?&amp;amp;')&lt;br /&gt;
	otp_walk = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochroneOld?')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo agregamos al panel de administración agregando estas líneas en '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server&lt;br /&gt;
admin.site.register(Server)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos las siguientes líneas de comando para agregar la información a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py createsuperuser #crear un superusuario&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos ahora a la dirección http://localhost:8000/admin/ e ingresamos con el superusuario, entramos a Servers y creamos un elemento, los campos vendrán listos por lo que solo hay que guardar tal cual como sale.&lt;br /&gt;
&lt;br /&gt;
Luego editamos los archivos en donde se encuentra esta información&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_bike&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServicePedestrian.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceTransit.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/POIService.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = Server.objects.all()[0].overpass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análisis de muchos puntos mediante la subida de un archivo CSV ==&lt;br /&gt;
&lt;br /&gt;
Este trabajo se realiza netamente desde el panel de administración por lo que no se necesita de intervenir la interfaz. Se necesita de un sistema que reciba el archiv csv, lo lea línea por línea y lo analice según corresponda, la solución fue implementar un proceso extra (fuera de la interfaz) que realice el trabajo con tal de dejarlo funcionar toda la noche, por ejemplo.&lt;br /&gt;
&lt;br /&gt;
Como lo queremos ver en el panel de administración necesitamos crearle un modelo, para ello editamos nuevamente el archivo '''wyp/models.py''' agregando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
TYPES_OF_ANALYSYS = (&lt;br /&gt;
		('Bike','Cycling Model'),&lt;br /&gt;
		('Walk','Walking Model'),&lt;br /&gt;
		('Transit','Transit &amp;amp; Walking Model')&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
class Multiple_point_analysis(models.Model):&lt;br /&gt;
	csv_upload = models.FileField(upload_to='csv_uploads/')&lt;br /&gt;
	type_of_analysis = models.CharField(max_length=10,choices=TYPES_OF_ANALYSYS)&lt;br /&gt;
	demographic_group = models.ForeignKey(Demographic)&lt;br /&gt;
	analysed_pointset = models.BooleanField(default=False,blank=True,editable=False)&lt;br /&gt;
	results = models.FileField(upload_to='results/', blank=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.csv_upload.url.split('csv_uploads/')[-1]&lt;br /&gt;
&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		super(Multiple_point_analysis,self).save(*args, **kwargs)&lt;br /&gt;
		if not self.analysed_pointset:&lt;br /&gt;
			subprocess.Popen(shlex.split('python manage.py mass_analysis -i '+str(self.id)))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo mostramos en el panel editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis&lt;br /&gt;
admin.site.register(Multiple_point_analysis)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Además debemos agregar toda la siguiente rama de archivos:&lt;br /&gt;
* wyp/&lt;br /&gt;
** management/&lt;br /&gt;
*** __init__.py&lt;br /&gt;
*** commands/&lt;br /&gt;
**** __init__.py&lt;br /&gt;
**** _private.py&lt;br /&gt;
**** mass_analysis.py&lt;br /&gt;
&lt;br /&gt;
En donde ambos __init__.py y _private.py son archivos vacíos, management y commands carpetas y mass_analysis.py nuestra función que analizará el archivo csv. Entonces construimos el archivo '''wyp/management/commands/mass_analysis.py''' agregando las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wypdjango import settings&lt;br /&gt;
from wyp.models import Multiple_point_analysis&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
from wyp.ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
from wyp.ManagementServiceTransit import management as managementTransit&lt;br /&gt;
from django.core.files import File&lt;br /&gt;
import json&lt;br /&gt;
from time import time&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
	help = &amp;quot;Performs mass analysis from a csv file.\nIt requires id model to analyze.&amp;quot;&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-i',action='store',&lt;br /&gt;
				dest='i',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='id of the csv file in the model'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		csv_model = options['i']&lt;br /&gt;
		csv_model = Multiple_point_analysis.objects.get(id=int(csv_model))&lt;br /&gt;
&lt;br /&gt;
		filename = csv_model.csv_upload.url.split('/media/')[-1]&lt;br /&gt;
&lt;br /&gt;
		url = settings.MEDIA_ROOT + filename&lt;br /&gt;
&lt;br /&gt;
		csv = open(url,'r')&lt;br /&gt;
		lines = csv.read().split('\n')&lt;br /&gt;
		csv.close()&lt;br /&gt;
&lt;br /&gt;
		temp = open('/tmp/analysis_from_wyp.csv','w')&lt;br /&gt;
		temp.write('id;x;y;score;area;time;POI count;\n')&lt;br /&gt;
&lt;br /&gt;
		id_result = 1&lt;br /&gt;
&lt;br /&gt;
		try:&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Bike':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;biking_time_period;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+','+aux[2]&lt;br /&gt;
						biking_time_period = aux[3]&lt;br /&gt;
						distance_decay_function = aux[4]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementBike(start_point,biking_time_period,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result)+';'+aux[1]+';'+aux[2]+';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Walk':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						#aux = id;x;y;walking_time_period;walking_speed;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+';'+aux[2]&lt;br /&gt;
						walking_time_period = aux[3]&lt;br /&gt;
						walking_speed = aux[4]&lt;br /&gt;
						distance_decay_function = aux[5]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementPedestrian(start_point, walking_time_period, walking_speed, distance_decay_function, csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
			if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;start_time;walking_time_period;walking_speed;bus_waiting_time;bus_ride_time;distance_decay_function&lt;br /&gt;
						start_point = aux[1] + ';' + aux[2]&lt;br /&gt;
						start_time_transit = aux[3]&lt;br /&gt;
						walking_time_period = aux[4]&lt;br /&gt;
						walking_speed = aux[5]&lt;br /&gt;
						#bus_waiting_time = aux[6]&lt;br /&gt;
						bus_waiting_time = '0'&lt;br /&gt;
						#bus_ride_time = aux[7]&lt;br /&gt;
						bus_ride_time = '0'&lt;br /&gt;
						distance_decay_function = aux[6]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementTransit(start_point,start_time_transit,walking_time_period,walking_speed,bus_waiting_time,bus_ride_time,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
		except Exception as e:&lt;br /&gt;
			pass&lt;br /&gt;
&lt;br /&gt;
		#Pendiente!!!!!&lt;br /&gt;
		if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
			management(start_point, start_time, walking_time_period, walking_speed, bus_waiting_time, bus_ride_time, distance_decay_function)&lt;br /&gt;
			pass			&lt;br /&gt;
&lt;br /&gt;
		temp.close()&lt;br /&gt;
&lt;br /&gt;
		csv_model.analysed_pointset = True&lt;br /&gt;
		csv_model.results.save('results/' + csv_model.csv_upload.name.split('csv_uploads/')[-1] + '.csv', File(open('/tmp/analysis_from_wyp.csv')))&lt;br /&gt;
		csv_model.save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecuntamos estas líneas de comando para agregar el modelo a la base de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos a http://localhost:8000/admin y nos encontraremos con la opción de Multiple_point_analysis en donde tenemos que hacer click en &amp;quot;add multiple_point_analysis&amp;quot;. Llenamos los campos que se encuentran en negrita y apretamos en &amp;quot;SAVE&amp;quot;. Esperamos a que finalice (~15 segundos por línea de CSV) y los resultados estarán en el campo &amp;quot;Results&amp;quot; como archivo csv para descargar.&lt;br /&gt;
&lt;br /&gt;
== Sistema de Log para análisis de archivos CSV ==&lt;br /&gt;
&lt;br /&gt;
Como no se sabe si de verdad está funcionando o hay problemas de por medio al momento de analizar un archivo CSV, se creó un sistema de log que nos permita saber que es lo que está sucediendo. Para ello lo creamos como proceso al igual que el análisis del archivo. por lo que creamos el archivo '''wyp/management/commands/log.py''' y le agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wyp.models import Log_wyp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
&lt;br /&gt;
	help = &amp;quot;Save logs to the system&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-l',action='store',&lt;br /&gt;
				dest='l',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='message log'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		message = options['l']&lt;br /&gt;
&lt;br /&gt;
		if message != '':&lt;br /&gt;
			if len(message)&amp;gt;255:&lt;br /&gt;
				Log_wyp(log=message[:255]).save()&lt;br /&gt;
			else:&lt;br /&gt;
				Log_wyp(log=message).save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos el modelo en el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Log_wyp(models.Model):&lt;br /&gt;
	log = models.CharField(max_length=255,default='')&lt;br /&gt;
	created = models.DateTimeField(auto_now_add=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return str(self.created.strftime('%Y-%m-%d %H:%M:%S')) + ' ' +self.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo mostramos en el panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis, Log_wyp&lt;br /&gt;
admin.site.register(Log_wyp)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos los comandos para agregar el modelo a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ahora, para poder agregar cualquier log lo podemos hacer ejecutando el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py log -l &amp;quot;Mensaje a registrar&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que, por ejemplo, al integrarlo al archivo '''wyp/management/commands/mass_analysis.py''' se realizó lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
subprocess.Popen(shlex.split('python manage.py log -l &amp;quot;' + filename + ' Starting analysis&amp;quot;'))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
El código se puede encontrar acá: http://146.155.17.18:18080/csfuente/wyp-django/ y se encuentra funcionando en http://146.155.17.19:17080/&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-09T04:13:31Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Análisis de muchos puntos mediante la subida de un archivo CSV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike Model ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian &amp;amp; Transit Model ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y editamos el archivo wyp/views.py para que acepte los datos de Pedestrian:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
&lt;br /&gt;
def xml(request):&lt;br /&gt;
...&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y probamos como va funcionando con&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para Transit hay que seguir pasos similares a Pedestrian, observar el código para ver como queda configurado.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Finalmente el programa queda funcionando con muchos menos procesos y de forma más independiente, no requiere de una instalación de geoserver, tan solo Django Python, html, css y js.&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Gracias a Django fue posible crear un panel de administración para modificar ciertos valores dentro del código, además de agregar características nuevas que se explicarán a continuación:&lt;br /&gt;
&lt;br /&gt;
== Demographic group ==&lt;br /&gt;
&lt;br /&gt;
La idea es evaluar los POIs para distintos grupos demográficos, quien hace ese trabajo es la función de AggregationService.py, pero para que la petición llegue desde la interfaz también debe de llegarle a ManagementService.py, por lo que realizaremos estas modificaciones:&lt;br /&gt;
&lt;br /&gt;
Primero creamos el modelo de datos que contendrá a las opciones de grupos demográficos en la base de datos, para ello editamos el archivo wyp/models.py y agregamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.db import models&lt;br /&gt;
&lt;br /&gt;
class Demographic(models.Model):&lt;br /&gt;
	value = models.CharField(max_length=255)                #Nombre de la opcion demografica&lt;br /&gt;
	bank = models.CharField(max_length=255)                 #Pesos&lt;br /&gt;
	grocery = models.CharField(max_length=255)&lt;br /&gt;
	restaurant = models.CharField(max_length=255)&lt;br /&gt;
	shopping = models.CharField(max_length=255)&lt;br /&gt;
	entertainment = models.CharField(max_length=255)&lt;br /&gt;
	school = models.CharField(max_length=255)&lt;br /&gt;
	library = models.CharField(max_length=255)&lt;br /&gt;
	health = models.CharField(max_length=255)&lt;br /&gt;
	sum = models.FloatField(blank=True,default=0)           #Suma de los pesos anteriores&lt;br /&gt;
	score_factor = models.FloatField(blank=True,default=0)  #Valor de ponderacion&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.value&lt;br /&gt;
&lt;br /&gt;
        #Generar el resultado de sum y score_factor automaticamente al guardar&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		sumando = 0&lt;br /&gt;
		for i in ast.literal_eval(self.bank):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.grocery):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.restaurant):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.shopping):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.entertainment):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.school):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.library):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.health):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		self.sum = sumando&lt;br /&gt;
		self.score_factor = 100.0/float(sumando)&lt;br /&gt;
		super(Demographic,self).save(*args, **kwargs)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos este modelo al panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic&lt;br /&gt;
&lt;br /&gt;
admin.site.register(Demographic)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modificamos el archivo wyp/views.py para mandar estos datos a la vista html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  demographic = Demographic.objects.all()&lt;br /&gt;
  return render_to_response('index.html',{'demographic':demographic},context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego modificamos el archivo html que se encuentra en template para que éstos aparezcan dinámicamente como una lista de opciones. template/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Cycling Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_bike&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_bike&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_bike&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('bike')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_pedestrian&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_pedestrian&amp;quot; name=&amp;quot;start_point_pedestrian&amp;quot;&lt;br /&gt;
                           readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                        &amp;lt;div id=&amp;quot;walking_speed_pedestrian&amp;quot;&lt;br /&gt;
                             style=&amp;quot;width: 100px; height: 6px; margin:15px 10px auto 15px; display: inline-block;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
                        &amp;lt;span style=&amp;quot;font-size: 10px;&amp;quot;&amp;gt;Fast&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                &amp;lt;select id=&amp;quot;demographic_pedestrian&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_pedestrian&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('pedestrian')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Transit and Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_transit&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_transit&amp;quot; name=&amp;quot;start_point_transit&amp;quot; readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_transit&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                &lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('transit')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que estos valores sean reconocidos por el js que llama a la url /call_wps.php hay que modificar el archivo template/js/main.js para cada una de las opciones que se le agregó la opción demográfica&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function call_wps(approach){&lt;br /&gt;
    var start_point;&lt;br /&gt;
    ...&lt;br /&gt;
    var wps_call;&lt;br /&gt;
    var demographic;&lt;br /&gt;
&lt;br /&gt;
    switch (approach) {&lt;br /&gt;
        case &amp;quot;bike&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_bike').val();&lt;br /&gt;
            biking_time_period = $('#biking_time_period_amount').val();&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_bike').prop('checked');&lt;br /&gt;
            demographic = $('#demographic_bike option:selected').text();&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=bike&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;biking_time_period=&amp;quot; + biking_time_period + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;pedestrian&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_pedestrian').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_pedestrian').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_pedestrian').val();&lt;br /&gt;
            demographic = $('#demographic_pedestrian option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_pedestrian').prop('checked');&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=pedestrian&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;transit&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_transit').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_transit').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_transit').val();&lt;br /&gt;
            demographic = $('#demographic_transit option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_transit').prop('checked');&lt;br /&gt;
            walking_start_time = $('#walking_start_time').val() + &amp;quot;:00&amp;quot;;&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=transit&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_start_time=&amp;quot; + walking_start_time + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;bus_waiting_time=0&amp;amp;bus_riding_time=0&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Con ésto, ahora podemos recibir el valor escogido para la opción demográfica vía GET, por lo que ahora nos vamos a editar el archivo '''wyp/views.py''' para manejarlo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'transit':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic', default=None)&lt;br /&gt;
    return HttpResponse(managementTransit(start_point,walking_start_time,walking_time_period,walking_speed,bus_waiting_time,bus_riding_time, distance_decay_function,demographic))&lt;br /&gt;
  else:&lt;br /&gt;
  	return HttpResponse('')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos, ahora enviamos también la opción demográfica como nuevo parámetro de la función management* por lo que debemos modificar cada uno de ellos, de todas formas para todo es lo mismo por lo que solo se explicará el cambio realizado en Bike en el archivo '''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function,demographic):&lt;br /&gt;
    ...&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period,demographic)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente debemos editar el archivo en cuestión que nos retorna la puntuación, '''wyp/AggregationService.py'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from models import Demographic&lt;br /&gt;
&lt;br /&gt;
def aggregation(start_point, walkshed, crime_data, poi_data, distance_decay_function, walking_time_period,demographic):&lt;br /&gt;
    if poi_data != '&amp;quot;NULL&amp;quot;':&lt;br /&gt;
&lt;br /&gt;
        demographic_value = Demographic.objects.get(value=demographic)&lt;br /&gt;
&lt;br /&gt;
        poi_weights = {&amp;quot;Bank&amp;quot;: ast.literal_eval(demographic_value.bank),  #bank&lt;br /&gt;
                       &amp;quot;Grocery&amp;quot;: ast.literal_eval(demographic_value.grocery),  #grocery&lt;br /&gt;
                       &amp;quot;Restaurant&amp;quot;: ast.literal_eval(demographic_value.restaurant),  #restaurant and coffee&lt;br /&gt;
                       &amp;quot;Shopping&amp;quot;: ast.literal_eval(demographic_value.shopping),  #shopping&lt;br /&gt;
                       &amp;quot;Entertainment&amp;quot;: ast.literal_eval(demographic_value.entertainment),  #entertainment&lt;br /&gt;
                       &amp;quot;School&amp;quot;: ast.literal_eval(demographic_value.school),  #school&lt;br /&gt;
                       &amp;quot;Library&amp;quot;: ast.literal_eval(demographic_value.library),  #library&lt;br /&gt;
                       &amp;quot;Health&amp;quot;: ast.literal_eval(demographic_value.health)  #health&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entonces, para probar que todo esto funciona debemos ejecutar estos comandos desde la raíz del proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics  #por la midificacion de template/js/main.js&lt;br /&gt;
python manage.py makemigrations  # por la creacion del modelo Demographic&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alerta cuando uno de los servidores externos está caido ==&lt;br /&gt;
&lt;br /&gt;
Ha pasado que las VMs de OTP y de Overpass se caen por alguna razón o simplemente no parten correctamente lo que afecta directamente el funcionamiento de esta aplicación, para ello es importante saber cuál es la que está causando el problema, con ello necesitamos primero encontrar el error por lo que editaremos lo siguiente (nuevamente se mostrará con Bike, se realizó lo mismo con Pedestrian y Transit)&lt;br /&gt;
&lt;br /&gt;
En el archivo '''wyp/ManagementServiceBike.py''' agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    ...&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para generar la alerta lo haremos gracias a la ayuda del archivo '''template/js/main.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
        },&lt;br /&gt;
        success: function (data, status) {&lt;br /&gt;
            var wps_results = $.parseJSON(data);&lt;br /&gt;
&lt;br /&gt;
            var error_result = wps_results['error'];&lt;br /&gt;
            if (error_result){&lt;br /&gt;
                $.unblockUI();&lt;br /&gt;
                alert(error_result);&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de servidores de OTP y de overpass por panel de administración ==&lt;br /&gt;
&lt;br /&gt;
Una de las cosas principales que tiene Django es que cuenta con un panel de administración para poder editar la información de la base de datos o controlar ciertas configuraciones. En este caso crearemos un panel que permita intercambiar el servidor de OTP o de Overpass a cual queramos, para ello la guardaremos en la base de datos editando el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Server(models.Model):&lt;br /&gt;
	overpass = models.CharField(max_length=255,default='http://146.155.17.18:24080/api/interpreter')&lt;br /&gt;
	otp_bike = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochrone?&amp;amp;')&lt;br /&gt;
	otp_walk = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochroneOld?')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo agregamos al panel de administración agregando estas líneas en '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server&lt;br /&gt;
admin.site.register(Server)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos las siguientes líneas de comando para agregar la información a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py createsuperuser #crear un superusuario&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos ahora a la dirección http://localhost:8000/admin/ e ingresamos con el superusuario, entramos a Servers y creamos un elemento, los campos vendrán listos por lo que solo hay que guardar tal cual como sale.&lt;br /&gt;
&lt;br /&gt;
Luego editamos los archivos en donde se encuentra esta información&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_bike&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServicePedestrian.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceTransit.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/POIService.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = Server.objects.all()[0].overpass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análisis de muchos puntos mediante la subida de un archivo CSV ==&lt;br /&gt;
&lt;br /&gt;
Este trabajo se realiza netamente desde el panel de administración por lo que no se necesita de intervenir la interfaz. Se necesita de un sistema que reciba el archiv csv, lo lea línea por línea y lo analice según corresponda, la solución fue implementar un proceso extra (fuera de la interfaz) que realice el trabajo con tal de dejarlo funcionar toda la noche, por ejemplo.&lt;br /&gt;
&lt;br /&gt;
Como lo queremos ver en el panel de administración necesitamos crearle un modelo, para ello editamos nuevamente el archivo '''wyp/models.py''' agregando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
TYPES_OF_ANALYSYS = (&lt;br /&gt;
		('Bike','Cycling Model'),&lt;br /&gt;
		('Walk','Walking Model'),&lt;br /&gt;
		('Transit','Transit &amp;amp; Walking Model')&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
class Multiple_point_analysis(models.Model):&lt;br /&gt;
	csv_upload = models.FileField(upload_to='csv_uploads/')&lt;br /&gt;
	type_of_analysis = models.CharField(max_length=10,choices=TYPES_OF_ANALYSYS)&lt;br /&gt;
	demographic_group = models.ForeignKey(Demographic)&lt;br /&gt;
	analysed_pointset = models.BooleanField(default=False,blank=True,editable=False)&lt;br /&gt;
	results = models.FileField(upload_to='results/', blank=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.csv_upload.url.split('csv_uploads/')[-1]&lt;br /&gt;
&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		super(Multiple_point_analysis,self).save(*args, **kwargs)&lt;br /&gt;
		if not self.analysed_pointset:&lt;br /&gt;
			subprocess.Popen(shlex.split('python manage.py mass_analysis -i '+str(self.id)))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo mostramos en el panel editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis&lt;br /&gt;
admin.site.register(Multiple_point_analysis)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Además debemos agregar toda la siguiente rama de archivos:&lt;br /&gt;
* wyp/&lt;br /&gt;
** management/&lt;br /&gt;
*** __init__.py&lt;br /&gt;
*** commands/&lt;br /&gt;
**** __init__.py&lt;br /&gt;
**** _private.py&lt;br /&gt;
**** mass_analysis.py&lt;br /&gt;
&lt;br /&gt;
En donde ambos __init__.py y _private.py son archivos vacíos, management y commands carpetas y mass_analysis.py nuestra función que analizará el archivo csv. Entonces construimos el archivo '''wyp/management/commands/mass_analysis.py''' agregando las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wypdjango import settings&lt;br /&gt;
from wyp.models import Multiple_point_analysis&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
from wyp.ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
from wyp.ManagementServiceTransit import management as managementTransit&lt;br /&gt;
from django.core.files import File&lt;br /&gt;
import json&lt;br /&gt;
from time import time&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
	help = &amp;quot;Performs mass analysis from a csv file.\nIt requires id model to analyze.&amp;quot;&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-i',action='store',&lt;br /&gt;
				dest='i',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='id of the csv file in the model'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		csv_model = options['i']&lt;br /&gt;
		csv_model = Multiple_point_analysis.objects.get(id=int(csv_model))&lt;br /&gt;
&lt;br /&gt;
		filename = csv_model.csv_upload.url.split('/media/')[-1]&lt;br /&gt;
&lt;br /&gt;
		url = settings.MEDIA_ROOT + filename&lt;br /&gt;
&lt;br /&gt;
		csv = open(url,'r')&lt;br /&gt;
		lines = csv.read().split('\n')&lt;br /&gt;
		csv.close()&lt;br /&gt;
&lt;br /&gt;
		temp = open('/tmp/analysis_from_wyp.csv','w')&lt;br /&gt;
		temp.write('id;x;y;score;area;time;POI count;\n')&lt;br /&gt;
&lt;br /&gt;
		id_result = 1&lt;br /&gt;
&lt;br /&gt;
		try:&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Bike':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;biking_time_period;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+','+aux[2]&lt;br /&gt;
						biking_time_period = aux[3]&lt;br /&gt;
						distance_decay_function = aux[4]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementBike(start_point,biking_time_period,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result)+';'+aux[1]+';'+aux[2]+';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
			if csv_model.type_of_analysis == 'Walk':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						#aux = id;x;y;walking_time_period;walking_speed;distance_decay_function;&lt;br /&gt;
						start_point = aux[1]+';'+aux[2]&lt;br /&gt;
						walking_time_period = aux[3]&lt;br /&gt;
						walking_speed = aux[4]&lt;br /&gt;
						distance_decay_function = aux[5]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementPedestrian(start_point, walking_time_period, walking_speed, distance_decay_function, csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
			if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
				for line in lines:&lt;br /&gt;
					aux = line.split(';')&lt;br /&gt;
					if aux[0] != 'id' and len(aux)&amp;gt;2:&lt;br /&gt;
						# aux = id;x;y;start_time;walking_time_period;walking_speed;bus_waiting_time;bus_ride_time;distance_decay_function&lt;br /&gt;
						start_point = aux[1] + ';' + aux[2]&lt;br /&gt;
						start_time_transit = aux[3]&lt;br /&gt;
						walking_time_period = aux[4]&lt;br /&gt;
						walking_speed = aux[5]&lt;br /&gt;
						#bus_waiting_time = aux[6]&lt;br /&gt;
						bus_waiting_time = '0'&lt;br /&gt;
						#bus_ride_time = aux[7]&lt;br /&gt;
						bus_ride_time = '0'&lt;br /&gt;
						distance_decay_function = aux[6]&lt;br /&gt;
						start_time = time()&lt;br /&gt;
						results = managementTransit(start_point,start_time_transit,walking_time_period,walking_speed,bus_waiting_time,bus_ride_time,distance_decay_function,csv_model.demographic_group.value)&lt;br /&gt;
						elapsed_time = time() - start_time&lt;br /&gt;
						results = json.loads(results)&lt;br /&gt;
						text = str(id_result) + ';'	+ aux[1] + ';' + aux[2] + ';'+results['walkshed']['properties']['score']+';'+str(results['walkshed']['properties']['area'])+';'+str(elapsed_time)+';'+str(len(results['poi']['features']))+';\n'&lt;br /&gt;
						temp.write(text)&lt;br /&gt;
						id_result += 1&lt;br /&gt;
&lt;br /&gt;
		except Exception as e:&lt;br /&gt;
			pass&lt;br /&gt;
&lt;br /&gt;
		#Pendiente!!!!!&lt;br /&gt;
		if csv_model.type_of_analysis == 'Transit':&lt;br /&gt;
			management(start_point, start_time, walking_time_period, walking_speed, bus_waiting_time, bus_ride_time, distance_decay_function)&lt;br /&gt;
			pass			&lt;br /&gt;
&lt;br /&gt;
		temp.close()&lt;br /&gt;
&lt;br /&gt;
		csv_model.analysed_pointset = True&lt;br /&gt;
		csv_model.results.save('results/' + csv_model.csv_upload.name.split('csv_uploads/')[-1] + '.csv', File(open('/tmp/analysis_from_wyp.csv')))&lt;br /&gt;
		csv_model.save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecuntamos estas líneas de comando para agregar el modelo a la base de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos a http://localhost:8000/admin y nos encontraremos con la opción de Multiple_point_analysis en donde tenemos que hacer click en &amp;quot;add multiple_point_analysis&amp;quot;. Llenamos los campos que se encuentran en negrita y apretamos en &amp;quot;SAVE&amp;quot;. Esperamos a que finalice (~15 segundos por línea de CSV) y los resultados estarán en el campo &amp;quot;Results&amp;quot; como archivo csv para descargar.&lt;br /&gt;
&lt;br /&gt;
== Sistema de Log para análisis de archivos CSV ==&lt;br /&gt;
&lt;br /&gt;
Como no se sabe si de verdad está funcionando o hay problemas de por medio al momento de analizar un archivo CSV, se creó un sistema de log que nos permita saber que es lo que está sucediendo. Para ello lo creamos como proceso al igual que el análisis del archivo. por lo que creamos el archivo '''wyp/management/commands/log.py''' y le agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from optparse import make_option&lt;br /&gt;
from django.core.management.base import BaseCommand, CommandError&lt;br /&gt;
from wyp.models import Log_wyp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Command(BaseCommand):&lt;br /&gt;
&lt;br /&gt;
	help = &amp;quot;Save logs to the system&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	option_list = BaseCommand.option_list + (&lt;br /&gt;
			make_option(&lt;br /&gt;
				'-l',action='store',&lt;br /&gt;
				dest='l',&lt;br /&gt;
				default='',&lt;br /&gt;
				help='message log'),&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
	def handle(self, *app_labels, **options):&lt;br /&gt;
		message = options['l']&lt;br /&gt;
&lt;br /&gt;
		if message != '':&lt;br /&gt;
			if len(message)&amp;gt;255:&lt;br /&gt;
				Log_wyp(log=message[:255]).save()&lt;br /&gt;
			else:&lt;br /&gt;
				Log_wyp(log=message).save()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos el modelo en el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Log_wyp(models.Model):&lt;br /&gt;
	log = models.CharField(max_length=255,default='')&lt;br /&gt;
	created = models.DateTimeField(auto_now_add=True)&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return str(self.created.strftime('%Y-%m-%d %H:%M:%S')) + ' ' +self.log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo mostramos en el panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server, Multiple_point_analysis, Log_wyp&lt;br /&gt;
admin.site.register(Log_wyp)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos los comandos para agregar el modelo a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ahora, para poder agregar cualquier log lo podemos hacer ejecutando el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py log -l &amp;quot;Mensaje a registrar&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que, por ejemplo, al integrarlo al archivo '''wyp/management/commands/mass_analysis.py''' se realizó lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import ast, subprocess, shlex&lt;br /&gt;
&lt;br /&gt;
subprocess.Popen(shlex.split('python manage.py log -l &amp;quot;' + filename + ' Starting analysis&amp;quot;'))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
El código se puede encontrar acá: http://146.155.17.18:18080/csfuente/wyp-django/&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-09T03:53:35Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Características nuevas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike Model ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian &amp;amp; Transit Model ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y editamos el archivo wyp/views.py para que acepte los datos de Pedestrian:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
&lt;br /&gt;
def xml(request):&lt;br /&gt;
...&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y probamos como va funcionando con&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para Transit hay que seguir pasos similares a Pedestrian, observar el código para ver como queda configurado.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Finalmente el programa queda funcionando con muchos menos procesos y de forma más independiente, no requiere de una instalación de geoserver, tan solo Django Python, html, css y js.&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Gracias a Django fue posible crear un panel de administración para modificar ciertos valores dentro del código, además de agregar características nuevas que se explicarán a continuación:&lt;br /&gt;
&lt;br /&gt;
== Demographic group ==&lt;br /&gt;
&lt;br /&gt;
La idea es evaluar los POIs para distintos grupos demográficos, quien hace ese trabajo es la función de AggregationService.py, pero para que la petición llegue desde la interfaz también debe de llegarle a ManagementService.py, por lo que realizaremos estas modificaciones:&lt;br /&gt;
&lt;br /&gt;
Primero creamos el modelo de datos que contendrá a las opciones de grupos demográficos en la base de datos, para ello editamos el archivo wyp/models.py y agregamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.db import models&lt;br /&gt;
&lt;br /&gt;
class Demographic(models.Model):&lt;br /&gt;
	value = models.CharField(max_length=255)                #Nombre de la opcion demografica&lt;br /&gt;
	bank = models.CharField(max_length=255)                 #Pesos&lt;br /&gt;
	grocery = models.CharField(max_length=255)&lt;br /&gt;
	restaurant = models.CharField(max_length=255)&lt;br /&gt;
	shopping = models.CharField(max_length=255)&lt;br /&gt;
	entertainment = models.CharField(max_length=255)&lt;br /&gt;
	school = models.CharField(max_length=255)&lt;br /&gt;
	library = models.CharField(max_length=255)&lt;br /&gt;
	health = models.CharField(max_length=255)&lt;br /&gt;
	sum = models.FloatField(blank=True,default=0)           #Suma de los pesos anteriores&lt;br /&gt;
	score_factor = models.FloatField(blank=True,default=0)  #Valor de ponderacion&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.value&lt;br /&gt;
&lt;br /&gt;
        #Generar el resultado de sum y score_factor automaticamente al guardar&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		sumando = 0&lt;br /&gt;
		for i in ast.literal_eval(self.bank):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.grocery):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.restaurant):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.shopping):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.entertainment):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.school):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.library):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.health):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		self.sum = sumando&lt;br /&gt;
		self.score_factor = 100.0/float(sumando)&lt;br /&gt;
		super(Demographic,self).save(*args, **kwargs)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos este modelo al panel de administración editando el archivo '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic&lt;br /&gt;
&lt;br /&gt;
admin.site.register(Demographic)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modificamos el archivo wyp/views.py para mandar estos datos a la vista html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  demographic = Demographic.objects.all()&lt;br /&gt;
  return render_to_response('index.html',{'demographic':demographic},context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego modificamos el archivo html que se encuentra en template para que éstos aparezcan dinámicamente como una lista de opciones. template/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Cycling Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_bike&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_bike&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_bike&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('bike')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_pedestrian&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_pedestrian&amp;quot; name=&amp;quot;start_point_pedestrian&amp;quot;&lt;br /&gt;
                           readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                        &amp;lt;div id=&amp;quot;walking_speed_pedestrian&amp;quot;&lt;br /&gt;
                             style=&amp;quot;width: 100px; height: 6px; margin:15px 10px auto 15px; display: inline-block;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
                        &amp;lt;span style=&amp;quot;font-size: 10px;&amp;quot;&amp;gt;Fast&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                &amp;lt;select id=&amp;quot;demographic_pedestrian&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_pedestrian&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('pedestrian')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Transit and Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_transit&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_transit&amp;quot; name=&amp;quot;start_point_transit&amp;quot; readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_transit&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                &lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('transit')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que estos valores sean reconocidos por el js que llama a la url /call_wps.php hay que modificar el archivo template/js/main.js para cada una de las opciones que se le agregó la opción demográfica&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function call_wps(approach){&lt;br /&gt;
    var start_point;&lt;br /&gt;
    ...&lt;br /&gt;
    var wps_call;&lt;br /&gt;
    var demographic;&lt;br /&gt;
&lt;br /&gt;
    switch (approach) {&lt;br /&gt;
        case &amp;quot;bike&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_bike').val();&lt;br /&gt;
            biking_time_period = $('#biking_time_period_amount').val();&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_bike').prop('checked');&lt;br /&gt;
            demographic = $('#demographic_bike option:selected').text();&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=bike&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;biking_time_period=&amp;quot; + biking_time_period + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;pedestrian&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_pedestrian').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_pedestrian').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_pedestrian').val();&lt;br /&gt;
            demographic = $('#demographic_pedestrian option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_pedestrian').prop('checked');&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=pedestrian&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;transit&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_transit').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_transit').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_transit').val();&lt;br /&gt;
            demographic = $('#demographic_transit option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_transit').prop('checked');&lt;br /&gt;
            walking_start_time = $('#walking_start_time').val() + &amp;quot;:00&amp;quot;;&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=transit&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_start_time=&amp;quot; + walking_start_time + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;bus_waiting_time=0&amp;amp;bus_riding_time=0&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Con ésto, ahora podemos recibir el valor escogido para la opción demográfica vía GET, por lo que ahora nos vamos a editar el archivo '''wyp/views.py''' para manejarlo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'transit':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic', default=None)&lt;br /&gt;
    return HttpResponse(managementTransit(start_point,walking_start_time,walking_time_period,walking_speed,bus_waiting_time,bus_riding_time, distance_decay_function,demographic))&lt;br /&gt;
  else:&lt;br /&gt;
  	return HttpResponse('')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos, ahora enviamos también la opción demográfica como nuevo parámetro de la función management* por lo que debemos modificar cada uno de ellos, de todas formas para todo es lo mismo por lo que solo se explicará el cambio realizado en Bike en el archivo '''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function,demographic):&lt;br /&gt;
    ...&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period,demographic)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente debemos editar el archivo en cuestión que nos retorna la puntuación, '''wyp/AggregationService.py'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from models import Demographic&lt;br /&gt;
&lt;br /&gt;
def aggregation(start_point, walkshed, crime_data, poi_data, distance_decay_function, walking_time_period,demographic):&lt;br /&gt;
    if poi_data != '&amp;quot;NULL&amp;quot;':&lt;br /&gt;
&lt;br /&gt;
        demographic_value = Demographic.objects.get(value=demographic)&lt;br /&gt;
&lt;br /&gt;
        poi_weights = {&amp;quot;Bank&amp;quot;: ast.literal_eval(demographic_value.bank),  #bank&lt;br /&gt;
                       &amp;quot;Grocery&amp;quot;: ast.literal_eval(demographic_value.grocery),  #grocery&lt;br /&gt;
                       &amp;quot;Restaurant&amp;quot;: ast.literal_eval(demographic_value.restaurant),  #restaurant and coffee&lt;br /&gt;
                       &amp;quot;Shopping&amp;quot;: ast.literal_eval(demographic_value.shopping),  #shopping&lt;br /&gt;
                       &amp;quot;Entertainment&amp;quot;: ast.literal_eval(demographic_value.entertainment),  #entertainment&lt;br /&gt;
                       &amp;quot;School&amp;quot;: ast.literal_eval(demographic_value.school),  #school&lt;br /&gt;
                       &amp;quot;Library&amp;quot;: ast.literal_eval(demographic_value.library),  #library&lt;br /&gt;
                       &amp;quot;Health&amp;quot;: ast.literal_eval(demographic_value.health)  #health&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entonces, para probar que todo esto funciona debemos ejecutar estos comandos desde la raíz del proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics  #por la midificacion de template/js/main.js&lt;br /&gt;
python manage.py makemigrations  # por la creacion del modelo Demographic&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alerta cuando uno de los servidores externos está caido ==&lt;br /&gt;
&lt;br /&gt;
Ha pasado que las VMs de OTP y de Overpass se caen por alguna razón o simplemente no parten correctamente lo que afecta directamente el funcionamiento de esta aplicación, para ello es importante saber cuál es la que está causando el problema, con ello necesitamos primero encontrar el error por lo que editaremos lo siguiente (nuevamente se mostrará con Bike, se realizó lo mismo con Pedestrian y Transit)&lt;br /&gt;
&lt;br /&gt;
En el archivo '''wyp/ManagementServiceBike.py''' agregamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    ...&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para generar la alerta lo haremos gracias a la ayuda del archivo '''template/js/main.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
        },&lt;br /&gt;
        success: function (data, status) {&lt;br /&gt;
            var wps_results = $.parseJSON(data);&lt;br /&gt;
&lt;br /&gt;
            var error_result = wps_results['error'];&lt;br /&gt;
            if (error_result){&lt;br /&gt;
                $.unblockUI();&lt;br /&gt;
                alert(error_result);&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cambio de servidores de OTP y de overpass por panel de administración ==&lt;br /&gt;
&lt;br /&gt;
Una de las cosas principales que tiene Django es que cuenta con un panel de administración para poder editar la información de la base de datos o controlar ciertas configuraciones. En este caso crearemos un panel que permita intercambiar el servidor de OTP o de Overpass a cual queramos, para ello la guardaremos en la base de datos editando el archivo '''wyp/models.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Server(models.Model):&lt;br /&gt;
	overpass = models.CharField(max_length=255,default='http://146.155.17.18:24080/api/interpreter')&lt;br /&gt;
	otp_bike = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochrone?&amp;amp;')&lt;br /&gt;
	otp_walk = models.CharField(max_length=255,default='http://146.155.17.18:23080/otp/routers/default/isochroneOld?')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo agregamos al panel de administración agregando estas líneas en '''wyp/admin.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.models import Demographic, Server&lt;br /&gt;
admin.site.register(Server)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejecutamos las siguientes líneas de comando para agregar la información a la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py makemigrations&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py createsuperuser #crear un superusuario&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entramos ahora a la dirección http://localhost:8000/admin/ e ingresamos con el superusuario, entramos a Servers y creamos un elemento, los campos vendrán listos por lo que solo hay que guardar tal cual como sale.&lt;br /&gt;
&lt;br /&gt;
Luego editamos los archivos en donde se encuentra esta información&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_bike&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServicePedestrian.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/ManagementServiceTransit.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    otp_isochrone_url = Server.objects.all()[0].otp_walk&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''wyp/POIService.py'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = Server.objects.all()[0].overpass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análisis de muchos puntos mediante la subida de un archivo CSV ==&lt;br /&gt;
&lt;br /&gt;
Este trabajo se realiza netamente desde el panel de administración por lo que no se necesita de intervenir la interfaz. Se necesita de un sistema que reciba el archiv csv, lo lea línea por línea y lo analice según corresponda, la solución fue implementar un proceso extra (fuera de la interfaz) que realice el trabajo con tal de dejarlo funcionar toda la noche, por ejemplo.&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
El código se puede encontrar acá: http://146.155.17.18:18080/csfuente/wyp-django/&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-09T03:33:51Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Características nuevas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike Model ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian &amp;amp; Transit Model ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y editamos el archivo wyp/views.py para que acepte los datos de Pedestrian:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
&lt;br /&gt;
def xml(request):&lt;br /&gt;
...&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y probamos como va funcionando con&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para Transit hay que seguir pasos similares a Pedestrian, observar el código para ver como queda configurado.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Finalmente el programa queda funcionando con muchos menos procesos y de forma más independiente, no requiere de una instalación de geoserver, tan solo Django Python, html, css y js.&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Gracias a Django fue posible crear un panel de administración para modificar ciertos valores dentro del código, además de agregar características nuevas que se explicarán a continuación:&lt;br /&gt;
&lt;br /&gt;
== Demographic group ==&lt;br /&gt;
&lt;br /&gt;
La idea es evaluar los POIs para distintos grupos demográficos, quien hace ese trabajo es la función de AggregationService.py, pero para que la petición llegue desde la interfaz también debe de llegarle a ManagementService.py, por lo que realizaremos estas modificaciones:&lt;br /&gt;
&lt;br /&gt;
Primero creamos el modelo de datos que contendrá a las opciones de grupos demográficos en la base de datos, para ello editamos el archivo wyp/models.py y agregamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.db import models&lt;br /&gt;
&lt;br /&gt;
class Demographic(models.Model):&lt;br /&gt;
	value = models.CharField(max_length=255)                #Nombre de la opcion demografica&lt;br /&gt;
	bank = models.CharField(max_length=255)                 #Pesos&lt;br /&gt;
	grocery = models.CharField(max_length=255)&lt;br /&gt;
	restaurant = models.CharField(max_length=255)&lt;br /&gt;
	shopping = models.CharField(max_length=255)&lt;br /&gt;
	entertainment = models.CharField(max_length=255)&lt;br /&gt;
	school = models.CharField(max_length=255)&lt;br /&gt;
	library = models.CharField(max_length=255)&lt;br /&gt;
	health = models.CharField(max_length=255)&lt;br /&gt;
	sum = models.FloatField(blank=True,default=0)           #Suma de los pesos anteriores&lt;br /&gt;
	score_factor = models.FloatField(blank=True,default=0)  #Valor de ponderacion&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.value&lt;br /&gt;
&lt;br /&gt;
        #Generar el resultado de sum y score_factor automaticamente al guardar&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		sumando = 0&lt;br /&gt;
		for i in ast.literal_eval(self.bank):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.grocery):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.restaurant):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.shopping):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.entertainment):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.school):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.library):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.health):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		self.sum = sumando&lt;br /&gt;
		self.score_factor = 100.0/float(sumando)&lt;br /&gt;
		super(Demographic,self).save(*args, **kwargs)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modificamos el archivo wyp/views.py para mandar estos datos a la vista html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  demographic = Demographic.objects.all()&lt;br /&gt;
  return render_to_response('index.html',{'demographic':demographic},context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego modificamos el archivo html que se encuentra en template para que éstos aparezcan dinámicamente como una lista de opciones. template/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Cycling Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_bike&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_bike&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_bike&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('bike')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_pedestrian&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_pedestrian&amp;quot; name=&amp;quot;start_point_pedestrian&amp;quot;&lt;br /&gt;
                           readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                        &amp;lt;div id=&amp;quot;walking_speed_pedestrian&amp;quot;&lt;br /&gt;
                             style=&amp;quot;width: 100px; height: 6px; margin:15px 10px auto 15px; display: inline-block;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
                        &amp;lt;span style=&amp;quot;font-size: 10px;&amp;quot;&amp;gt;Fast&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                &amp;lt;select id=&amp;quot;demographic_pedestrian&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_pedestrian&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('pedestrian')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Transit and Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_transit&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_transit&amp;quot; name=&amp;quot;start_point_transit&amp;quot; readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_transit&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                &lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('transit')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para que estos valores sean reconocidos por el js que llama a la url /call_wps.php hay que modificar el archivo template/js/main.js para cada una de las opciones que se le agregó la opción demográfica&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function call_wps(approach){&lt;br /&gt;
    var start_point;&lt;br /&gt;
    ...&lt;br /&gt;
    var wps_call;&lt;br /&gt;
    var demographic;&lt;br /&gt;
&lt;br /&gt;
    switch (approach) {&lt;br /&gt;
        case &amp;quot;bike&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_bike').val();&lt;br /&gt;
            biking_time_period = $('#biking_time_period_amount').val();&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_bike').prop('checked');&lt;br /&gt;
            demographic = $('#demographic_bike option:selected').text();&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=bike&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;biking_time_period=&amp;quot; + biking_time_period + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;pedestrian&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_pedestrian').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_pedestrian').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_pedestrian').val();&lt;br /&gt;
            demographic = $('#demographic_pedestrian option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_pedestrian').prop('checked');&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=pedestrian&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;transit&amp;quot;:&lt;br /&gt;
            start_point = $('#start_point_transit').val();&lt;br /&gt;
            walking_time_period = $('#walking_time_period_amount_transit').val();&lt;br /&gt;
            walking_speed_amount = $('#walking_speed_amount_transit').val();&lt;br /&gt;
            demographic = $('#demographic_transit option:selected').text();&lt;br /&gt;
            switch (walking_speed_amount) {&lt;br /&gt;
                case '3':&lt;br /&gt;
                    walking_speed = .83;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '3.5':&lt;br /&gt;
                    walking_speed = .97;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4':&lt;br /&gt;
                    walking_speed = 1.11;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '4.5':&lt;br /&gt;
                    walking_speed = 1.25;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5':&lt;br /&gt;
                    walking_speed = 1.38;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '5.5':&lt;br /&gt;
                    walking_speed = 1.52;&lt;br /&gt;
                    break;&lt;br /&gt;
                case '6':&lt;br /&gt;
                    walking_speed = 1.67;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
            distance_decay_function = $('#distance_decay_function_transit').prop('checked');&lt;br /&gt;
            walking_start_time = $('#walking_start_time').val() + &amp;quot;:00&amp;quot;;&lt;br /&gt;
            wps_call = &amp;quot;call_wps.php?wps=transit&amp;amp;start_point=&amp;quot; + start_point + &amp;quot;&amp;amp;walking_start_time=&amp;quot; + walking_start_time + &amp;quot;&amp;amp;walking_time_period=&amp;quot; + walking_time_period + &amp;quot;&amp;amp;walking_speed=&amp;quot; + walking_speed + &amp;quot;&amp;amp;bus_waiting_time=0&amp;amp;bus_riding_time=0&amp;amp;distance_decay_function=&amp;quot; + distance_decay_function + &amp;quot;&amp;amp;demographic=&amp;quot;+demographic;&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Con ésto, ahora podemos recibir el valor escogido para la opción demográfica vía GET, por lo que ahora nos vamos a editar el archivo '''wyp/views.py''' para manejarlo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function,demographic))&lt;br /&gt;
  elif approach == 'transit':&lt;br /&gt;
    ...&lt;br /&gt;
    demographic = request.GET.get('demographic', default=None)&lt;br /&gt;
    return HttpResponse(managementTransit(start_point,walking_start_time,walking_time_period,walking_speed,bus_waiting_time,bus_riding_time, distance_decay_function,demographic))&lt;br /&gt;
  else:&lt;br /&gt;
  	return HttpResponse('')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos, ahora enviamos también la opción demográfica como nuevo parámetro de la función management* por lo que debemos modificar cada uno de ellos, de todas formas para todo es lo mismo por lo que solo se explicará el cambio realizado en Bike en el archivo '''wyp/ManagementServiceBike.py'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function,demographic):&lt;br /&gt;
    ...&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period,demographic)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente debemos editar el archivo en cuestión que nos retorna la puntuación, '''wyp/AggregationService.py'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from models import Demographic&lt;br /&gt;
&lt;br /&gt;
def aggregation(start_point, walkshed, crime_data, poi_data, distance_decay_function, walking_time_period,demographic):&lt;br /&gt;
    if poi_data != '&amp;quot;NULL&amp;quot;':&lt;br /&gt;
&lt;br /&gt;
        demographic_value = Demographic.objects.get(value=demographic)&lt;br /&gt;
&lt;br /&gt;
        poi_weights = {&amp;quot;Bank&amp;quot;: ast.literal_eval(demographic_value.bank),  #bank&lt;br /&gt;
                       &amp;quot;Grocery&amp;quot;: ast.literal_eval(demographic_value.grocery),  #grocery&lt;br /&gt;
                       &amp;quot;Restaurant&amp;quot;: ast.literal_eval(demographic_value.restaurant),  #restaurant and coffee&lt;br /&gt;
                       &amp;quot;Shopping&amp;quot;: ast.literal_eval(demographic_value.shopping),  #shopping&lt;br /&gt;
                       &amp;quot;Entertainment&amp;quot;: ast.literal_eval(demographic_value.entertainment),  #entertainment&lt;br /&gt;
                       &amp;quot;School&amp;quot;: ast.literal_eval(demographic_value.school),  #school&lt;br /&gt;
                       &amp;quot;Library&amp;quot;: ast.literal_eval(demographic_value.library),  #library&lt;br /&gt;
                       &amp;quot;Health&amp;quot;: ast.literal_eval(demographic_value.health)  #health&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entonces, para probar que todo esto funciona debemos ejecutar estos comandos desde la raíz del proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics  #por la midificacion de template/js/main.js&lt;br /&gt;
python manage.py makemigrations  # por la creacion del modelo Demographic&lt;br /&gt;
python manage.py migrate&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
El código se puede encontrar acá: http://146.155.17.18:18080/csfuente/wyp-django/&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-09T03:16:46Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Características nuevas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike Model ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian &amp;amp; Transit Model ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y editamos el archivo wyp/views.py para que acepte los datos de Pedestrian:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
&lt;br /&gt;
def xml(request):&lt;br /&gt;
...&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y probamos como va funcionando con&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para Transit hay que seguir pasos similares a Pedestrian, observar el código para ver como queda configurado.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Finalmente el programa queda funcionando con muchos menos procesos y de forma más independiente, no requiere de una instalación de geoserver, tan solo Django Python, html, css y js.&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Gracias a Django fue posible crear un panel de administración para modificar ciertos valores dentro del código, además de agregar características nuevas que se explicarán a continuación:&lt;br /&gt;
&lt;br /&gt;
== Demographic group ==&lt;br /&gt;
&lt;br /&gt;
La idea es evaluar los POIs para distintos grupos demográficos, quien hace ese trabajo es la función de AggregationService.py, pero para que la petición llegue desde la interfaz también debe de llegarle a ManagementService.py, por lo que realizaremos estas modificaciones:&lt;br /&gt;
&lt;br /&gt;
Primero creamos el modelo de datos que contendrá a las opciones de grupos demográficos en la base de datos, para ello editamos el archivo wyp/models.py y agregamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.db import models&lt;br /&gt;
&lt;br /&gt;
class Demographic(models.Model):&lt;br /&gt;
	value = models.CharField(max_length=255)                #Nombre de la opcion demografica&lt;br /&gt;
	bank = models.CharField(max_length=255)                 #Pesos&lt;br /&gt;
	grocery = models.CharField(max_length=255)&lt;br /&gt;
	restaurant = models.CharField(max_length=255)&lt;br /&gt;
	shopping = models.CharField(max_length=255)&lt;br /&gt;
	entertainment = models.CharField(max_length=255)&lt;br /&gt;
	school = models.CharField(max_length=255)&lt;br /&gt;
	library = models.CharField(max_length=255)&lt;br /&gt;
	health = models.CharField(max_length=255)&lt;br /&gt;
	sum = models.FloatField(blank=True,default=0)           #Suma de los pesos anteriores&lt;br /&gt;
	score_factor = models.FloatField(blank=True,default=0)  #Valor de ponderacion&lt;br /&gt;
&lt;br /&gt;
	def __unicode__(self):&lt;br /&gt;
		return self.value&lt;br /&gt;
&lt;br /&gt;
        #Generar el resultado de sum y score_factor automaticamente al guardar&lt;br /&gt;
	def save(self, *args, **kwargs):&lt;br /&gt;
		sumando = 0&lt;br /&gt;
		for i in ast.literal_eval(self.bank):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.grocery):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.restaurant):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.shopping):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.entertainment):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.school):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.library):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		for i in ast.literal_eval(self.health):&lt;br /&gt;
			sumando += i&lt;br /&gt;
		self.sum = sumando&lt;br /&gt;
		self.score_factor = 100.0/float(sumando)&lt;br /&gt;
		super(Demographic,self).save(*args, **kwargs)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modificamos el archivo wyp/views.py para mandar estos datos a la vista html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  demographic = Demographic.objects.all()&lt;br /&gt;
  return render_to_response('index.html',{'demographic':demographic},context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego modificamos el archivo html que se encuentra en template para que éstos aparezcan dinámicamente como una lista de opciones. template/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Cycling Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_bike&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_bike&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_bike&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('bike')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_pedestrian&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_pedestrian&amp;quot; name=&amp;quot;start_point_pedestrian&amp;quot;&lt;br /&gt;
                           readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                        &amp;lt;div id=&amp;quot;walking_speed_pedestrian&amp;quot;&lt;br /&gt;
                             style=&amp;quot;width: 100px; height: 6px; margin:15px 10px auto 15px; display: inline-block;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
                        &amp;lt;span style=&amp;quot;font-size: 10px;&amp;quot;&amp;gt;Fast&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                &amp;lt;select id=&amp;quot;demographic_pedestrian&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;distance_decay_function_pedestrian&amp;quot;&lt;br /&gt;
                           name=&amp;quot;distance_decay_function&amp;quot;/&amp;gt;Distance&lt;br /&gt;
                    Decay Function&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('pedestrian')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Transit &amp;amp; Walking Model&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;call_wps_transit&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fieldset&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;start_point_transit&amp;quot; name=&amp;quot;start_point_transit&amp;quot; readonly/&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                                &amp;lt;li&amp;gt;&lt;br /&gt;
                To: &lt;br /&gt;
                  &amp;lt;select id=&amp;quot;demographic_transit&amp;quot;&amp;gt;&lt;br /&gt;
                    {% for demo in demographic%}&lt;br /&gt;
                    &amp;lt;option value=&amp;quot;{{demo.value}}&amp;quot;&amp;gt;{{demo.value}}&amp;lt;/option&amp;gt;&lt;br /&gt;
                    {% endfor %}&lt;br /&gt;
                  &amp;lt;/select&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
                &lt;br /&gt;
                ...&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;button&amp;quot; onclick=&amp;quot;call_wps('transit')&amp;quot;&lt;br /&gt;
                       value=&amp;quot;Get Accessibility Score&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
El código se puede encontrar acá: http://146.155.17.18:18080/csfuente/wyp-django/&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-09T02:46:54Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike Model ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian &amp;amp; Transit Model ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y editamos el archivo wyp/views.py para que acepte los datos de Pedestrian:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from ManagementServicePedestrian import management as managementPedestrian&lt;br /&gt;
&lt;br /&gt;
def xml(request):&lt;br /&gt;
...&lt;br /&gt;
  elif approach == 'pedestrian':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    return HttpResponse(managementPedestrian(start_point,walking_time_period,walking_speed,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y probamos como va funcionando con&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para Transit hay que seguir pasos similares a Pedestrian, observar el código para ver como queda configurado.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
Finalmente el programa queda funcionando con muchos menos procesos y de forma más independiente, no requiere de una instalación de geoserver, tan solo Django Python, html, css y js.&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Gracias a Django fue posible crear un panel de administración para modificar ciertos valores dentro del código, además de agregar características nuevas que se explicarán a continuación:&lt;br /&gt;
&lt;br /&gt;
== Demographic group ==&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
El código se puede encontrar acá: http://146.155.17.18:18080/csfuente/wyp-django/&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-08T22:20:49Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update 08-09-2016&lt;br /&gt;
&lt;br /&gt;
= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period,demographic)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente necesitamos enlazar todo este código, por lo que creamos una nueva función en el archivo wyp/views.py con:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.ManagementServiceBike import management as managementBike&lt;br /&gt;
def xml(request):&lt;br /&gt;
  approach = request.GET.get('wps',default=None)&lt;br /&gt;
  if approach == 'bike':&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    demographic = request.GET.get('demographic',default=None)&lt;br /&gt;
    return HttpResponse(managementBike(start_point,biking_time_period,distance_decay_function))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y lo agregamos en wypdjango/urls.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio, xml&lt;br /&gt;
...&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^call_wps.php',xml),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y finalmente ejecutamos el comando para correr el servidor y probamos que todo funciona correctamente.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py runserver&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pedestrian ==&lt;br /&gt;
&lt;br /&gt;
Ahora podemos agregar la característica de caminata en el proyecto, para ello copiamos solo el archivo ManagementService.py que se encuentra en Pedestrian en (2) y le cambiamos el nombre a ManagementServicePedestrian.py y hacemos algo muy similar que el archivo de Bike, primero eliminamos todo lo relacionado con bottle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    walking_time_period = request.GET.get('walking_time_period', default=None)&lt;br /&gt;
    walking_speed = request.GET.get('walking_speed', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
    if start_point and walking_time_period and walking_speed and distance_decay_function is not None:&lt;br /&gt;
        return management(start_point, walking_time_period, walking_speed, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=8363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y reacemos la función management(), la diferencia con Bike es que en éste se utiliza isochroneOLD para obtener el espacio posible, por lo que nuestra nueva función queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, walking_time_period, walking_speed, distance_decay_function):&lt;br /&gt;
    otp_isochroneOLD_url = 'http://146.155.17.18:23080/otp/routers/default/isochroneOld?'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;walkTime=%s&amp;amp;walkSpeed=%s&amp;amp;mode=WALK&amp;amp;toPlace=-33.5846161,-70.5410151&amp;amp;output=SHED' % (&lt;br /&gt;
        start_point, walking_time_period, walking_speed)&lt;br /&gt;
    otp_url = otp_isochroneOLD_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        walkshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(walkshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(walkshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,walkshed,crime_data,poi_data,distance_decay_function,walking_time_period)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Lo nuevo integrado gracias a Django&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
Archivos que se encuentran actualmente en el proyecto&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-08T22:07:01Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/aggregation', method='POST')&lt;br /&gt;
def service():&lt;br /&gt;
    poi = request.POST.get('poi', default=None)&lt;br /&gt;
    crime = request.POST.get('crime', default=None)&lt;br /&gt;
    walkshed = request.POST.get('bikeshed', default=None)&lt;br /&gt;
    start_point = request.POST.get('start_point', default=None)&lt;br /&gt;
    distance_decay_function = request.POST.get('distance_decay_function', default=None).lower()&lt;br /&gt;
    walking_time_period = request.POST.get('biking_time_period', default=None)&lt;br /&gt;
    if start_point and poi and crime and walkshed and distance_decay_function and walking_time_period is not None:&lt;br /&gt;
        return aggregation(start_point, walkshed, crime, poi, distance_decay_function, walking_time_period)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7364, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y modificamos la línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://www.gisciencegroup.ucalgary.ca:8080/opentripplanner-api-webapp/ws/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        otp_url = &amp;quot;http://146.155.17.18:23080/otp/routers/default/plan?arriveBy=false&amp;amp;time=6%3A58pm&amp;amp;ui_date=1%2F10%2F2013&amp;amp;mode=BICYCLE&amp;amp;optimize=QUICK&amp;amp;maxWalkDistance=5000&amp;amp;walkSpeed=1.38&amp;amp;date=2013-01-10&amp;amp;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para crime.py hay que hacer cambios drásticos ya que en Chile no contamos con la información geográfica de los crímenes de la ciudad, por lo que necesitamos que simplemente nos retorne 'NULL', aparte de eso debemos quitar todo lo relacionado con el paquete bottle. Por lo que eliminamos las líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
@route('/crime')&lt;br /&gt;
def service():&lt;br /&gt;
    polygon = request.GET.get('bikeshed', default=None)&lt;br /&gt;
    if polygon is not None:&lt;br /&gt;
        return pointInPolygon(polygon)&lt;br /&gt;
&lt;br /&gt;
run(host='0.0.0.0', port=7366, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y agregamos después de la definición de la función:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def pointInPolygon(polygon):&lt;br /&gt;
    return '&amp;quot;NULL&amp;quot;'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En POIService.py también debemos eliminar lo relacionado con bottle, similar a los archivos anteriores, y debemos editar la línea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://overpass-api.de/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    _overpass_url = 'http://146.155.17.18:24080/api/interpreter'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en ManagementService.py primero le cambiaremos el nombre a ManagementServiceBike.py (mas adelante se verá porqué), luego eliminamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import route, run, request&lt;br /&gt;
import bottle&lt;br /&gt;
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
@route('/management')&lt;br /&gt;
def service():&lt;br /&gt;
    start_point = request.GET.get('start_point', default=None)&lt;br /&gt;
    biking_time_period = request.GET.get('biking_time_period', default=None)&lt;br /&gt;
    distance_decay_function = request.GET.get('distance_decay_function', default=None)&lt;br /&gt;
&lt;br /&gt;
    if start_point and biking_time_period is not None:&lt;br /&gt;
        return management(start_point, biking_time_period, distance_decay_function)&lt;br /&gt;
run(host='0.0.0.0', port=7363, debug=True)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y rehacemos por completo la función management(), ya que está configurada para enviar las solicitudes a geoserver, esta vez la configuraremos para que funcione dentro de Django.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def management(start_point, biking_time_period, distance_decay_function,demographic):&lt;br /&gt;
    otp_isochrone_url = 'http://146.155.17.18:23080/otp/routers/default/plan?&amp;amp;'&lt;br /&gt;
    otp_dataInputs = 'fromPlace=%s&amp;amp;date=2016/05/05&amp;amp;time=12:00:00&amp;amp;mode=BICYCLE&amp;amp;cutoffSec=%s' % (start_point,str(int(biking_time_period)*60))&lt;br /&gt;
    otp_url = otp_isochrone_url + otp_dataInputs&lt;br /&gt;
    try:&lt;br /&gt;
        bikeshed = urllib2.urlopen(otp_url).read()&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;OTP does not respond&amp;quot;}'&lt;br /&gt;
    bikeshed = removeNonAscii(bikeshed)&lt;br /&gt;
    bikeshed = bikeshed.replace('&amp;amp;','and')&lt;br /&gt;
    bikeshed = bikeshed.replace(';',' ')&lt;br /&gt;
    bikeshed = json.loads(bikeshed)&lt;br /&gt;
    bikeshed = '{&amp;quot;type&amp;quot;:&amp;quot;Polygon&amp;quot;,&amp;quot;coordinates&amp;quot;:'+str(bikeshed['features'][0]['geometry']['coordinates'][0])+'}'&lt;br /&gt;
    try:&lt;br /&gt;
        poi_data = getPOIs(bikeshed)&lt;br /&gt;
    except:&lt;br /&gt;
        return '{&amp;quot;error&amp;quot;:&amp;quot;Overpass does not respond&amp;quot;}'&lt;br /&gt;
    crime_data = pointInPolygon(bikeshed)&lt;br /&gt;
    aggregation_data = aggregation(start_point,bikeshed,crime_data,poi_data,distance_decay_function,biking_time_period,demographic)&lt;br /&gt;
    result = '{&amp;quot;walkshed&amp;quot;: %s, &amp;quot;poi&amp;quot;: %s}' % (aggregation_data, poi_data)&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
Archivos que se encuentran actualmente en el proyecto&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Lo nuevo integrado gracias a Django&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-08T20:57:06Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
Vemos que en la web inicial los request se solicitan a la url /call_wps.php en conjunto de los datos enviados vía GET, como ahora estamos trabajando en Django dicha url no está apuntando a nada ya que no se encuentra registrada en urls.py, por lo que el código php que junta esta información y realiza la petición de la información se debe construir esta vez en Python, para ello necesitamos los archivos que procesan la información (2) y pasarlos al proyecto.&lt;br /&gt;
&lt;br /&gt;
== Bike ==&lt;br /&gt;
&lt;br /&gt;
Tomando de (2) los archivos de la carpeta Bike (AggregationService.py, CrimeService.py, ManagementService.py, POIService.py y config.py) y los copiamos dentro de la carpeta '''wyp'''. Tenemos que editarlos cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
En AggregationService.py eliminamos las siguientes líneas:&lt;br /&gt;
&amp;lt;script lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from bottle import &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
Archivos que se encuentran actualmente en el proyecto&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Lo nuevo integrado gracias a Django&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-08T20:38:14Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
En donde en models.py creamos clases que corresponderán a los modelos en la base de datos, en views.py creamos las funciones que guiarán en la aparición de las vistas (Que posteriormente llamaremos con urls.py), admin.py que es donde se registran los modelos de la bse de datos que se quieran mostrar en el panel de administración. Test.py para realizar pruebas (nunca lo he ocupado) e __init__.py para que sea reconocido por manage.py.&lt;br /&gt;
&lt;br /&gt;
En wyp/views.py editamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from django.shortcuts import render_to_response&lt;br /&gt;
from django.template.context import RequestContext&lt;br /&gt;
&lt;br /&gt;
def inicio(request):&lt;br /&gt;
  return render_to_response('index.html',context_instance=RequestContext(request))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y en wypdjango/urls.py editamos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from wyp.views import inicio&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
...&lt;br /&gt;
    url(r'^admin/', include(admin.site.urls)),&lt;br /&gt;
    url(r'^$', inicio),&lt;br /&gt;
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&lt;br /&gt;
urlpatterns += staticfiles_urlpatterns()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos posicionamos en la raíz y ejecutamos los siguientes comandos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python manage.py collectstatics #Rescata los archivos css y js del panel de administración y de los que tenga el template html&lt;br /&gt;
python manage.py makemigrations #Crea los archivos .py para editar la base de datos&lt;br /&gt;
python manage.py migrate        #Edita la base de datos con los cambios juntados en makemigrations&lt;br /&gt;
python manage.py runserver      #Corre un servidor local con la web&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el último comando corriendo, nos dirigimos a un navegador web y entramos a http://localhost:8000/ y nos encontraremos con el index.html de walkyourplace.&lt;br /&gt;
&lt;br /&gt;
Ya tenemos al menos la vista principal del proyecto, ahora debemos hacerlo funcionar.&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
Archivos que se encuentran actualmente en el proyecto&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Lo nuevo integrado gracias a Django&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-08T20:19:27Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Lo primero es crear un nuevo proyecto en Django&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
django-admin startproject wypdjango&lt;br /&gt;
cd wypdjango&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En donde nos encontramos con:&lt;br /&gt;
* manage.py&lt;br /&gt;
* wypdjango/&lt;br /&gt;
** __init__.py&lt;br /&gt;
** settings.py&lt;br /&gt;
** urls.py&lt;br /&gt;
** wsgi.py&lt;br /&gt;
&lt;br /&gt;
'''Manage.py''' es quien nos ayudará a correr la web, tanto en etapa de desarrollo como en producción, éste tomará en cuenta todas las carpetas que contengan el archivo '''__init__.py''' (el cual no cuenta con contenido), por lo mismo éste archivo no debe ser editado. '''Settings.py''' es en donde se encuentra toda la configuración que le asignemos, entre ella la conexión a la base de datos y la posición de los templates html. '''Urls.py''' será en donde listemos las URLs que queramos utilizar, además cumple la función de enlazar dicha url con una función desarrollada en lenguaje Python. Entonces, sabiendo esto hay que crear dos nuevas carpetas llamadas '''static''' y '''template''', la primera para contener todos los archivos css y js que necesitemos y la segunda para retener todos los html, luego editamos el archivo '''wypdjango/settings.py''' con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
BASE_DIR = os.path.dirname(os.path.dirname(__file__))&lt;br /&gt;
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = (&lt;br /&gt;
    ...&lt;br /&gt;
    'django.contrib.staticfiles',&lt;br /&gt;
    'wyp',&lt;br /&gt;
)&lt;br /&gt;
...&lt;br /&gt;
STATIC_URL = '/static/'&lt;br /&gt;
&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    PROJECT_PATH + '/../template/',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
STATIC_ROOT = PROJECT_PATH + '/../static/'&lt;br /&gt;
&lt;br /&gt;
ADMIN_MEDIA_PREFIX = '/static/admin/'&lt;br /&gt;
&lt;br /&gt;
STATICFILES_DIRS = (&lt;br /&gt;
    os.path.join(BASE_DIR,'template'),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego se clona el repositorio git (1) dentro de la carpeta template&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd template&lt;br /&gt;
git clone https://github.com/mepa1363/wyp-client .&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a la raíz y creamos una app dentro del proyecto para manejar la aparición del templace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ..&lt;br /&gt;
django-admin startapp wyp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto se crea una carpeta llamada '''wyp''' con:&lt;br /&gt;
* __init__.py&lt;br /&gt;
* admin.py&lt;br /&gt;
* models.py&lt;br /&gt;
* test.py&lt;br /&gt;
* views.py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
Archivos que se encuentran actualmente en el proyecto&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Lo nuevo integrado gracias a Django&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-08T18:28:33Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* State of the art */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= State of the art =&lt;br /&gt;
&lt;br /&gt;
EL código que se comenzó a editar se extrajo de los siguientes link:&lt;br /&gt;
* (1) https://github.com/mepa1363/wyp-client&lt;br /&gt;
* (2) https://github.com/mepa1363/wyp-server-ogc&lt;br /&gt;
* (3) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-transit&lt;br /&gt;
* (4) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-bike&lt;br /&gt;
* (5) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-pedestrian&lt;br /&gt;
* (6) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkscore&lt;br /&gt;
* (7) https://github.com/mepa1363/wyp-wrapper-geoserver-centralized-walkourplace&lt;br /&gt;
&lt;br /&gt;
De los cuales (1) es la interfaz gráfica, (2) es el servidor el cual crea los puertos para la comunicación y los demás son los módulos de geoserver para manejar las peticiones.&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Cambios principales en la migración&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
Archivos que se encuentran actualmente en el proyecto&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Lo nuevo integrado gracias a Django&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django</id>
		<title>Walkyourplace Django</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Walkyourplace_Django"/>
				<updated>2016-09-08T18:23:43Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: Created page with &amp;quot;= State of the art =  Qué es lo que había  = Migración a Django Python =  Cambios principales en la migración  = Funcionamiento actual =  Archivos que se encuentran actual...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= State of the art =&lt;br /&gt;
&lt;br /&gt;
Qué es lo que había&lt;br /&gt;
&lt;br /&gt;
= Migración a Django Python =&lt;br /&gt;
&lt;br /&gt;
Cambios principales en la migración&lt;br /&gt;
&lt;br /&gt;
= Funcionamiento actual =&lt;br /&gt;
&lt;br /&gt;
Archivos que se encuentran actualmente en el proyecto&lt;br /&gt;
&lt;br /&gt;
= Características nuevas =&lt;br /&gt;
&lt;br /&gt;
Lo nuevo integrado gracias a Django&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Cedeus_IDE</id>
		<title>Cedeus IDE</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Cedeus_IDE"/>
				<updated>2016-09-08T18:19:32Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* información útil y documentación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Centro de Desarrollo Urbano Sustentable - CEDEUS'''&lt;br /&gt;
&lt;br /&gt;
* Observatory Webpage: &lt;br /&gt;
** http://observatorio.cedeus.cl or http://www.datosurbanos.cl&lt;br /&gt;
* Other service domains:&lt;br /&gt;
** http://datos.cedeus.cl =&amp;gt; geonode direct access&lt;br /&gt;
** http://pubs.cedeus.cl =&amp;gt; omeka direct access&lt;br /&gt;
** http://wiki.cedeus.cl =&amp;gt; wiki direct access&lt;br /&gt;
** http://owncloud.cedeus.cl =&amp;gt; owncloud direct access =&amp;gt; path to add in OwnCloud client: http://owncloud.cedeus.cl/owncloud/ (not ''https'')&lt;br /&gt;
&lt;br /&gt;
'''Technical Configuration'''&lt;br /&gt;
* GeoNode WebServer is Cedeusgeonode: http://observatorio.cedeus.cl : open to world [http://live.osgeo.org/en/quickstart/geonode_quickstart.html OSGeo Quickstart]&lt;br /&gt;
* GeoNode DataServer is CedeusDB  : access is closed to world&lt;br /&gt;
&lt;br /&gt;
[[Libros del Observatorio]]&lt;br /&gt;
&lt;br /&gt;
== Funciones de Infraestructuras Científicos de Datos Espaciales ==&lt;br /&gt;
Bernard L, Mäs S, Müller M, Henzen C, y J Brauner (2013, [http://www.tandfonline.com/doi/abs/10.1080/17538947.2013.781244 J. o. Digital Earth]):&lt;br /&gt;
* encontrar y acceder al datos (=&amp;gt; importante: accuracy and scale, lineage and usage)&lt;br /&gt;
* integrar, procesar y analisar informaciones encontrados (=&amp;gt; oferecer servicios de procesamiento geo-espacial y permitir su integracion)&lt;br /&gt;
* publicar y compartir datos, métodos y resultados científicos&lt;br /&gt;
&lt;br /&gt;
== Tareas para crear la IDE de Cedeus ==&lt;br /&gt;
my [[CEDEUS ShortTime ToDo List]]&lt;br /&gt;
&lt;br /&gt;
CEDEUS Long term ToDo list:&lt;br /&gt;
# [[IDEs de Chile existente]]&lt;br /&gt;
# [[Cedeus Technical Architecture]]&lt;br /&gt;
#* TODO: security aspects of the IDE (user types, access management options)&lt;br /&gt;
# DOCUMENTO: Borrador de Proyecto -  development plan for future (clients v.2 v.3) - '''15. Dec.'''&lt;br /&gt;
# ENCUESTA : user and data survey&lt;br /&gt;
#* primero encuesta - hecho en '''Diciembre 2013''' por Nicolas, me mande archivos con la presentación y resultado&lt;br /&gt;
#* documents to prepare: (i) envisioned types of IDE use, (ii) list of data (themes) that may be in the institute (checklist?), (iii) data that should not be public, (iv) client types =&amp;gt; a mindmap exists already!!&lt;br /&gt;
# DATOS:&lt;br /&gt;
#* [[Cedeus Base Data]]&lt;br /&gt;
#* [[Cedeus Convenios]]&lt;br /&gt;
#* Notes:&lt;br /&gt;
#** EPSG Santiago (from OCUC dataset): 32719 (= UTM Zone 19 South), EPSG OSM: 4326&lt;br /&gt;
#** what exists&lt;br /&gt;
#** access rights (see GeoNode access options: public, logged-in user, group, user only)&lt;br /&gt;
#** stoarge/db structure (defined by storage structure of GeoNode for shapefiles, rasters are stored in web-folder)&lt;br /&gt;
# [[Cedeus Metadata]]&lt;br /&gt;
# TYPO DE CLIENTES&lt;br /&gt;
#* desktop clients - SIG : TODO inicio de encuesta en los grupos que usan: ArcGIS, QGIS, gvSIG, OpenJUMP, SAGA ... &lt;br /&gt;
#* web client- browsers : TODO: a desarrollar&lt;br /&gt;
#*# [[IDE Client Basica]] : visualisacion de datos solamente&lt;br /&gt;
#*# [[IDE Client Avanzado]] : con diseno, para ciudadanos&lt;br /&gt;
#*# [[IDE Client Experto]] : visualisacion, aggregar, manipular&lt;br /&gt;
&lt;br /&gt;
== información útil y documentación  ==&lt;br /&gt;
*[[accessing server infra]]&lt;br /&gt;
*[[setting up osgeo vm]]&lt;br /&gt;
*[[setting up geonode]] and [[geonode data upload]]&lt;br /&gt;
*[[backup of geonode]]&lt;br /&gt;
*[[setting up tilestream]] and [[Setting up Tilestream VM on CEDEUSDB]]&lt;br /&gt;
* How to setup [http://docs.geoserver.org/stable/en/user/installation/linux/index.html GeoServer] is described in this blog entry: http://houhongru.com/blog/2013/01/07/How-to-install-GeoServer-on-Ubuntu-12.04/ . However, I am not sure if the install of Oracles Java instead of openJDK is necessary, since, as far as I recall, the OSGeo LiveDVD uses OpenJDK as well. Location of GeoServer will be ''/var/lib/tomcat7/webapps/'' . (Note, I should have a PDF of that in my projects/planyourplace/docs/development/wyp/)&lt;br /&gt;
*[[setting up walkyourplace]]&lt;br /&gt;
*[[moving the SF wiki]]&lt;br /&gt;
*[[installing OTP]] and [[updating OTP graph]]&lt;br /&gt;
*[[Setting up Elgg VM on CedeusGeoNode]]&lt;br /&gt;
*[[Cedeus DB backups]]&lt;br /&gt;
*[[Nominatim for Traffic Accident Database]]&lt;br /&gt;
*[[installing CartoDB for CEDEUS]]&lt;br /&gt;
*[[installing Omeka for CEDEUS]]&lt;br /&gt;
*[[Processing GeoData for CEDEUS]]&lt;br /&gt;
*[[Trabajo Cristian]]&lt;br /&gt;
**[[Walkyourplace Django]]&lt;br /&gt;
&lt;br /&gt;
== List of VMs ==&lt;br /&gt;
'''on CedeusGeoNode:''' (see also script: ''startcedeusvms.sh'')&lt;br /&gt;
* geonode1204 : 12GB : 6 cpus : 13080 (VRDE 7767) with 200GB (185GB) disk =&amp;gt; disk name: geonode1204b.vdi. How to enlarge the disk check [[Nominatim for Traffic Accident Database]] ... however, the Nominatim VM is using 14.04 and not 12.04. NB: this VM has the old pw &lt;br /&gt;
* opensuse132 2GB : 2 cpus : 18022 (with https webgui 18052+18547, not yet unblocked console 18161, VRDE 7772)&lt;br /&gt;
* wikicedeus : 2GB : 2 cpus : cedeus wiki on ''22080/wiki/'' (VRDE 7769)&lt;br /&gt;
* mediawiki : 2GB : 2 cpus : personal wiki on ''21080/mediawiki-1.22.7/'' (VRDE 7771)&lt;br /&gt;
* elgg : 4 GB : 4 cpus : 15080 (VRDE 7765) on basicubuntu1404 with LAMPS&lt;br /&gt;
* additional there are for testing:&lt;br /&gt;
** basicubuntu1404&lt;br /&gt;
** geonode1404 : 8GB : 6 cpus : 12080 (VRDE 7768) - this VM is not in use (without GeoNode install)&lt;br /&gt;
** wyp : 8GB : 4 cpus : 17080 (with Tomcat and Postgres: 17088 vs 17032, VRDE 3389) http://146.155.17.19:17080/wypwps/&lt;br /&gt;
** elgg18pyp : 2GB, 2cpus : 31080 (VRDE 31065) - VM should be shut down &lt;br /&gt;
** windows864 3GB : 3 cpus (VRDE 7773) 40 GB&lt;br /&gt;
** windowsml1 3GB : 3 cpus (VRDE 7774) 40 GB&lt;br /&gt;
&lt;br /&gt;
'''on CedeusDB:'''&lt;br /&gt;
(no startup script yet)&lt;br /&gt;
* tilestream :  8GB : 4 cpus : with Tilestream on ''16088/#!/map/Fondef'' (VRDE 3389) : http://146.155.17.18:16088/#!/map/Fondef&lt;br /&gt;
*: =&amp;gt; switched off&lt;br /&gt;
* nominatim: 4GB : 4 cpus 200GB : with Nominatim on 146.155.17.18:22080 (VRDE 7761) &lt;br /&gt;
*: =&amp;gt; Note, Nominatim has port CONFLICT with Gatherer; TODO: fix this&lt;br /&gt;
*: =&amp;gt; Running only when needed&lt;br /&gt;
* otp09: 4GB : 4cpus  : on 146.155.17.18:30088 (VRDE 7762) : http://146.155.17.18:30088/opentripplanner-webapp/#/ : (OpenTripPlanner 0.9)&lt;br /&gt;
* cartodb: 8 GB : 6 cpus : on 146.155.17.18:19080 (VRDE 7763) =&amp;gt; for testing, but never got it really to work&lt;br /&gt;
*: =&amp;gt; switched off &lt;br /&gt;
* omeka: 6 GB : 4 cpus : on 146.155.17.18:20080 (VRDE 7764) : http://146.155.17.18:20080/omeka/&lt;br /&gt;
* owncloud: 6GB : 4 cpus : on 146.155.17.18:17080 (VRDE 7765) : http://146.155.17.18:17080/owncloud/ =&amp;gt; http://owncloud.cedeus.cl&lt;br /&gt;
* gitlab: 4GB : 2 cpus : on 146.155.17.18:18080 (VRDE 7766) : http://146.155.17.18:18080/&lt;br /&gt;
* indicator 1GB : 1 cpus : on 146.155.17.18:21080 (VRDE 7767) : http://146.155.17.18:21080/&lt;br /&gt;
* gatherer 2GB : 1 cpus : on 146.155.17.18:22080 (VRDE 7768) : &lt;br /&gt;
* otp 4GB : 4 cpus : on 146.155.17.18:23080 (VRDE 7769) : http://146.155.17.18:23080/ (OpenTripPlanner ¿0.13?)&lt;br /&gt;
* overpass : 4 GB : 2 cpus : on 146.155.17.18:24080 (VRDE 7770) : http://146.155.17.18:24080/api/interpreter/data=[data]&lt;br /&gt;
* geonode20b : 12 GB : 6 cpus : on 146.155.17.18:16080 (VRDE 3389) : http://146.155.17.18:16080 =&amp;gt; Copy of GeoNode from June 2015 we used for bug fixing&lt;br /&gt;
*: =&amp;gt; Note, geonode20b has port CONFLICT with tilestream VM&lt;br /&gt;
*: =&amp;gt; switched off&lt;br /&gt;
* geonodeTest: 8 GB : 4 cpus : on 146.155.17.18:16080 (VRDE 7771) : http://146.155.17.18:16080 =&amp;gt; Test of Geonode 2.4&lt;br /&gt;
*: =&amp;gt; Note, port CONFLICT with tilestream and geonode20b&lt;br /&gt;
&lt;br /&gt;
'''CedeusGeoNode reverse-proxy + geosteiniger.cl DNS zone editor settings'''&lt;br /&gt;
* GeoNode: 146.155.17.19:13080 =&amp;gt; geonode1204 VM =&amp;gt; cedeusdata.geosteiniger.cl&lt;br /&gt;
* Personal wiki : 1146.155.17.19:21080/mediawiki-1.22.7/ =&amp;gt; wiki.geosteiniger.cl/wiki/&lt;br /&gt;
* Cedeus wiki : 146.155.17.19/wiki/ =&amp;gt; Wiki VM =&amp;gt; cedeuswiki.geosteiniger.cl/wiki/&lt;br /&gt;
* OTP : 146.155.17.54:8080/opentripplanner-webapp/ =&amp;gt; otp.geosteiniger.cl/opentripplanner-webapp/&lt;br /&gt;
* Tilestream 146.155.17.18:16088/#!/map/Fondef =&amp;gt; tilestream.geosteiniger.cl/#!/map/Fondef&lt;br /&gt;
&lt;br /&gt;
Hosting info for [http://www.tcpiputils.com/browse/domain/puc.cl Puc.cl] -&amp;gt; name servers etc.&lt;br /&gt;
&lt;br /&gt;
== presentaciones ==&lt;br /&gt;
* 18.Dic.2014 : Coloquio &amp;quot;IDE Universidades&amp;quot; de SNIT (M. Bienes) - [http://www.geo.uzh.ch/~sstein/presentations/cedeus/idecedeus.html#0 progreso parte tecnico]&lt;br /&gt;
* xxx&lt;br /&gt;
== cache == &lt;br /&gt;
[[blackboard]]&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Cedeus_IDE</id>
		<title>Cedeus IDE</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Cedeus_IDE"/>
				<updated>2016-06-10T14:49:35Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* List of VMs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Centro de Desarrollo Urbano Sustentable - CEDEUS'''&lt;br /&gt;
&lt;br /&gt;
* Observatory Webpage: &lt;br /&gt;
** http://observatorio.cedeus.cl or http://www.datosurbanos.cl&lt;br /&gt;
* Other service domains:&lt;br /&gt;
** http://datos.cedeus.cl =&amp;gt; geonode direct access&lt;br /&gt;
** http://pubs.cedeus.cl =&amp;gt; omeka direct access&lt;br /&gt;
** http://wiki.cedeus.cl =&amp;gt; wiki direct access&lt;br /&gt;
** http://owncloud.cedeus.cl =&amp;gt; owncloud direct access =&amp;gt; path to add in OwnCloud client: http://owncloud.cedeus.cl/owncloud/ (not ''https'')&lt;br /&gt;
&lt;br /&gt;
'''Technical Configuration'''&lt;br /&gt;
* GeoNode WebServer is Cedeusgeonode: http://observatorio.cedeus.cl : open to world [http://live.osgeo.org/en/quickstart/geonode_quickstart.html OSGeo Quickstart]&lt;br /&gt;
* GeoNode DataServer is CedeusDB  : access is closed to world&lt;br /&gt;
&lt;br /&gt;
[[Libros del Observatorio]]&lt;br /&gt;
&lt;br /&gt;
== Funciones de Infraestructuras Científicos de Datos Espaciales ==&lt;br /&gt;
Bernard L, Mäs S, Müller M, Henzen C, y J Brauner (2013, [http://www.tandfonline.com/doi/abs/10.1080/17538947.2013.781244 J. o. Digital Earth]):&lt;br /&gt;
* encontrar y acceder al datos (=&amp;gt; importante: accuracy and scale, lineage and usage)&lt;br /&gt;
* integrar, procesar y analisar informaciones encontrados (=&amp;gt; oferecer servicios de procesamiento geo-espacial y permitir su integracion)&lt;br /&gt;
* publicar y compartir datos, métodos y resultados científicos&lt;br /&gt;
&lt;br /&gt;
== Tareas para crear la IDE de Cedeus ==&lt;br /&gt;
my [[CEDEUS ShortTime ToDo List]]&lt;br /&gt;
&lt;br /&gt;
CEDEUS Long term ToDo list:&lt;br /&gt;
# [[IDEs de Chile existente]]&lt;br /&gt;
# [[Cedeus Technical Architecture]]&lt;br /&gt;
#* TODO: security aspects of the IDE (user types, access management options)&lt;br /&gt;
# DOCUMENTO: Borrador de Proyecto -  development plan for future (clients v.2 v.3) - '''15. Dec.'''&lt;br /&gt;
# ENCUESTA : user and data survey&lt;br /&gt;
#* primero encuesta - hecho en '''Diciembre 2013''' por Nicolas, me mande archivos con la presentación y resultado&lt;br /&gt;
#* documents to prepare: (i) envisioned types of IDE use, (ii) list of data (themes) that may be in the institute (checklist?), (iii) data that should not be public, (iv) client types =&amp;gt; a mindmap exists already!!&lt;br /&gt;
# DATOS:&lt;br /&gt;
#* [[Cedeus Base Data]]&lt;br /&gt;
#* [[Cedeus Convenios]]&lt;br /&gt;
#* Notes:&lt;br /&gt;
#** EPSG Santiago (from OCUC dataset): 32719 (= UTM Zone 19 South), EPSG OSM: 4326&lt;br /&gt;
#** what exists&lt;br /&gt;
#** access rights (see GeoNode access options: public, logged-in user, group, user only)&lt;br /&gt;
#** stoarge/db structure (defined by storage structure of GeoNode for shapefiles, rasters are stored in web-folder)&lt;br /&gt;
# [[Cedeus Metadata]]&lt;br /&gt;
# TYPO DE CLIENTES&lt;br /&gt;
#* desktop clients - SIG : TODO inicio de encuesta en los grupos que usan: ArcGIS, QGIS, gvSIG, OpenJUMP, SAGA ... &lt;br /&gt;
#* web client- browsers : TODO: a desarrollar&lt;br /&gt;
#*# [[IDE Client Basica]] : visualisacion de datos solamente&lt;br /&gt;
#*# [[IDE Client Avanzado]] : con diseno, para ciudadanos&lt;br /&gt;
#*# [[IDE Client Experto]] : visualisacion, aggregar, manipular&lt;br /&gt;
&lt;br /&gt;
== información útil y documentación  ==&lt;br /&gt;
*[[accessing server infra]]&lt;br /&gt;
*[[setting up osgeo vm]]&lt;br /&gt;
*[[setting up geonode]] and [[geonode data upload]]&lt;br /&gt;
*[[backup of geonode]]&lt;br /&gt;
*[[setting up tilestream]] and [[Setting up Tilestream VM on CEDEUSDB]]&lt;br /&gt;
* How to setup [http://docs.geoserver.org/stable/en/user/installation/linux/index.html GeoServer] is described in this blog entry: http://houhongru.com/blog/2013/01/07/How-to-install-GeoServer-on-Ubuntu-12.04/ . However, I am not sure if the install of Oracles Java instead of openJDK is necessary, since, as far as I recall, the OSGeo LiveDVD uses OpenJDK as well. Location of GeoServer will be ''/var/lib/tomcat7/webapps/'' . (Note, I should have a PDF of that in my projects/planyourplace/docs/development/wyp/)&lt;br /&gt;
*[[setting up walkyourplace]]&lt;br /&gt;
*[[moving the SF wiki]]&lt;br /&gt;
*[[installing OTP]] and [[updating OTP graph]]&lt;br /&gt;
*[[Setting up Elgg VM on CedeusGeoNode]]&lt;br /&gt;
*[[Cedeus DB backups]]&lt;br /&gt;
*[[Nominatim for Traffic Accident Database]]&lt;br /&gt;
*[[installing CartoDB for CEDEUS]]&lt;br /&gt;
*[[installing Omeka for CEDEUS]]&lt;br /&gt;
*[[Processing GeoData for CEDEUS]]&lt;br /&gt;
*[[Trabajo Cristian]]&lt;br /&gt;
&lt;br /&gt;
== List of VMs ==&lt;br /&gt;
'''on CedeusGeoNode:''' (see also script: ''startcedeusvms.sh'')&lt;br /&gt;
* geonode1204 : 12GB : 6 cpus : 13080 (VRDE 7767) with 200GB (185GB) disk =&amp;gt; disk name: geonode1204b.vdi. How to enlarge the disk check [[Nominatim for Traffic Accident Database]] ... however, the Nominatim VM is using 14.04 and not 12.04. NB: this VM has the old pw &lt;br /&gt;
* opensuse132 2GB : 2 cpus : 18022 (with https webgui 18052+18547, not yet unblocked console 18161, VRDE 7772)&lt;br /&gt;
* wikicedeus : 2GB : 2 cpus : cedeus wiki on ''22080/wiki/'' (VRDE 7769)&lt;br /&gt;
* mediawiki : 2GB : 2 cpus : personal wiki on ''21080/mediawiki-1.22.7/'' (VRDE 7771)&lt;br /&gt;
* elgg : 4 GB : 4 cpus : 15080 (VRDE 7765) on basicubuntu1404 with LAMPS&lt;br /&gt;
* additional there are for testing:&lt;br /&gt;
** basicubuntu1404&lt;br /&gt;
** geonode1404 : 8GB : 6 cpus : 12080 (VRDE 7768) - this VM is not in use (without GeoNode install)&lt;br /&gt;
** wyp : 8GB : 4 cpus : 17080 (with Tomcat and Postgres: 17088 vs 17032, VRDE 3389) http://146.155.17.19:17080/wypwps/&lt;br /&gt;
** elgg18pyp : 2GB, 2cpus : 31080 (VRDE 31065) - VM should be shut down &lt;br /&gt;
** windows864 3GB : 3 cpus (VRDE 7773) 40 GB&lt;br /&gt;
** windowsml1 3GB : 3 cpus (VRDE 7774) 40 GB&lt;br /&gt;
&lt;br /&gt;
'''on CedeusDB:'''&lt;br /&gt;
(no startup script yet)&lt;br /&gt;
* tilestream :  8GB : 4 cpus : with Tilestream on ''16088/#!/map/Fondef'' (VRDE 3389) : http://146.155.17.18:16088/#!/map/Fondef&lt;br /&gt;
*: =&amp;gt; switched off&lt;br /&gt;
* nominatim: 4GB : 4 cpus 200GB : with Nominatim on 146.155.17.18:22080 (VRDE 7761) &lt;br /&gt;
*: =&amp;gt; Note, Nominatim has port CONFLICT with Gatherer; TODO: fix this&lt;br /&gt;
*: =&amp;gt; Running only when needed&lt;br /&gt;
* otp09: 4GB : 4cpus  : on 146.155.17.18:30088 (VRDE 7762) : http://146.155.17.18:30088/opentripplanner-webapp/#/ : (OpenTripPlanner 0.9)&lt;br /&gt;
* cartodb: 8 GB : 6 cpus : on 146.155.17.18:19080 (VRDE 7763) =&amp;gt; for testing, but never got it really to work&lt;br /&gt;
*: =&amp;gt; switched off &lt;br /&gt;
* omeka: 6 GB : 4 cpus : on 146.155.17.18:20080 (VRDE 7764) : http://146.155.17.18:20080/omeka/&lt;br /&gt;
* owncloud: 6GB : 4 cpus : on 146.155.17.18:17080 (VRDE 7765) : http://146.155.17.18:17080/owncloud/ =&amp;gt; http://owncloud.cedeus.cl&lt;br /&gt;
* gitlab: 4GB : 2 cpus : on 146.155.17.18:18080 (VRDE 7766) : http://146.155.17.18:18080/&lt;br /&gt;
* indicator 1GB : 1 cpus : on 146.155.17.18:21080 (VRDE 7767) : http://146.155.17.18:21080/&lt;br /&gt;
* gatherer 2GB : 1 cpus : on 146.155.17.18:22080 (VRDE 7768) : &lt;br /&gt;
* otp 4GB : 4 cpus : on 146.155.17.18:23080 (VRDE 7769) : http://146.155.17.18:23080/ (OpenTripPlanner ¿0.13?)&lt;br /&gt;
* overpass : 4 GB : 2 cpus : on 146.155.17.18:24080 (VRDE 7770) : http://146.155.17.18:24080/api/interpreter/data=[data]&lt;br /&gt;
* geonode20b : 12 GB : 6 cpus : on 146.155.17.18:16080 (VRDE 3389) : http://146.155.17.18:16080 =&amp;gt; Copy of GeoNode from June 2015 we used for bug fixing&lt;br /&gt;
*: =&amp;gt; Note, geonode20b has port CONFLICT with tilestream VM&lt;br /&gt;
*: =&amp;gt; switched off&lt;br /&gt;
* geonodeTest: 8 GB : 4 cpus : on 146.155.17.18:16080 (VRDE 7771) : http://146.155.17.18:16080 =&amp;gt; Test of Geonode 2.4&lt;br /&gt;
*: =&amp;gt; Note, port CONFLICT with tilestream and geonode20b&lt;br /&gt;
&lt;br /&gt;
'''CedeusGeoNode reverse-proxy + geosteiniger.cl DNS zone editor settings'''&lt;br /&gt;
* GeoNode: 146.155.17.19:13080 =&amp;gt; geonode1204 VM =&amp;gt; cedeusdata.geosteiniger.cl&lt;br /&gt;
* Personal wiki : 1146.155.17.19:21080/mediawiki-1.22.7/ =&amp;gt; wiki.geosteiniger.cl/wiki/&lt;br /&gt;
* Cedeus wiki : 146.155.17.19/wiki/ =&amp;gt; Wiki VM =&amp;gt; cedeuswiki.geosteiniger.cl/wiki/&lt;br /&gt;
* OTP : 146.155.17.54:8080/opentripplanner-webapp/ =&amp;gt; otp.geosteiniger.cl/opentripplanner-webapp/&lt;br /&gt;
* Tilestream 146.155.17.18:16088/#!/map/Fondef =&amp;gt; tilestream.geosteiniger.cl/#!/map/Fondef&lt;br /&gt;
&lt;br /&gt;
Hosting info for [http://www.tcpiputils.com/browse/domain/puc.cl Puc.cl] -&amp;gt; name servers etc.&lt;br /&gt;
&lt;br /&gt;
== presentaciones ==&lt;br /&gt;
* 18.Dic.2014 : Coloquio &amp;quot;IDE Universidades&amp;quot; de SNIT (M. Bienes) - [http://www.geo.uzh.ch/~sstein/presentations/cedeus/idecedeus.html#0 progreso parte tecnico]&lt;br /&gt;
* xxx&lt;br /&gt;
== cache == &lt;br /&gt;
[[blackboard]]&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Cedeus_IDE</id>
		<title>Cedeus IDE</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Cedeus_IDE"/>
				<updated>2016-04-19T14:24:16Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* List of VMs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Centro de Desarrollo Urbano Sustentable - CEDEUS&lt;br /&gt;
&lt;br /&gt;
* http://observatorio.cedeus.cl&lt;br /&gt;
* http://www.datosurbanos.cl&lt;br /&gt;
* configuration:&lt;br /&gt;
*# GeoNode WebServer is Cedeusgeonode: http://observatorio.cedeus.cl : open to world [http://live.osgeo.org/en/quickstart/geonode_quickstart.html OSGeo Quickstart]&lt;br /&gt;
*# GeoNode DataServer is CedeusDB  : access is closed to world&lt;br /&gt;
&lt;br /&gt;
== Funciones de Infraestructuras Científicos de Datos Espaciales ==&lt;br /&gt;
Bernard L, Mäs S, Müller M, Henzen C, y J Brauner (2013, [http://www.tandfonline.com/doi/abs/10.1080/17538947.2013.781244 J. o. Digital Earth]):&lt;br /&gt;
* encontrar y acceder al datos (=&amp;gt; importante: accuracy and scale, lineage and usage)&lt;br /&gt;
* integrar, procesar y analisar informaciones encontrados (=&amp;gt; oferecer servicios de procesamiento geo-espacial y permitir su integracion)&lt;br /&gt;
* publicar y compartir datos, métodos y resultados científicos&lt;br /&gt;
&lt;br /&gt;
== Tareas para crear la IDE de Cedeus ==&lt;br /&gt;
my [[CEDEUS ShortTime ToDo List]]&lt;br /&gt;
&lt;br /&gt;
CEDEUS Long term ToDo list:&lt;br /&gt;
# [[IDEs de Chile existente]]&lt;br /&gt;
# [[Cedeus Technical Architecture]]&lt;br /&gt;
#* TODO: security aspects of the IDE (user types, access management options)&lt;br /&gt;
# DOCUMENTO: Borrador de Proyecto -  development plan for future (clients v.2 v.3) - '''15. Dec.'''&lt;br /&gt;
# ENCUESTA : user and data survey&lt;br /&gt;
#* primero encuesta - hecho en '''Diciembre 2013''' por Nicolas, me mande archivos con la presentación y resultado&lt;br /&gt;
#* documents to prepare: (i) envisioned types of IDE use, (ii) list of data (themes) that may be in the institute (checklist?), (iii) data that should not be public, (iv) client types =&amp;gt; a mindmap exists already!!&lt;br /&gt;
# DATOS:&lt;br /&gt;
#* [[Cedeus Base Data]]&lt;br /&gt;
#* [[Cedeus Convenios]]&lt;br /&gt;
#* Notes:&lt;br /&gt;
#** EPSG Santiago (from OCUC dataset): 32719 (= UTM Zone 19 South), EPSG OSM: 4326&lt;br /&gt;
#** what exists&lt;br /&gt;
#** access rights (see GeoNode access options: public, logged-in user, group, user only)&lt;br /&gt;
#** stoarge/db structure (defined by storage structure of GeoNode for shapefiles, rasters are stored in web-folder)&lt;br /&gt;
# [[Cedeus Metadata]]&lt;br /&gt;
# TYPO DE CLIENTES&lt;br /&gt;
#* desktop clients - SIG : TODO inicio de encuesta en los grupos que usan: ArcGIS, QGIS, gvSIG, OpenJUMP, SAGA ... &lt;br /&gt;
#* web client- browsers : TODO: a desarrollar&lt;br /&gt;
#*# [[IDE Client Basica]] : visualisacion de datos solamente&lt;br /&gt;
#*# [[IDE Client Avanzado]] : con diseno, para ciudadanos&lt;br /&gt;
#*# [[IDE Client Experto]] : visualisacion, aggregar, manipular&lt;br /&gt;
&lt;br /&gt;
== información útil y documentación  ==&lt;br /&gt;
*[[accessing server infra]]&lt;br /&gt;
*[[setting up osgeo vm]]&lt;br /&gt;
*[[setting up geonode]] and [[geonode data upload]]&lt;br /&gt;
*[[backup of geonode]]&lt;br /&gt;
*[[setting up tilestream]] and [[Setting up Tilestream VM on CEDEUSDB]]&lt;br /&gt;
* How to setup [http://docs.geoserver.org/stable/en/user/installation/linux/index.html GeoServer] is described in this blog entry: http://houhongru.com/blog/2013/01/07/How-to-install-GeoServer-on-Ubuntu-12.04/ . However, I am not sure if the install of Oracles Java instead of openJDK is necessary, since, as far as I recall, the OSGeo LiveDVD uses OpenJDK as well. Location of GeoServer will be ''/var/lib/tomcat7/webapps/'' . (Note, I should have a PDF of that in my projects/planyourplace/docs/development/wyp/)&lt;br /&gt;
*[[setting up walkyourplace]]&lt;br /&gt;
*[[moving the SF wiki]]&lt;br /&gt;
*[[installing OTP]] and [[updating OTP graph]]&lt;br /&gt;
*[[Setting up Elgg VM on CedeusGeoNode]]&lt;br /&gt;
*[[Cedeus DB backups]]&lt;br /&gt;
*[[Nominatim for Traffic Accident Database]]&lt;br /&gt;
*[[installing CartoDB for CEDEUS]]&lt;br /&gt;
*[[installing Omeka for CEDEUS]]&lt;br /&gt;
*[[Processing GeoData for CEDEUS]]&lt;br /&gt;
*[[Trabajo Cristian]]&lt;br /&gt;
&lt;br /&gt;
== List of VMs ==&lt;br /&gt;
'''on CedeusGeoNode:''' (see also script: ''startcedeusvms.sh'')&lt;br /&gt;
* geonode1204 : 12GB : 6 cpus : 13080 (VRDE 7767) with 200GB (185GB) disk =&amp;gt; disk name: geonode1204b.vdi. How to enlarge the disk check [[Nominatim for Traffic Accident Database]] ... however, the Nominatim VM is using 14.04 and not 12.04. NB: this VM has the old pw &lt;br /&gt;
* opensuse132 2GB : 2 cpus : 18022 (with https webgui 18052+18547, not yet unblocked console 18161, VRDE 7772)&lt;br /&gt;
* wikicedeus : 2GB : 2 cpus : cedeus wiki on ''22080/wiki/'' (VRDE 7769)&lt;br /&gt;
* mediawiki : 2GB : 2 cpus : personal wiki on ''21080/mediawiki-1.22.7/'' (VRDE 7771)&lt;br /&gt;
* elgg : 4 GB : 4 cpus : 15080 (VRDE 7765) on basicubuntu1404 with LAMPS&lt;br /&gt;
* additional there are for testing:&lt;br /&gt;
** basicubuntu1404&lt;br /&gt;
** geonode1404 : 8GB : 6 cpus : 12080 (VRDE 7768) - this VM is not in use (without GeoNode install)&lt;br /&gt;
** wyp : 8GB : 4 cpus : 17080 (with Tomcat and Postgres: 17088 vs 17032, VRDE 3389) http://146.155.17.19:17080/wypwps/&lt;br /&gt;
** elgg18pyp : 2GB, 2cpus : 31080 (VRDE 31065) - VM should be shut down &lt;br /&gt;
** windows864 3GB : 3 cpus (VRDE 7773) 40 GB&lt;br /&gt;
** windowsml1 3GB : 3 cpus (VRDE 7774) 40 GB&lt;br /&gt;
&lt;br /&gt;
'''on CedeusDB:'''&lt;br /&gt;
(no startup script yet)&lt;br /&gt;
* tilestream :  8GB : 4 cpus : with Tilestream on ''16088/#!/map/Fondef'' (VRDE 3389) : http://146.155.17.18:16088/#!/map/Fondef&lt;br /&gt;
* nominatim: 4GB : 4 cpus 200GB : with Nominatim on 146.155.17.18:22080 (VRDE 7761)&lt;br /&gt;
* otp09: 4GB : 4cpus  : on 146.155.17.18:30088 (VRDE 7762) : http://146.155.17.18:30088/opentripplanner-webapp/#/&lt;br /&gt;
* cartodb: 8 GB : 6 cpus : on 146.155.17.18:19080 (VRDE 7763)&lt;br /&gt;
* omeka: 6 GB : 4 cpus : on 146.155.17.18:20080 (VRDE 7764) : http://146.155.17.18:20080/omeka/&lt;br /&gt;
* owncloud: 6GB : 4 cpus : on 146.155.17.18:17080 (VRDE 7765) : http://146.155.17.18:17080/owncloud/&lt;br /&gt;
* gitlab: 4GB : 2 cpus : on 146.155.17.18:18080 (VRDE 7766) : http://146.155.17.18:18080/&lt;br /&gt;
* indicator 1GB : 1 cpus : on 146.155.17.18:21080 (VRDE 7767) : http://146.155.17.18:21080/&lt;br /&gt;
* gatherer 2GB : 1 cpus : on 146.155.17.18:22080 (VRDE 7768) : xxx&lt;br /&gt;
* otp 4GB : 4 cpus : on 146.155.17.18:23080 (VRDE 7769) : http://146.155.17.18:23080/&lt;br /&gt;
* overpass 4 GB : 2 cpus : on 146.155.17.18:24080 (VRDE 7770) : http://146.155.17.18:24080/api/interpreter/data=[data]&lt;br /&gt;
&lt;br /&gt;
'''on Lautaro 113 (now powered down):'''&lt;br /&gt;
(no startup script)&lt;br /&gt;
* geonode :  8GB : 4 cpus : with &lt;br /&gt;
** GeoNode on ''http://146.155.17.54'' (VRDE 7778)&lt;br /&gt;
** OpenTripPlanner on ''http://146.155.17.54:8080/opentripplanner-webapp/'' &lt;br /&gt;
** Postgis on http://146.155.17.113:9080&lt;br /&gt;
&lt;br /&gt;
'''CedeusGeoNode reverse-proxy + geosteiniger.cl DNS zone editor settings'''&lt;br /&gt;
* GeoNode: 146.155.17.19:13080 =&amp;gt; geonode1204 VM =&amp;gt; cedeusdata.geosteiniger.cl&lt;br /&gt;
* Personal wiki : 1146.155.17.19:21080/mediawiki-1.22.7/ =&amp;gt; wiki.geosteiniger.cl/wiki/&lt;br /&gt;
* Cedeus wiki : 146.155.17.19/wiki/ =&amp;gt; Wiki VM =&amp;gt; cedeuswiki.geosteiniger.cl/wiki/&lt;br /&gt;
* OTP : 146.155.17.54:8080/opentripplanner-webapp/ =&amp;gt; otp.geosteiniger.cl/opentripplanner-webapp/&lt;br /&gt;
* Tilestream 146.155.17.18:16088/#!/map/Fondef =&amp;gt; tilestream.geosteiniger.cl/#!/map/Fondef&lt;br /&gt;
&lt;br /&gt;
Hosting info for [http://www.tcpiputils.com/browse/domain/puc.cl Puc.cl] -&amp;gt; name servers etc.&lt;br /&gt;
&lt;br /&gt;
== presentaciones ==&lt;br /&gt;
* 18.Dic.2014 : Coloquio &amp;quot;IDE Universidades&amp;quot; de SNIT (M. Bienes) - [http://www.geo.uzh.ch/~sstein/presentations/cedeus/idecedeus.html#0 progreso parte tecnico]&lt;br /&gt;
* xxx&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2016-04-15T02:07:11Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Instalación de Overpass API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	<entry>
		<id>http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian</id>
		<title>Trabajo Cristian</title>
		<link rel="alternate" type="text/html" href="http://mediawiki.cedeus.cl/mediawiki-1.22.7/index.php/Trabajo_Cristian"/>
				<updated>2016-04-15T02:06:32Z</updated>
		
		<summary type="html">&lt;p&gt;Cris: /* Instalación de Overpass API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documentación instalación de CartoDB =&lt;br /&gt;
&lt;br /&gt;
Todo se encuentra acá&lt;br /&gt;
http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Installing_CartoDB_for_CEDEUS#Trabajo_Cristian&lt;br /&gt;
&lt;br /&gt;
= Recuperación de Grub de servidor =&lt;br /&gt;
&lt;br /&gt;
Todo acá http://wiki.geosteiniger.cl/mediawiki-1.22.7/index.php/Solving_Ubuntu_GRUB_issue&lt;br /&gt;
&lt;br /&gt;
= Configuración UPS =&lt;br /&gt;
&lt;br /&gt;
== Configuración de red ==&lt;br /&gt;
&lt;br /&gt;
La UPS se encuentra configurada por red desde el servidor 146.155.17.19 por la salida de red &amp;quot;em2&amp;quot;.&lt;br /&gt;
Su configuración de red es:&lt;br /&gt;
&lt;br /&gt;
  IP:      192.168.100.2&lt;br /&gt;
  Mask:    255.255.255.0&lt;br /&gt;
  Gateway: 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
La configuración en la UPS se realizó mediante un cable USB-Serial hacia el servidor y la comunicación se hizo por minicom con la configuración:&lt;br /&gt;
&lt;br /&gt;
  A -    Serial Device      : /dev/ttyUSB0                              |&lt;br /&gt;
  B - Lockfile Location     : /var/lock                                 |&lt;br /&gt;
  C -   Callin Program      :                                           |&lt;br /&gt;
  D -  Callout Program      :                                           |&lt;br /&gt;
  E -    Bps/Par/Bits       : 9600 8N1                                  |&lt;br /&gt;
  F - Hardware Flow Control : No                                        |&lt;br /&gt;
  G - Software Flow Control : No&lt;br /&gt;
&lt;br /&gt;
Por lo mismo, la configuración de la boca de red &amp;quot;em2&amp;quot; debe tener la siguiente IP para que funcione correctamente:&lt;br /&gt;
&lt;br /&gt;
  IP: 192.168.100.1&lt;br /&gt;
  Mask: 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Por otro lado, para la configuración del servidor es necesario que se fije estáticamente la IP a la tarjeta de red em2. Para ello editamos el archivo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; y agregamos las líneas:&lt;br /&gt;
&lt;br /&gt;
  auto em2&lt;br /&gt;
    iface em2 inet static&lt;br /&gt;
    address 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Configuración en el servidor ==&lt;br /&gt;
&lt;br /&gt;
Se decide realizar la instalación con Nat, para ello lo instalamos mediante:&lt;br /&gt;
&lt;br /&gt;
  apt-get install nut nut-monitor nut-cgi nut-snmp snmp&lt;br /&gt;
&lt;br /&gt;
Luego, se verifica si el usuario nut fue creado posterior a la instalación:&lt;br /&gt;
&lt;br /&gt;
  '''root@cedeusgeonode:~# id nut'''&lt;br /&gt;
  uid=109(nut) gid=117(nut) groups=117(nut),20(dialout)&lt;br /&gt;
&lt;br /&gt;
Luego se edita el archivo '''/etc/nut/ups.conf''' para indicar el driver a utilizar para detectar la UPS, en nuestro caso es el siguiente:&lt;br /&gt;
&lt;br /&gt;
  [trust]&lt;br /&gt;
    driver = snmp-ups&lt;br /&gt;
    port = 192.168.100.2&lt;br /&gt;
    community = public&lt;br /&gt;
    snmp_version = v1&lt;br /&gt;
    pollfreq = 15&lt;br /&gt;
    privProtocol=AES&lt;br /&gt;
    desc = &amp;quot;Dispositivo UPS APC SNMP v1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Luego iniciamos el servicio&lt;br /&gt;
&lt;br /&gt;
  upsdrvctl start&lt;br /&gt;
&lt;br /&gt;
Lo siguiente es configurar los servicios correspondientes que monitoreen la UPS, con tal de que apaguen el servidor cuando no exista energía.&lt;br /&gt;
&lt;br /&gt;
Editamos el archivo /etc/nut/upsd.user y agregamos&lt;br /&gt;
&lt;br /&gt;
  [root]  &lt;br /&gt;
        password=t3st  &lt;br /&gt;
        actions = SET  &lt;br /&gt;
        instcmds = ALL  &lt;br /&gt;
  &lt;br /&gt;
  [upsmon]  &lt;br /&gt;
        password=pass  &lt;br /&gt;
        upsmon master  &lt;br /&gt;
        upsmon slave  &lt;br /&gt;
&lt;br /&gt;
Con esto estamos agregando usuarios que permitan la interacción entre los módulos.&lt;br /&gt;
Luego para upsmon editamos el archivo /etc/nut/upsmon.conf y modificamos las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
  MONITOR snmpv1 1 upsmon pass master  &lt;br /&gt;
  POWERDOWNFLAG /etc/killpower  &lt;br /&gt;
  SHUTDOWNCMD &amp;quot;/sbin/shutdown -h now&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Damos los permisos necesarios a los archivos para que sean ejecutados correctamente&lt;br /&gt;
&lt;br /&gt;
  chown root:nut /etc/nut/*&lt;br /&gt;
  chmod 640 /etc/nut/*&lt;br /&gt;
&lt;br /&gt;
Finalmente le decimos que inicie los servicios cuando prenda el servidor, creamos un archivo llamado /etc/default/nut y le agregamos:&lt;br /&gt;
&lt;br /&gt;
  START_UPSD=yes  &lt;br /&gt;
  START_UPSMON=yes&lt;br /&gt;
&lt;br /&gt;
y editamos /etc/nut/nut.conf&lt;br /&gt;
&lt;br /&gt;
  MODE=standalone&lt;br /&gt;
&lt;br /&gt;
Se espera que con esta configuración, el servidor que está conectado directamente con la UPS se apague cuando la UPS esté con poca energía, sin embargo falta aún la configuración del otro servidor, el cual se debe hacer modificando las configuraciones de upsd y upsmon respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Ver estado de la UPS ==&lt;br /&gt;
&lt;br /&gt;
Para ver en que estado se encuentra la UPS, podemos ver todos los detalles gracias al comando:&lt;br /&gt;
&lt;br /&gt;
  upsc snmpv1&lt;br /&gt;
&lt;br /&gt;
En caso de que no exista conexión, puede ser a causa de que el dirver no se encuentre corriendo, la solución para levantar dicho driver es ejecutar&lt;br /&gt;
&lt;br /&gt;
  upsdrvctr start&lt;br /&gt;
&lt;br /&gt;
= Mantención VM MiCiudad=&lt;br /&gt;
&lt;br /&gt;
El problema que contenía la VM fue que no se podía instalar ni actualizar ningún programa debido a que la carpeta /boot estaba al 100%, esto es causado por reiteradas actualizaciones de kernel (es normal) en donde se guarda una copia del kernel instalado anteriormente, por lo que hay que borrar dichos respaldos.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el comando &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt; vemos el disco lleno. Basta con ejecutar los siguientes comandos con permisos de administrador:&lt;br /&gt;
&lt;br /&gt;
  dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v &amp;quot;linux-image-$(uname -r)|linux-image-generic&amp;quot; |while read n;do apt-get -y remove $n;done&lt;br /&gt;
  apt-get autoclean&lt;br /&gt;
&lt;br /&gt;
Luego de esto ya es posible la actualización e instalación de aplicaciones via apt-get&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= omeka.org =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
Se propuso la instalación del servicio Omeka, para ello utilizamos una VM con Ubuntu, en el caso de prueba se utiliza Ubuntu 15.04.&lt;br /&gt;
&lt;br /&gt;
Primero, con permisos de administrador, se actualiza la VM y se instalan las dependencias para Omeka&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install -y unzip php5 php5-mysql apache2 mysql-server imagemagick&lt;br /&gt;
&lt;br /&gt;
Luego se descargan los archivos para la instalación de Omeka&lt;br /&gt;
&lt;br /&gt;
  cd&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
  unzip omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
Se mueven los archivos al directorio web&lt;br /&gt;
  &lt;br /&gt;
  sudo mv omeka-2.0/* /var/www/&lt;br /&gt;
  sudo mv omeka-2.0/.htaccess /var/www/&lt;br /&gt;
  sudo rm /var/www/index.html&lt;br /&gt;
&lt;br /&gt;
Configurar la base de datos, creando un usuario y sus permisos&lt;br /&gt;
&lt;br /&gt;
  sudo groupadd webdev&lt;br /&gt;
  sudo usermod -a -G webdev ubuntu&lt;br /&gt;
  cd /var&lt;br /&gt;
  sudo chown -R root.webdev www &lt;br /&gt;
  sudo chmod 775 www&lt;br /&gt;
  cd /var/www &lt;br /&gt;
  sudo find . -type d | xargs sudo chmod 775&lt;br /&gt;
  sudo find . -type f | xargs sudo chmod 664&lt;br /&gt;
  sudo find files -type d | xargs sudo chmod 777&lt;br /&gt;
  sudo find files -type f | xargs sudo chmod 666&lt;br /&gt;
&lt;br /&gt;
Crear la base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
&lt;br /&gt;
  create database omeka;&lt;br /&gt;
  grant all privileges on omeka.* to 'ubuntu' identified by 'reverse';&lt;br /&gt;
  flush privileges;&lt;br /&gt;
  quit;&lt;br /&gt;
&lt;br /&gt;
Editar el archivo db.ini modificando&lt;br /&gt;
&lt;br /&gt;
  [database]&lt;br /&gt;
  host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;ubuntu&amp;quot;&lt;br /&gt;
  password = &amp;quot;reverse&amp;quot;&lt;br /&gt;
  dbname = &amp;quot;omeka&amp;quot;&lt;br /&gt;
  prefix = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finalmente activar mod_rewrite&lt;br /&gt;
&lt;br /&gt;
  sudo a2enmod rewrite&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/apache2/sites-available/default cambiando &amp;quot;AllowOverride None&amp;quot; a &amp;quot;AllowOverride All&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Listo :)&lt;br /&gt;
&lt;br /&gt;
Lamentablemente esta instalación trae problemas con la activación de mod_rewrite.&lt;br /&gt;
&lt;br /&gt;
== Fedora Server 23 ==&lt;br /&gt;
&lt;br /&gt;
Lo primero son las dependencias&lt;br /&gt;
&lt;br /&gt;
  dnf install unzip mysql-server php php-mysql ImageMagick&lt;br /&gt;
&lt;br /&gt;
  chkconfig --levels 235 httpd on&lt;br /&gt;
  chkconfig --levels 235 mariadb on&lt;br /&gt;
&lt;br /&gt;
  setenforce 0&lt;br /&gt;
  systemctl start mariadb&lt;br /&gt;
&lt;br /&gt;
  mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
Colocar contraseña para cuenta de administrador en base de datos&lt;br /&gt;
&lt;br /&gt;
  mysql -u root -p&lt;br /&gt;
  mysql&amp;gt; use mysql&lt;br /&gt;
  mysql&amp;gt; insert into user(host, user, password) values('localhost','omeka_user',password('test'));&lt;br /&gt;
  mysql&amp;gt; insert into db(host,db,user,Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) values ('localhost','omeka_db','omeka_user','Y','Y','Y','Y','Y','Y');&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
  mysqladmin -u root -p create omeka_db&lt;br /&gt;
  mysqladmin -u root -p reload&lt;br /&gt;
  mysql&amp;gt; ALTER DATABASE omeka_db DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_unicode_ci';&lt;br /&gt;
  mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Editar el archivo /etc/httpd/conf/httpd.conf, cambiando el valor de AllowOverride  que se encuentra dentro del bloque &amp;lt;Directory &amp;quot;/var/www/html&amp;quot;&amp;gt; por All.&lt;br /&gt;
&lt;br /&gt;
  systemctl restart httpd&lt;br /&gt;
&lt;br /&gt;
  wget http://omeka.org/files/omeka-2.3.1.zip&lt;br /&gt;
&lt;br /&gt;
descomprimir archivo zip y renombrar carpeta por &amp;lt;code&amp;gt;omeka&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editar el archivo &amp;lt;code&amp;gt;omeka/db.ini&amp;lt;/code&amp;gt; con sus respectivos datos:&lt;br /&gt;
  [database]&lt;br /&gt;
  host     = &amp;quot;localhost&amp;quot;&lt;br /&gt;
  username = &amp;quot;omeka_user&amp;quot;&lt;br /&gt;
  password = &amp;quot;test&amp;quot;&lt;br /&gt;
  name     = &amp;quot;omeka_db&amp;quot;&lt;br /&gt;
  prefix   = &amp;quot;omeka_&amp;quot;&lt;br /&gt;
  ;port     = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Extractor de tweets =&lt;br /&gt;
&lt;br /&gt;
dependencias de trabajo:&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git vim&lt;br /&gt;
&lt;br /&gt;
dependencias: tweepy y psycopg2&lt;br /&gt;
&lt;br /&gt;
  sudo pip install tweepy&lt;br /&gt;
  sudo apt-get install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
También es necesario instalar y crear un usuario en postgresql&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
  sudo -i -u postgres&lt;br /&gt;
  createuser --interactive&lt;br /&gt;
  # csfuente as superuser&lt;br /&gt;
  createdb csfuente&lt;br /&gt;
  logout&lt;br /&gt;
&lt;br /&gt;
luego clonar el repositorio git&lt;br /&gt;
&lt;br /&gt;
  git clone http://146.155.17.18:18080/csfuente/twitter_extractor.git&lt;br /&gt;
  cd twitter_extractor&lt;br /&gt;
&lt;br /&gt;
Aquí tenemos dos archivos que ejecutar, primero es main.py el cual, al ser ejecutado por primera vez hay que poner un -r al final para crear la tabla de la base de datos (también borra todo dato anterior).&lt;br /&gt;
&lt;br /&gt;
  python main.py &amp;lt;Cuenta de twitter&amp;gt; [-r]&lt;br /&gt;
&lt;br /&gt;
Luego que finalice el anterior, se debe ejecutar el streaming, para recepcionar los tweets que vendrán.&lt;br /&gt;
&lt;br /&gt;
  python stream &amp;lt;Cuenta de twitter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;br /&gt;
  python main.py Cristian_F_G -r&lt;br /&gt;
  python main.py Cristian_F_G&lt;br /&gt;
&lt;br /&gt;
= OpenTripPlanner =&lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
Son necesarios dos programas escenciales, Java 8 y Maven mayor a 3.1.1&lt;br /&gt;
&lt;br /&gt;
Para Java ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo add-apt-repository ppa:openjdk-r/ppa&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install openjdk-8-jdk&lt;br /&gt;
&lt;br /&gt;
Para Maven&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install gdebi&lt;br /&gt;
  wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo gdebi maven3_3.2.1-0~ppa1_all.deb&lt;br /&gt;
  sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn&lt;br /&gt;
&lt;br /&gt;
Luego necesitamos git&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install git&lt;br /&gt;
&lt;br /&gt;
Y finalmente procedemos con la copia e instalación de OpenTripPlanner&lt;br /&gt;
&lt;br /&gt;
  git clone https://github.com/opentripplanner/OpenTripPlanner.git&lt;br /&gt;
  cd OpenTripPlanner&lt;br /&gt;
  mvn clean package -DskipTests&lt;br /&gt;
&lt;br /&gt;
Creamos la carpeta con la data&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/csfuente/otp&lt;br /&gt;
  cd /home/csfuente/otp&lt;br /&gt;
&lt;br /&gt;
Descargamos la data en esta carpeta....&lt;br /&gt;
&lt;br /&gt;
  wget http://www.dtpm.cl/descargas/gtfs/GTFS.zip&lt;br /&gt;
&lt;br /&gt;
Ejecutamos OTP desde su directorio con el comando&lt;br /&gt;
&lt;br /&gt;
  ./otp --build /home/csfuente/otp --inMemory&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= OSM + Overpass =&lt;br /&gt;
&lt;br /&gt;
== Instalación de servidor de OSM ==&lt;br /&gt;
&lt;br /&gt;
Para la instalación se utiliza una VM con Ubuntu 14.04. Las instrucciones fueron sacadas de:&lt;br /&gt;
 * https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/&lt;br /&gt;
Y actualizadas con la nueva versión de osm2pgsql&lt;br /&gt;
 * https://github.com/openstreetmap/osm2pgsql&lt;br /&gt;
&lt;br /&gt;
Lo primero es instalar las dependencias necesarias para proceder con la instalación de los componentes que utiliza OSM.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential \&lt;br /&gt;
    autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node \&lt;br /&gt;
    munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev \&lt;br /&gt;
    libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont \&lt;br /&gt;
    lua5.1 liblua5.1-dev libgeotiff-epsg node-carto&lt;br /&gt;
&lt;br /&gt;
Luego hay que instalar Postgresql y postgis&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1&lt;br /&gt;
&lt;br /&gt;
Ahora es necesario crear la base de datos, para ello necesitaremos de un usuario en postgres, por ahora se utilizará 'username' para la documentación.&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres -i&lt;br /&gt;
  createuser username&lt;br /&gt;
  createdb -E UTF8 -O username gis&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Lo mismo para el sistema Unix&lt;br /&gt;
&lt;br /&gt;
  sudo useradd -m username&lt;br /&gt;
  sudo passwd username&lt;br /&gt;
&lt;br /&gt;
Creamos las tablas de postgres y las asignamos al usuario&lt;br /&gt;
&lt;br /&gt;
  sudo -u postgres psql&lt;br /&gt;
  \c gis&lt;br /&gt;
  CREATE EXTENSION postgis;&lt;br /&gt;
  ALTER TABLE geometry_columns OWNER TO username;&lt;br /&gt;
  ALTER TABLE spatial_ref_sys OWNER TO username;&lt;br /&gt;
  \q&lt;br /&gt;
  exit&lt;br /&gt;
&lt;br /&gt;
Pasamos a la instalación de osm2pgsql, para ello crearemos la carpeta 'src' en la raiz de root para adjuntar los archivos&lt;br /&gt;
&lt;br /&gt;
  mkdir ~/src&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone https://github.com/openstreetmap/osm2pgsql.git&lt;br /&gt;
&lt;br /&gt;
Instalamos sus dependencias&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install make cmake g++ libboost-dev libboost-system-dev \&lt;br /&gt;
    libboost-filesystem-dev libexpat1-dev zlib1g-dev \&lt;br /&gt;
    libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 \&lt;br /&gt;
    liblua5.2-dev&lt;br /&gt;
&lt;br /&gt;
Compilamos e instalamos&lt;br /&gt;
&lt;br /&gt;
  mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
  cmake ..&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
&lt;br /&gt;
Procedemos a instalar Mapnik&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/mapnik/mapnik&lt;br /&gt;
  cd mapnik&lt;br /&gt;
  git branch 2.2 origin/2.2.x&lt;br /&gt;
  git checkout 2.2&lt;br /&gt;
  python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Podemos verificar que Mapnik funciona con&lt;br /&gt;
&lt;br /&gt;
  python&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt; import mapnik&lt;br /&gt;
  &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora la instalación de mod_tile y render&lt;br /&gt;
&lt;br /&gt;
  cd ~/src&lt;br /&gt;
  git clone git://github.com/openstreetmap/mod_tile.git&lt;br /&gt;
  cd mod_tile&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  make&lt;br /&gt;
  sudo make install&lt;br /&gt;
  sudo make install-mod_tile&lt;br /&gt;
  sudo ldconfig&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta /usr/local/share/maps/style para los archivos stylesheet y los recursos necesarios, además instalamos y configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir -p /usr/local/share/maps/style&lt;br /&gt;
  sudo chown username /usr/local/share/maps/style&lt;br /&gt;
  cd /usr/local/share/maps/style&lt;br /&gt;
  wget https://github.com/mapbox/osm-bright/archive/master.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip&lt;br /&gt;
  wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip&lt;br /&gt;
  mkdir ne_10m_populated_places_simple&lt;br /&gt;
  cd ne_10m_populated_places_simple&lt;br /&gt;
  wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip&lt;br /&gt;
  unzip ne_10m_populated_places_simple.zip&lt;br /&gt;
  rm ne_10m_populated_places_simple.zip&lt;br /&gt;
  cd ..&lt;br /&gt;
  unzip '*.zip'&lt;br /&gt;
  mkdir osm-bright-master/shp&lt;br /&gt;
  mv land-polygons-split-3857 osm-bright-master/shp/&lt;br /&gt;
  mv simplified-land-polygons-complete-3857 osm-bright-master/shp/&lt;br /&gt;
  mv ne_10m_populated_places_simple osm-bright-master/shp/&lt;br /&gt;
  cd osm-bright-master/shp/land-polygons-split-3857&lt;br /&gt;
  shapeindex land_polygons.shp&lt;br /&gt;
  cd ../simplified-land-polygons-complete-3857/&lt;br /&gt;
  shapeindex simplified_land_polygons.shp&lt;br /&gt;
  cd ../..&lt;br /&gt;
&lt;br /&gt;
Ahora configuramos OSM Bright&lt;br /&gt;
&lt;br /&gt;
  vim osm-bright/osm-bright.osm2pgsql.mml&lt;br /&gt;
&lt;br /&gt;
Acá hay que buscar las direcciones que se encuentran al lado derecho del tag 'file' y cambiar la dirección por la ruta de los archivos que cambiamos anteriormente, además agregamos su característica de 'type' tal como se muestra a continuación&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;file&amp;quot;: &amp;quot;/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp&amp;quot;, &lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;shape&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Hay que ser riguroso con no olvidar las comas finales de cada línea.&lt;br /&gt;
Luego, en la sección 'ne-places', reemplazar 'srs' y 'srs-name' con esto:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;srs&amp;quot;: &amp;quot;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
Nos queda ahora compilar todo para que Mapnik pueda ser utilizado. Creamos el archivo de configuración y cambiamos la linea de pointing de ~/Documents/Mapbox/project a /usr/local/share/maps/style y cambiamos dbname de osm a gis. Guardamos y salimos.&lt;br /&gt;
&lt;br /&gt;
  cp configure.py.sample configure.py&lt;br /&gt;
  vim configure.py&lt;br /&gt;
  #Realizar cambios nombrados&lt;br /&gt;
  ./make.py&lt;br /&gt;
  cd ../OSMBright/&lt;br /&gt;
  carto project.mml &amp;gt; OSMBright.xml&lt;br /&gt;
&lt;br /&gt;
Listo con ésto, ahora debemos configurar el render. Como root es necesario editar el archivo de configuración de render ubicado en /usr/local/etc/renderd.conf y cambiar las siguientes lineas en las secciones de render, mapnik y default.&lt;br /&gt;
&lt;br /&gt;
  socketname=/var/run/renderd/renderd.sock&lt;br /&gt;
  plugins_dir=/usr/local/lib/mapnik/input&lt;br /&gt;
  font_dir=/usr/share/fonts/truetype/ttf-dejavu&lt;br /&gt;
  XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml&lt;br /&gt;
  HOST=localhost&lt;br /&gt;
&lt;br /&gt;
Las líneas que se encuentran comentadas con un ; deben ser descomentadas.&lt;br /&gt;
&lt;br /&gt;
Ahora creamos las carpetas necesarias para usar el sistema de mod_tile&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo mkdir /var/lib/mod_tile&lt;br /&gt;
  sudo chown username /var/lib/mod_tile&lt;br /&gt;
&lt;br /&gt;
creamos en archivo /etc/apache2/conf-available/mod_tile.conf y agregamos una sola línea:&lt;br /&gt;
&lt;br /&gt;
  LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so&lt;br /&gt;
&lt;br /&gt;
Y editamos el archivo /etc/apache2/sites-available/000-default.conf agregando esto justo después del email del administrador&lt;br /&gt;
&lt;br /&gt;
  LoadTileConfigFile /usr/local/etc/renderd.conf&lt;br /&gt;
  ModTileRenderdSocketName /var/run/renderd/renderd.sock&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered&lt;br /&gt;
  ModTileRequestTimeout 0&lt;br /&gt;
  # Timeout before giving up for a tile to be rendered that is otherwise missing&lt;br /&gt;
  ModTileMissingRequestTimeout 30&lt;br /&gt;
&lt;br /&gt;
Finalmente agregamos mod_tile a apache y lo reiniciamos&lt;br /&gt;
&lt;br /&gt;
  sudo a2enconf mod_tile&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Ahora debemos dejar mas potente postgres para que no funcione lento al momento de solicitar datos, editamos con sudo el archivo /etc/postgresql/9.3/main/postgresql.conf para cambiar:&lt;br /&gt;
&lt;br /&gt;
  shared_buffers = 128MB&lt;br /&gt;
  checkpoint_segments = 20&lt;br /&gt;
  maintenance_work_mem = 256MB&lt;br /&gt;
  autovacuum = off&lt;br /&gt;
&lt;br /&gt;
editamos tambien con sudo el archivo /etc/sysctl.conf para agregar una línea entre las definiciones de kernel&lt;br /&gt;
&lt;br /&gt;
  # Increase kernel shared memory segments - needed for large databases&lt;br /&gt;
  kernel.shmmax=268435456&lt;br /&gt;
&lt;br /&gt;
Reiniciamos la VM y luego ejecutamos:&lt;br /&gt;
&lt;br /&gt;
  sudo sysctl kernel.shmmax&lt;br /&gt;
&lt;br /&gt;
y verificamos que nos muestre el número que pusimos&lt;br /&gt;
&lt;br /&gt;
Ahora nos queda cargar las tiles correspondientes al servidor, para este trabajo se utilizan solo las tiles de Chile.&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /usr/local/share/maps/planet&lt;br /&gt;
  sudo chown username /usr/local/share/maps/planet&lt;br /&gt;
  cd /usr/local/share/maps/planet&lt;br /&gt;
  wget http://download.geofabrik.de/south-america/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Importamos la data descargada en la base de datos, el número que se encuentra luego de -C debe ser cambiado dependiendo de la memoria RAM disponible para la máquina. Se sugiere comenzar con un númerp 16000 y si excede la memoria entonces reducir dicho número. Para las pruebas fue posible ejecutar el comando con un -C de 3500&lt;br /&gt;
&lt;br /&gt;
  osm2pgsql --slim -d gis -C 3500 --number-processes 3 /usr/local/share/maps/planet/chile-latest.osm.pbf&lt;br /&gt;
&lt;br /&gt;
Tomar café y esperar. Dependiendo de la información a cargar, puede tardar entre 10 minutos hasta 24 horas.&lt;br /&gt;
&lt;br /&gt;
Finalmente levantamos el servidor y lo hacemos correr, para ello ejecutamos&lt;br /&gt;
&lt;br /&gt;
  sudo mkdir /var/run/renderd&lt;br /&gt;
  sudo chown username /var/run/renderd&lt;br /&gt;
  sudo -u username renderd -f -c /usr/local/etc/renderd.conf&lt;br /&gt;
&lt;br /&gt;
y en una terminal diferente&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Podemos probar que el servidor se encuentra corriendo entrando a la dirección http://localhost/osm_tiles/0/0/0.png para ver una imagen del mundo. Para otras imágenes es necesario rescatarlas con http://localhost/osm_tiles/{z}/{x}/{y}.png (localhost puede ser cambiado por la IP de la VM)&lt;br /&gt;
&lt;br /&gt;
== Instalación de Overpass API ==&lt;br /&gt;
&lt;br /&gt;
La información fue extraida desde las siguientes páginas con modificación en los link de descarga de la data:&lt;br /&gt;
&lt;br /&gt;
  http://overpass-api.de/no_frills.html&lt;br /&gt;
  http://overpass-api.de/full_installation.html&lt;br /&gt;
&lt;br /&gt;
Los comandos utilizados fueron:&lt;br /&gt;
&lt;br /&gt;
Primero son las dependencias base&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install wget g++ make expat libexpat1-dev zlib1g-dev&lt;br /&gt;
&lt;br /&gt;
Luego se realiza la instalación del software de Overpass, para ello se utiliza como directorio de ejecutables la misma base del archivo a descargar (perfectamente se podría cambiar)&lt;br /&gt;
&lt;br /&gt;
  wget http://dev.overpass-api.de/releases/osm-3s_v0.7.52.tar.gz&lt;br /&gt;
  gunzip &amp;lt;osm-3s_v0.7.52.tar.gz | tar xvf -&lt;br /&gt;
  cd osm-3s_v0.7.52/&lt;br /&gt;
  ./configure --prefix=&amp;quot;`pwd`&amp;quot;&lt;br /&gt;
  make CXXFLAGS=&amp;quot;-O3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Se crea la carpeta de la base de datos, se descarga la información y se adjunta a Overpass (Es posible solo utilizar Chile)&lt;br /&gt;
&lt;br /&gt;
  mkdir db&lt;br /&gt;
  wget -O planet.osm.bz2 &amp;quot;http://planet.osm.org/planet/planet-latest.osm.bz2&amp;quot;&lt;br /&gt;
  bin/init_osm3s.sh planet.osm.bz2 &amp;quot;db/&amp;quot; &amp;quot;./&amp;quot; --meta&lt;br /&gt;
&lt;br /&gt;
Con esto ya tenemos la data de Overpass, ahora lo uniremos a Apache, para ello lo instalamos y configuramos para cgi según http://wiki.openstreetmap.org/wiki/Overpass_API/Installation#Setting_up_the_Web_API&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install apache2&lt;br /&gt;
  sudo a2enmod cgi&lt;br /&gt;
  sudo vim /etc/apache2/sites-available/000-default.conf&lt;br /&gt;
&lt;br /&gt;
En el archivo agregamos las líneas faltantes para que nos quede algo similar a esto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    ExtFilterDefine gzip mode=output cmd=/bin/gzip&lt;br /&gt;
    DocumentRoot [YOUR_HTML_ROOT_DIR]&lt;br /&gt;
    # This directive indicates that whenever someone types http://www.mydomain.com/api/ &lt;br /&gt;
    # Apache2 should refer to what is in the local directory [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    ScriptAlias /api/ [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    # This specifies some directives specific to the directory: [YOUR_EXEC_DIR]/cgi-bin/&lt;br /&gt;
    &amp;lt;Directory &amp;quot;[YOUR_EXEC_DIR]/cgi-bin/&amp;quot;&amp;gt;&lt;br /&gt;
      AllowOverride None&lt;br /&gt;
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
      # For Apache 2.4:&lt;br /&gt;
      #  Order allow,deny&lt;br /&gt;
      # For Apache &amp;gt; 2.4:  &lt;br /&gt;
      Require all granted&lt;br /&gt;
      #SetOutputFilter gzip&lt;br /&gt;
      #Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
    ErrorLog /var/log/apache2/error.log&lt;br /&gt;
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg&lt;br /&gt;
    LogLevel warn&lt;br /&gt;
    CustomLog /var/log/apache2/access.log combined&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizando [YOUR_HTML_ROOT_DIR] por el que venía por defecto, [YOUR_EXEC_DIR] la dirección completa en donde compilamos Overpass y dejando sin editar ErrorLog y CustomLog.&lt;br /&gt;
&lt;br /&gt;
Luego se reinicia el demonio de apache&lt;br /&gt;
&lt;br /&gt;
  sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
Finalmente ejecutamos el proceso que nos permite recuperar los archivos que buscamos, para ello nos posicionamos en la carpeta del ejecutable en donde instalamos Overpass y escribimos el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
  sudo nohup bin/dispatcher --osm-base --meta --db-dir=&amp;quot;db&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Listo, ahora para poder recuperar un archivo xml con los cambios que deseamos probar, debemos ejecutar el siguiente comando en algún otro computador (o el mismo)&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=[nombre_archivo.xml] http://[IP_de_la_máquina]/api/interpreter?data=[código_a_ejecutar_en_overpass]&lt;br /&gt;
&lt;br /&gt;
como ejemplo, en la misma máquina podemos ejecutar&lt;br /&gt;
&lt;br /&gt;
  wget --output-document=test.xml http://localhost/api/interpreter?data=%3Cprint%20mode=%22body%22/%3E&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm-derived&amp;gt;&lt;br /&gt;
  &amp;lt;note&amp;gt;&lt;br /&gt;
    The data included in this document is from www.openstreetmap.org. It has there been collected &lt;br /&gt;
    by a large group of contributors. For individual attribution of each item please refer to &lt;br /&gt;
    http://www.openstreetmap.org/api/0.6/[node|way|relation]/#id/history &lt;br /&gt;
  &amp;lt;/note&amp;gt;&lt;br /&gt;
  &amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm-derived&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PD: Los bancos de mi ciudad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
http://localhost/api/interpreter?data=%3Cosm-script%3E%3Cquery%20into=%22_%22%20type=%22node%22%3E%3Chas-kv%20k=%22amenity%22%20modv=%22%22%20v=%22bank%22/%3E%3Cbbox-query%20e=%22-71.72712922096252%22%20into=%22_%22%20n=%22-35.59095565308603%22%20s=%22-35.5972720219081%22%20w=%22-71.73655986785889%22/%3E%3C/query%3E%3Cprint%20e=%22%22%20from=%22_%22%20geometry=%22skeleton%22%20limit=%22%22%20mode=%22body%22%20n=%22%22%20order=%22id%22%20s=%22%22%20w=%22%22/%3E%3C/osm-script%3E&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586850&amp;quot; lat=&amp;quot;-35.5947536&amp;quot; lon=&amp;quot;-71.7334849&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;BancoEstado&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540586923&amp;quot; lat=&amp;quot;-35.5946228&amp;quot; lon=&amp;quot;-71.7339302&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Banco de Chile&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2540635212&amp;quot; lat=&amp;quot;-35.5956784&amp;quot; lon=&amp;quot;-71.7295394&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;amenity&amp;quot; v=&amp;quot;bank&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Santander&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cris</name></author>	</entry>

	</feed>