Name

Reverse_Geocode — 获取已知空间参考系统中的几何点并返回一条记录,其中包含理论上可能的地址数组和交叉街道数组。 如果 include_strnum_range = true,则包括交叉街道中的街道范围。

Synopsis

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. 这样的地方。 这是因为一个点可能位于 2 条街道的拐角处,因此逻辑会沿着两条街道进行插值。 该逻辑还假设地址沿着街道均匀分布,这当然是错误的,因为您可以让市政建筑占据街道范围的很大一部分,而其余建筑物则聚集在末端。

注意:嗯,这个功能依赖于 Tiger 数据。 如果您还没有加载覆盖该点区域的数据,那么您将得到一条充满 NULL 的记录。

返回的记录元素如下:

  1. intpt 是一个点数组:这些是街道上最接近输入点的中心线点。 有多少个地址就有多少个点。

  2. addy 是一个norm_addy(规范化地址)数组:这些是适合输入点的可能地址数组。 数组中的第一个最有可能。 一般来说应该只有一个,除非某个点位于 2 或 3 条街道的拐角处,或者该点位于道路上的某个位置而不是在侧面。

  3. street varchar 数组:这些是交叉街道(或街道)(相交的街道或者是点投影所在的街道)。

增强:2.4.1 如果加载了可选的 zcta5 数据集,即使未加载特定的状态数据,reverse_geocode 函数也可以解析为状态和 zip。 有关加载 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

在这里,我们选择不包括十字路口的地址范围,并选择了一个非常靠近两条街道拐角处的位置,因此可以通过两个不同的地址来识别。

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