Eu acredito que é muito importante qual versão do OTP você usa como desenvolvedores constantemente fazendo alterações - só recentemente estive pesquisando a v0.19 e abaixo estão dois exemplos de invólucros em andamento de chamar a API de isócrona da OTP com ela.
O @Ravi já forneceu a chamada de URL para a API isochrone, se não funcionar quando você atualizar o Lat / Lon para sua área e inseri-lo no seu navegador após o lançamento do OTP, volte ao básico e verifique se sua instância of OTP works - note que a resposta do OTP ao URL será diferente se você incluir o --analyst
sinalizador (retorna GeoJSON) ou não (retorna um shapefile) ao iniciar o OTP. Adicionei um punhado de links que me ajudaram na postagem de @ Ravi sobre os tutoriais do OTP.
Em termos de uso da resposta abaixo, há duas opções que são úteis.
Primeiro, aqui está uma função Python na mesma direção que a consulta SQL abaixo (observe que ela apenas escreve o GeoJSON de retorno, pois ainda não tirei um tempo para extrair / ler a resposta em Python) - imagino alguma variação disso é o que você precisa para web-mapping (claramente dependendo do que linguagem de análise do seu site está dentro, acho que seria ainda mais simples em javascript), mas eu não olhei para exemplos (FYI parece que não foi um web site que usou OTP para criar isócronas)
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
Como alternativa, se você se sentir confortável no PostGIS, aqui está uma abordagem que eu trabalhei ontem, observe que é necessário que a extensão HTTP de Paul Ramsey seja instalada no seu banco de dados e só testei isso no PostgreSQL (9.5) mais recente (9.5) com o PostGIS 2.2. Observe também que isso serve apenas para extrair uma única isócrona (portanto, apenas uma &cutoffSec=
dada), precisaria ser adaptada para extrair várias - acho que com unnest()
a json_array_elements()
função (ou adicionando à?) A função
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;