Je réponds à ma propre question avec une requête proposée.
select *, ABS(x_permit-x_station)+ABS(y_permit-y_station) as manhattan FROM (SELECT
longname AS NAME,
lines AS metadata,
T .slug,
ST_Distance (
T .geom,
ST_Transform (P .geometry, 3435)
) AS distance,
ST_X(ST_Transform(p.geometry, 3435)) as x_permit,
ST_Y(ST_Transform(p.geometry, 3435)) as y_permit,
ST_X(t.geom) as x_station,
ST_Y(t.geom) as y_station
FROM
permits P,
stations_cta T
WHERE
P .permit_ = '100533644'
ORDER BY
distance
LIMIT 2) as foo
Cela se traduit par ce qui suit avec certaines colonnes coupées:
Kedzie-Ravenswood Brown Line 3738.52830193659 3796.29623843171
Addison-O'Hare Blue Line 4105.37381385087 5790.20002649655
La première colonne numérotée est la distance (en pieds, car j'utilise EPSG 3435) calculée par la fonction ST_Distance PostGIS, et la deuxième colonne numérotée est le résultat de la formule de distance de Manhattan.
J'ai vérifié le deuxième résultat, obtenant la distance de marche de Google Maps entre la station CTA Addison Blue Line et le bâtiment au 3226 W Belle Plaine Ave (noté «100533644» dans la requête). Google Maps a généré un itinéraire de marche de 1,1 mile tandis que le résultat Postgres de 5790 pieds = 1,09 miles. La différence est acceptable à mes fins.