名稱

Reverse_Geocode — 接受已知空間參考系統中的幾何點,並返回一個記錄,其中包含理論上可能的地址數組和交叉街道數組。如果 include_strnum_range = true,則在交叉街道中包含街道範圍。

概要

record Reverse_Geocode(geometry pt, boolean include_strnum_range=false, geometry[] OUT intpt, norm_addy[] OUT addy, varchar[] OUT street);

描述

接受已知空間參考系統中的幾何點,並返回一個記錄,其中包含理論上可能的地址數組和交叉街道數組。如果 include_strnum_range = true,則在交叉街道中包含街道範圍。如果未傳入 include_strnum_range,則預設為 false。地址根據點最靠近哪條道路排序,因此第一個地址最有可能正確。

為什麼我們說「理論上的」地址而不是「實際的」地址?Tiger 數據沒有真實的地址,只有街道範圍。因此,理論地址是基於街道範圍內插的地址。例如,內插我的其中一個地址會返回「26 Court St.」和「26 Court Sq.」,儘管沒有「26 Court Sq.」這個地方。這是因為一個點可能位於兩條街道的拐角處,因此邏輯會沿著兩條街道內插。該邏輯還假設地址沿著街道均勻間隔,當然這是錯誤的,因為你可能會有一個市政建築佔據了街道範圍的很大一部分,而其餘建築物則聚集在末端。

注意:嗯,此函數依賴於 Tiger 數據。如果你沒有載入涵蓋此點區域的數據,那麼嗯,你會得到一個充滿 NULL 的記錄。

記錄的返回元素如下:

  1. intpt 是一個點數組:這些是街道上最靠近輸入點的中心線點。點的數量與地址數量相同。

  2. addy 是一個 norm_addy (正規化地址) 數組:這些是符合輸入點的可能地址數組。數組中的第一個最有可能。通常應該只有一個,除非點位於 2 或 3 條街道的拐角處,或者該點位於道路上的某個位置而不是側邊。

  3. street 是一個 varchar 數組:這些是交叉街道(或街道)(與點投影到的街道相交或位於其上的街道)。

增強功能:2.4.1 如果載入了可選的 zcta5 數據集,即使沒有載入特定州的數據,reverse_geocode 函數也可以解析到州和郵遞區號。有關載入 zcta5 數據的詳細資訊,請參閱 Loader_Generate_Nation_Script

可用性:2.0.0

範例

一個位於兩條街道拐角處,但最靠近其中一條街道的點的範例。這是 MIT 的大致位置:77 Massachusetts Ave, Cambridge, MA 02139。請注意,儘管我們沒有 3 條街道,PostgreSQL 也只會為超出我們上限的條目返回 null,因此可以安全使用。這包含街道範圍

SELECT pprint_addy(r.addy[1]) As st1, pprint_addy(r.addy[2]) As st2, pprint_addy(r.addy[3]) As st3,
            array_to_string(r.street, ',') As cross_streets
        FROM reverse_geocode(ST_GeomFromText('POINT(-71.093902 42.359446)',4269),true) As r;

 result
 ------
      st1                                  | st2 | st3 |               cross_streets
-------------------------------------------+-----+-----+----------------------------------------------
 67 Massachusetts Ave, Cambridge, MA 02139 |     |     | 67 - 127 Massachusetts Ave,32 - 88 Vassar St

在這裡,我們選擇不包含交叉街道的地址範圍,並選擇了一個非常非常靠近 2 條街道拐角的位置,因此可能會被兩個不同的地址知道。

SELECT pprint_addy(r.addy[1]) As st1, pprint_addy(r.addy[2]) As st2,
pprint_addy(r.addy[3]) As st3, array_to_string(r.street, ',') As cross_str
FROM reverse_geocode(ST_GeomFromText('POINT(-71.06941 42.34225)',4269)) As r;

result
--------
               st1               |               st2               | st3 | cross_str
---------------------------------+---------------------------------+-----+------------------------
 5 Bradford St, Boston, MA 02118 | 49 Waltham St, Boston, MA 02118 |     | Waltham St

對於這個範例,我們重用了 Geocode 中的地理編碼範例,我們只想要主要地址,最多 2 條交叉街道。

SELECT actual_addr, lon, lat, pprint_addy((rg).addy[1]) As int_addr1,
    (rg).street[1] As cross1, (rg).street[2] As cross2
FROM (SELECT address As actual_addr, lon, lat,
    reverse_geocode( ST_SetSRID(ST_Point(lon,lat),4326) ) As rg
    FROM addresses_to_geocode WHERE rating > -1) As foo;

                     actual_addr                     |    lon    |   lat    |                 int_addr1                 |     cross1      |   cross2
-----------------------------------------------------+-----------+----------+-------------------------------------------+-----------------+------------
 529 Main Street, Boston MA, 02129                   | -71.07181 | 42.38359 | 527 Main St, Boston, MA 02129             | Medford St      |
 77 Massachusetts Avenue, Cambridge, MA 02139        | -71.09428 | 42.35988 | 77 Massachusetts Ave, Cambridge, MA 02139 | Vassar St       |
 26 Capen Street, Medford, MA                        | -71.12377 | 42.41101 | 9 Edison Ave, Medford, MA 02155           | Capen St        | Tesla Ave
 124 Mount Auburn St, Cambridge, Massachusetts 02138 | -71.12304 | 42.37328 | 3 University Rd, Cambridge, MA 02138      | Mount Auburn St |
 950 Main Street, Worcester, MA 01610                | -71.82368 | 42.24956 | 3 Maywood St, Worcester, MA 01603         | Main St         | Maywood Pl