Solicitud de API de descanso de OpenTripPlanner

8

siguiendo este tutorial configuré un servidor independiente OpenTripPlanner (versión 0.11.0). Funciona muy bien en

 http://localhost:8080/index.html

y por ejemplo en

http://localhost:8080/otp/routers/default/index/routes 

devuelve una ruta json.

Ahora haría la solicitud de la API de descanso (me interesa la API de Isochrone). Intento devolver la geometría de isócrona como un conjunto de polígonos GeoJSON en la url especificada en este enlace, pero no funciona.

¿Puedes sugerir la url correcta para obtener Isochrone GeoJSON?

franco_b
fuente

Respuestas:

4

Estoy prácticamente en el mismo barco que tú, pero creo que he descubierto cómo crear una isócrona. Estoy usando la versión 0.18.0, no estoy seguro si eso es relevante o no.

Aquí es donde encontré el ejemplo.

Aquí hay una muestra de isócrona que obtuve

http://localhost:8080/otp/routers/default/isochrone?&fromPlace=39.78,-86.1476&date=2015/01/09&time=12:00:00&mode=WALK&&walkSpeed=5&cutoffSec=4000

Parece bastante intuitivo, pero no creo que los documentos que encontré estén actualizados, así que no tengo idea de cómo alterar la isócrona, excepto en formas simples. Espero que esto sea útil.

Ravi Mehta
fuente
2

Creo que es muy importante qué versión de OTP utilizas, ya que los desarrolladores realizan cambios constantemente: solo recientemente he estado cavando en v0.19 y a continuación hay dos ejemplos de envoltorios de trabajo en progreso para llamar a la API isochrone de OTP con él.

@Ravi ya le ha dado la llamada URL para la API isochrone, si no funciona cuando actualiza Lat / Lon para su área e ingresa en su navegador después de iniciar OTP, luego vuelva a lo básico y asegúrese de que su instancia de OTP funciona: tenga en cuenta que la respuesta de OTP a la URL será diferente si incluye el --analystindicador (devuelve GeoJSON) o no (devuelve un archivo de forma) al iniciar OTP. Agregué un puñado de enlaces que me han sido útiles para la publicación de @ Ravi sobre los tutoriales de OTP.

En términos de uso de la respuesta a continuación, hay dos opciones que esperamos sean útiles.

Primero, aquí hay una función de Python dirigida en la misma dirección que la consulta SQL a continuación (tenga en cuenta que solo escribe el GeoJSON de regreso ya que aún no me he tomado el tiempo para extraer / leer la respuesta en Python): imagino alguna variación de esto es lo que se necesita para la web de mapeo (dependiendo claramente en qué idioma análisis de su sitio está en, supongo que sería aún más sencillo en javascript), pero no he buscado ejemplos (se ve FYI como si era una web sitio que utilizó OTP para crear isocronas)

import json, requests
def OTPIsochroneAPI(orig, o_code, depTime = '8:00:00', cutoff = 2700, interimFolder = './interim_isochrones'):
    # create query
    baseURL = 'http://localhost:8080/otp/routers/default/isochrone?'
    qryDT = '&date=2015/12/7&time={0}&mode=WALK,TRANSIT&cutoffSec={1}'.format(depTime, cutoff)
    url = '{0}fromPlace={1},{2}&{3}'.format(baseURL, orig.lat, orig.lon, qryDT)
    # print url # print out for testing
    # get isochrone response
    try:
        response = requests.get(url)
        data = json.loads(response.text)
        #print 'response received for %s' % (str(o_code))
    # save out response
        isoFile = '{0}/isochrone_{1}_8am.geojson'.format(interimFolder, (str(o_code)))
        with open(isoFile, 'w') as outfile:
            json.dump(data, outfile)
        # TO DO: return data (plus parse and reformat for some Python spatial library) 
        print 'wrote GeoJSON for o_code %s' % (o_code)
    except IOError as (errno, strerror):
        print "I/O error({0}): {1}".format(errno, strerror)
    except ValueError:
        print "No JSON object could be decoded"
    except:
        print "Unexpected error:", sys.exc_info()[0]
        raise

Alternativamente, si se siente cómodo en PostGIS, aquí hay un enfoque que comencé a trabajar ayer, tenga en cuenta que requiere que la extensión HTTP de Paul Ramsey esté instalada en su base de datos y solo probé esto en el PostgreSQL más reciente (9.5) con PostGIS 2.2. También tenga en cuenta que esto solo está destinado a extraer una sola isócrona (por lo tanto, solo una &cutoffSec=dada), necesitaría adaptarse para extraer múltiples: creo que unnest()en lugar de (o además de) la json_array_elements()función

SELECT q.id_column, 
    CASE WHEN (q.resp).status = 200 -- check if response is OK
    THEN ST_SetSRID( -- creating a new geometry so need to set SRID
        ST_GeomFromGeoJSON( --OTP analyst responds with a GeoJSON
          -- but ST_GeomFromGeoJSON only handles a feature at a time 
          -- so we need to extract it, thus the functional but messy SQL below
        (json_array_elements( 
        (q.resp).content::JSON->'features')->'geometry')::text)
        ,4326) 
    ELSE NULL -- there was a problem. maybe your origin was in the ocean
    END as geom_isochrone -- name your extracted geometry column
FROM ( SELECT id_column, -- grab a column identifier, then extract API response:
    http_get('http://localhost:8080/otp/routers/default/isochrone?fromPlace=' 
    || y || ',' || x || -- set your lat and lon from input data
    '&date=2015/12/7&time=8:00:00&mode=WALK,TRANSIT&cutoffSec=2700') as resp 
    FROM input_table -- your input table
) q;
Claytonrsh
fuente