ฉันกำลังตอบคำถามของตัวเองด้วยคำถามที่เสนอ
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
ซึ่งจะส่งผลต่อไปนี้โดยบางคอลัมน์ถูกตัดออก:
Kedzie-Ravenswood Brown Line 3738.52830193659 3796.29623843171
Addison-O'Hare Blue Line 4105.37381385087 5790.20002649655
คอลัมน์หมายเลขแรกคือระยะทาง (เป็นฟุตเพราะฉันใช้ EPSG 3435) คำนวณโดยฟังก์ชัน ST_Distance PostGIS และคอลัมน์ลำดับที่สองเป็นผลลัพธ์ของสูตรระยะทางแมนฮัตตัน
ฉันตรวจสอบผลลัพธ์ที่สองโดยรับระยะทางเดินจาก Google Maps ระหว่างสถานี CTA ของ Addison Blue Line และอาคารที่ 3226 W Belle Plaine Ave (บันทึกไว้เป็น '100533644' ในข้อความค้นหา) Google Maps แสดงเส้นทางเดินเป็นระยะทาง 1.1 ไมล์ในขณะที่ผลลัพธ์ของ Postgres 5,790 ฟุต = 1.09 ไมล์ ความแตกต่างเป็นที่ยอมรับได้สำหรับวัตถุประสงค์ของฉัน