Je crois qu'il est très important de savoir quelle version d'OTP vous utilisez, car les développeurs apportent constamment des changements - je n'ai que récemment creusé dans la v0.19 et ci-dessous sont deux exemples de wrappers en cours de travail d'appeler l'API isochrone d'OTP avec lui.
@Ravi vous a déjà donné l'appel URL pour l'API isochrone, si cela ne fonctionne pas lorsque vous mettez à jour le Lat / Lon pour votre zone et l'entrez dans votre navigateur après avoir lancé OTP, puis revenez aux bases et assurez-vous que votre instance des travaux OTP - notez que la réponse d'OTP à l'URL sera différente si vous incluez l' --analyst
indicateur (renvoie GeoJSON) ou non (retourne un fichier de formes) lors du lancement d'OTP. J'ai ajouté une poignée de liens qui m'ont été utiles au post de @ Ravi sur les tutoriels OTP.
En termes d'utilisation de la réponse ci-dessous, deux options sont, espérons-le, utiles.
Tout d'abord, voici une fonction Python dirigée dans le même sens que la requête SQL ci-dessous (notez qu'elle écrit juste le GeoJSON de retour car je n'ai pas encore pris le temps d'extraire / lire la réponse en Python) - J'imagine une variante de cela est ce dont vous auriez besoin pour la cartographie Web (en fonction clairement de la langue dans laquelle l'analyse de votre site est, supposez que ce serait encore plus simple en javascript), mais je n'ai pas cherché d'exemples (FYI semble qu'il y ait un Web site qui a utilisé OTP pour créer des 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
Alternativement, si vous êtes à l'aise dans PostGIS, voici une approche sur laquelle j'ai travaillé hier, notez que cela nécessite que l' extension HTTP de Paul Ramsey soit installée sur votre base de données et que je n'ai testé cela que sur le PostgreSQL le plus récent (9.5) avec PostGIS 2.2. Notez également que cela ne vise qu'à extraire une seule isochrone (donc une seule &cutoffSec=
donnée), il faudrait l'adapter pour en extraire plusieurs - je pense avec unnest()
à la place (ou un ajout à?) La json_array_elements()
fonction
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;