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