Ich glaube, es ist sehr wichtig, welche OTP-Version Sie verwenden, da die Entwickler ständig Änderungen vornehmen. Ich habe mich erst kürzlich mit Version 0.19 befasst. Im Folgenden finden Sie zwei Beispiele für Work-in-Progress-Wrapper zum Aufrufen der Isochrone-API von OTP.
@Ravi hat Ihnen bereits den URL-Aufruf für die Isochrone-API gegeben. Wenn dies nicht funktioniert, wenn Sie Lat / Lon für Ihre Region aktualisieren und nach dem Start von OTP in Ihren Browser eingeben, kehren Sie zu den Grundlagen zurück und stellen Sie sicher, dass Ihre Instanz vorhanden ist von OTP funktioniert - Beachten Sie, dass die Antwort von OTP auf die URL unterschiedlich ist, wenn Sie --analyst
beim Starten von OTP das Flag (gibt GeoJSON zurück) oder nicht (gibt ein Shapefile zurück) einfügen. Ich habe eine Handvoll Links, die für mich hilfreich waren, zu @ Ravis Beitrag über OTP-Tutorials hinzugefügt .
In Bezug auf die Verwendung der Antwort unten sind zwei Optionen, die hoffentlich hilfreich sind.
Hier ist zunächst eine Python-Funktion, die in die gleiche Richtung wie die folgende SQL-Abfrage geht (beachten Sie, dass sie nur den zurückgegebenen GeoJSON ausschreibt, da ich mir noch nicht die Zeit genommen habe, die Antwort in Python zu extrahieren / zu lesen) - ich stelle mir eine Variation davon vor Dies ist das, was Sie für das Web-Mapping benötigen (je nachdem, in welcher Sprache die Analyse Ihrer Website vorliegt, ist es in Javascript wahrscheinlich noch einfacher), aber ich habe nicht nach Beispielen gesucht (zu Ihrer Information, es gab ein Web Site , die OTP zum Erstellen von Isochronen verwendet hat)
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
Wenn Sie sich mit PostGIS auskennen, ist dies ein Ansatz, den ich gestern angewendet habe. Beachten Sie, dass die HTTP-Erweiterung von Paul Ramsey in Ihrer Datenbank installiert sein muss. Ich habe dies nur auf dem neuesten (9.5) PostgreSQL mit PostGIS 2.2 getestet. Beachten Sie auch, dass dies nur dazu gedacht ist, eine einzelne Isochron zu extrahieren (also nur eine &cutoffSec=
gegeben). Es müsste angepasst werden, um mehrere zu extrahieren - ich denke mit unnest()
anstelle (oder zusätzlich zu?) Der json_array_elements()
Funktion
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;