Permintaan api sisa OpenTripPlanner

8

mengikuti tutorial ini saya membuat server yang berdiri sendiri OpenTripPlanner (versi 0.11.0). Ini bekerja dengan sangat baik

 http://localhost:8080/index.html

dan misalnya di

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

mengembalikan json rute.

Sekarang saya akan membuat permintaan api sisanya (saya menarik untuk Isochrone api). Saya mencoba mengembalikan geometri isochrone sebagai seperangkat poligon GeoJSON di url yang ditentukan pada tautan ini tetapi tidak berfungsi.

Bisakah Anda menyarankan url yang tepat untuk mendapatkan Isochrone GeoJSON?

franco_b
sumber

Jawaban:

4

Saya cukup banyak berada di kapal yang sama seperti Anda, tetapi saya pikir saya telah menemukan cara untuk membuat isochrone. Saya menggunakan versi 0.18.0, tidak yakin apakah itu relevan atau tidak.

Di sinilah saya menemukan contoh

Ini contoh isochrone yang saya dapat

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

Itu terlihat sangat intuitif, tetapi saya tidak berpikir dokumen yang saya temukan adalah yang terbaru sehingga saya tidak tahu bagaimana cara mengubah isochrone kecuali dengan cara sederhana. Semoga ini bermanfaat.

Ravi Mehta
sumber
2

Saya percaya sangat penting versi OTP apa yang Anda gunakan karena para pengembang terus-menerus melakukan perubahan - Saya baru saja menggali ke dalam v0.19 dan di bawah ini adalah dua contoh pembungkus yang sedang dalam proses memanggil API OTP dengan isochrone API.

@Ravi telah memberi Anda panggilan URL untuk API isochrone, jika itu tidak berfungsi ketika Anda memperbarui Lat / Lon untuk area Anda dan memasukkannya di browser Anda setelah meluncurkan OTP kemudian kembali ke dasar - dasar dan pastikan instance Anda OTP works - perhatikan respons OTP terhadap URL akan berbeda jika Anda menyertakan --analystbendera (mengembalikan GeoJSON) atau tidak (mengembalikan sebuah shapefile) saat meluncurkan OTP. Saya menambahkan beberapa tautan yang telah membantu saya ke pos @ Ravi tentang tutorial OTP.

Dalam hal menggunakan respons di bawah ini ada dua opsi yang mudah-mudahan bermanfaat.

Pertama, inilah fungsi Python menuju ke arah yang sama dengan query SQL di bawah ini (perhatikan, itu hanya menulis GeoJSON yang kembali karena saya belum mengambil waktu untuk mengekstrak / membaca respons dengan Python) - Saya membayangkan beberapa variasi dari ini adalah apa yang Anda butuhkan untuk web-mapping (jelas tergantung pada apa bahasa analisis situs Anda dalam, kira itu akan lebih mudah dalam javascript), tapi saya belum melihat contoh-contoh (FYI terlihat seperti ada adalah sebuah web situs yang menggunakan OTP untuk membuat isochrones)

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

Sebagai alternatif, jika Anda merasa nyaman dengan PostGIS, inilah pendekatan yang saya gunakan kemarin, perhatikan bahwa memerlukan ekstensi HTTP Paul Ramsey untuk diinstal pada database Anda dan saya hanya menguji ini pada (9.5) PostgreSQL terbaru dengan PostGIS 2.2. Juga perhatikan ini hanya dimaksudkan untuk mengekstrak isochrone tunggal (jadi hanya satu yang &cutoffSec=diberikan), perlu disesuaikan untuk mengekstrak beberapa - saya pikir dengan unnest()menggantikan (atau menambah?) json_array_elements()Fungsi

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
sumber