الاسم
Reverse_Geocode — تأخذ نقطة geometry في نظام مرجعي مكاني معروف وتُعيد سجلًا يحتوي على مصفوفة من العناوين الممكنة نظريًا ومصفوفة من الشوارع المتقاطعة. إذا كانت include_strnum_range = true فإنها تُدرج نطاق أرقام الشارع في الشوارع المتقاطعة.
المختصر
record Reverse_Geocode(geometry pt, boolean include_strnum_range=false, geometry[] OUT intpt, norm_addy[] OUT addy, varchar[] OUT street);
الوصف
تأخذ نقطة geometry في نظام مرجعي معروف وتُعيد سجلًا يحتوي على مصفوفة من العناوين الممكنة نظريًا ومصفوفة من الشوارع المتقاطعة. إذا كانت include_strnum_range = true فإنها تُدرج نطاق أرقام الشارع في الشوارع المتقاطعة. القيمة الافتراضية لـ include_strnum_range هي false إذا لم تُمرَّر. تُرتَّب العناوين حسب الطريق الأقرب إلى النقطة، لذا فإن العنوان الأول هو الأرجح أن يكون الصحيح.
لماذا نقول عناوين نظرية بدلًا من عناوين فعلية؟ لا تحتوي بيانات Tiger على عناوين حقيقية، بل على نطاقات أرقام الشوارع فقط. ولذلك فإن العنوان النظري هو عنوان مُستكمَل (interpolated) بناءً على نطاقات الشارع. فعلى سبيل المثال، يُعيد استكمال أحد عناويني 26 Court St. و26 Court Sq.، مع أنه لا يوجد مكان اسمه 26 Court Sq. والسبب أن النقطة قد تقع عند زاوية شارعين، فيقوم المنطق بالاستكمال على طول الشارعين كليهما. كما يفترض المنطق أن العناوين متباعدة بالتساوي على طول الشارع، وهذا خطأ بالطبع، إذ قد يشغل مبنى بلدي جزءًا كبيرًا من نطاق الشارع بينما تتجمع بقية المباني في نهايته.
ملاحظة: تعتمد هذه الدالة على بيانات Tiger. فإذا لم تكن قد حمّلت بيانات تغطي منطقة هذه النقطة، فستحصل على سجل مملوء بقيم NULL.
عناصر السجل المُعاد هي كما يلي:
-
intptمصفوفة من النقاط: وهي نقاط خط المنتصف على الشارع الأقرب إلى النقطة المُدخلة. عدد النقاط يساوي عدد العناوين. -
addyمصفوفة من norm_addy (عناوين موحّدة): وهي مصفوفة من العناوين الممكنة التي تناسب النقطة المُدخلة. العنوان الأول في المصفوفة هو الأرجح. ينبغي عمومًا أن يكون هناك عنوان واحد فقط، إلا في حالة وقوع النقطة عند زاوية شارعين أو 3 شوارع، أو وقوعها في مكان ما على الطريق نفسه وليس إلى جانبه. -
streetمصفوفة من varchar: وهي الشوارع المتقاطعة (أو الشارع نفسه) (الشوارع التي تتقاطع أو الشارع الذي يُتوقَّع أن تقع عليه النقطة بعد إسقاطها).
حُسّنت في: 2.4.1 إذا حُمّلت مجموعة البيانات الاختيارية zcta5، يمكن للدالة reverse_geocode تحديد الولاية والرمز البريدي حتى لو لم تُحمَّل بيانات الولاية المحددة. راجع Loader_Generate_Nation_Script للاطلاع على تفاصيل تحميل بيانات zcta5.
متاحة منذ: 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، ونريد فقط العنوان الرئيسي وشارعين متقاطعين على الأكثر.
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