OpenTripPlanner restante da solicitação da API

8

seguindo este tutorial , configurei um servidor autônomo OpenTripPlanner (versão 0.11.0). Funciona muito bem em

 http://localhost:8080/index.html

e por exemplo em

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

retorna uma rota json.

Agora eu faria o pedido da API de descanso (sou interessante para a Isochrone api). Tento retornar a geometria isócrona como um conjunto de polígonos GeoJSON no URL especificado neste link, mas não funciona.

Você pode sugerir o URL certo para obter o Isochrone GeoJSON?

franco_b
fonte

Respostas:

4

Estou praticamente no mesmo barco que você, mas acho que descobri como criar uma isócrona. Estou usando a versão 0.18.0, não tenho certeza se isso é relevante ou não.

Aqui é onde eu encontrei o exemplo

Aqui está uma amostra de isocrona que recebi

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, mas não acho que os documentos que encontrei estejam atualizados, por isso não faço ideia de como alterar a isócrona, exceto de maneiras simples. Espero que isso seja útil.

Ravi Mehta
fonte
2

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 --analystsinalizador (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;
claytonrsh
fonte