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 --analyst
indicador (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;