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 的记录。
记录的返回元素如下:
intpt
是一个点数组:这些是街道上最接近输入点的中心线点。点的数量与地址的数量相同。
addy
是一个 norm_addy(标准化地址)数组:这些是适合输入点的可能地址数组。数组中的第一个地址最有可能正确。通常应该只有一个,除非点位于 2 条或 3 条街道的拐角处,或者点位于道路上的某个位置而不是偏离一侧。
street
是一个 varchar 数组:这些是交叉街道(或街道)(与点投影到的街道相交或为点的所在街道)。
增强功能:2.4.1 如果加载了可选的 zcta5 数据集,即使没有加载特定的州数据,reverse_geocode 函数也可以解析为州和邮政编码。有关加载 zcta5 数据的详细信息,请参阅 Loader_Generate_Nation_Script。
可用性:2.0.0
一个位于两条街道拐角处但最接近其中一条街道的点的示例。这是麻省理工学院的大概位置: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