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 Sq.が存在しないにもかかわらず、26 Court St. と 26 Court Sq.が返る、といったことがあります。これは、ポイントが二つのストリートの角にあるのが原因で、両方のストリートに沿って補間を行うためです。住所はストリートに沿って等間隔になっていると仮定しています。非常に多くの番地範囲を取ってしまっている自治体の建物があり、他の建物がストリートの終わりにかたまっているため、ストリートの方向が悪いです。
ご注意: この関数はTigerデータに依存しています。指定した点を含む領域のデータが無い場合には、NULLで満たされた一つのレコードが返されます。
返されるレコードの要素は次の通りです。
intpt
ポイント配列: 入力ポイントに最も近いストリートの中心線のポイントです。住所と同じだけポイントがあります。
addy
norm_addy (正規化された住所)の配列: 入力ポイントに合わせた、可能性のある住所の配列です。最初の要素が最も可能性が高いものです。一般的に、一つだけになるべきですが、ポイントが二つか三つのストリートの角にあったり、ポイントが道路上のどこかにあって側線から離れている場合には、数出現します。
street
varchar型の配列: 交差するストリート (ストリートがインタセクトする場合)または一つのストリート (指定したポイントが乗るストリートである場合)です。
Enhanced: 2.4.1 ZCTA5データセットを追加でロードする場合には、reverse_geocode関数は、特定の州データがロードされていなくても、州とZIPを解決することができます。ZTCA5データのロードに関する詳細についてはLoader_Generate_Nation_Scriptを参照して下さい。
Availability: 2.0.0
ストリートの角であって、かつ最も近くなる二つの点の例です。MIT (Massachusetts Ave, Cambridge, MA 02139 )に近い位置です。ストリートは三つはないですが、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からジオコーディングの例を再利用しています。主要な住所と、せいぜい二つの交差するストリートを求めているだけです。
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