الاسم
Geocode — تأخذ عنوانًا كسلسلة نصية (أو عنوانًا موحَّدًا آخر) وتُخرج مجموعة من المواقع المحتملة تتضمن شكلًا هندسيًا نقطيًا بخطَّي الطول والعرض وفق NAD 83، وعنوانًا موحَّدًا لكل موقع، والتقييم. كلما انخفض التقييم زادت احتمالية التطابق. تُرتَّب النتائج بدءًا بأدنى تقييم. ويمكن اختياريًا تمرير الحد الأقصى للنتائج، وقيمته الافتراضية 10، وrestrict_region (قيمته الافتراضية NULL)
المختصر
setof record geocode(varchar address, integer max_results=10, geometry restrict_region=NULL, norm_addy OUT addy, geometry OUT geomout, integer OUT rating);
setof record geocode(norm_addy in_addy, integer max_results=10, geometry restrict_region=NULL, norm_addy OUT addy, geometry OUT geomout, integer OUT rating);
الوصف
تأخذ عنوانًا كسلسلة نصية (أو عنوانًا موحَّدًا مسبقًا) وتُخرج مجموعة من المواقع المحتملة تتضمن شكلًا هندسيًا نقطيًا بخطَّي الطول والعرض وفق NAD 83، وnormalized_address (addy) لكل موقع، والتقييم. كلما انخفض التقييم زادت احتمالية التطابق. تُرتَّب النتائج بدءًا بأدنى تقييم. تستخدم بيانات Tiger (edges وfaces وaddr) ومطابقة السلاسل النصية التقريبية في PostgreSQL (soundex وlevenshtein) ودوال الاستيفاء الخطي في PostGIS لاستيفاء العنوان على امتداد حواف Tiger. كلما ارتفع التقييم قلّت احتمالية صحة الترميز الجغرافي. وتُزاح النقطة المُرمَّزة جغرافيًا افتراضيًا 10 أمتار عن خط المنتصف نحو جانب الشارع (يسار/يمين) الذي يقع عليه العنوان.
حُسّنت في: 2.0.0 لدعم بيانات Tiger 2010 المهيكلة، ونُقّح بعض المنطق لتحسين سرعة الترميز الجغرافي ودقته، ولإزاحة النقطة من خط المنتصف إلى جانب الشارع الذي يقع عليه العنوان. والمعامل الجديد max_results مفيد لتحديد عدد أفضل النتائج أو لإعادة أفضل نتيجة فقط.
أمثلة: أساسية
توقيتات الأمثلة أدناه مأخوذة على جهاز Windows 7 بمعالج واحد بتردد 3.0 GHZ وذاكرة RAM بسعة 2GB، يعمل عليه PostgreSQL 9.1rc1/PostGIS 2.0 مع تحميل جميع بيانات Tiger لولايات MA وMN وCA وRI.
المطابقات التامة أسرع في الحساب (61ms)
SELECT g.rating, ST_X(g.geomout) As lon, ST_Y(g.geomout) As lat,
(addy).address As stno, (addy).streetname As street,
(addy).streettypeabbrev As styp, (addy).location As city, (addy).stateabbrev As st,(addy).zip
FROM geocode('75 State Street, Boston MA 02109', 1) As g;
rating | lon | lat | stno | street | styp | city | st | zip
--------+-------------------+----------------+------+--------+------+--------+----+-------
0 | -71.0557505845646 | 42.35897920691 | 75 | State | St | Boston | MA | 02109
حتى إن لم يُمرَّر الرمز البريدي، يمكن للمُرمِّز الجغرافي تخمينه (استغرق نحو 122-150 ms)
SELECT g.rating, ST_AsText(ST_SnapToGrid(g.geomout,0.00001)) As wktlonlat,
(addy).address As stno, (addy).streetname As street,
(addy).streettypeabbrev As styp, (addy).location As city, (addy).stateabbrev As st,(addy).zip
FROM geocode('226 Hanover Street, Boston, MA',1) As g;
rating | wktlonlat | stno | street | styp | city | st | zip
--------+---------------------------+------+---------+------+--------+----+-------
1 | POINT(-71.05528 42.36316) | 226 | Hanover | St | Boston | MA | 02113
يمكنه التعامل مع الأخطاء الإملائية ويقدّم أكثر من حل محتمل مع تقييماتها، ويستغرق وقتًا أطول (500ms).
SELECT g.rating, ST_AsText(ST_SnapToGrid(g.geomout,0.00001)) As wktlonlat,
(addy).address As stno, (addy).streetname As street,
(addy).streettypeabbrev As styp, (addy).location As city, (addy).stateabbrev As st,(addy).zip
FROM geocode('31 - 37 Stewart Street, Boston, MA 02116',1) As g;
rating | wktlonlat | stno | street | styp | city | st | zip
--------+---------------------------+------+--------+------+--------+----+-------
70 | POINT(-71.06466 42.35114) | 31 | Stuart | St | Boston | MA | 02116
استخدامها لإجراء ترميز جغرافي دفعي للعناوين. الأسهل هو ضبط max_results=1. وعالِج فقط العناوين التي لم تُرمَّز جغرافيًا بعد (ليس لها تقييم).
CREATE TABLE addresses_to_geocode(addid serial PRIMARY KEY, address text,
lon numeric, lat numeric, new_address text, rating integer);
INSERT INTO addresses_to_geocode(address)
VALUES ('529 Main Street, Boston MA, 02129'),
('77 Massachusetts Avenue, Cambridge, MA 02139'),
('25 Wizard of Oz, Walaford, KS 99912323'),
('26 Capen Street, Medford, MA'),
('124 Mount Auburn St, Cambridge, Massachusetts 02138'),
('950 Main Street, Worcester, MA 01610');
-- only update the first 3 addresses (323-704 ms - there are caching and shared memory effects so first geocode you do is always slower) --
-- for large numbers of addresses you don't want to update all at once
-- since the whole geocode must commit at once
-- For this example we rejoin with LEFT JOIN
-- and set to rating to -1 rating if no match
-- to ensure we don't regeocode a bad address
UPDATE addresses_to_geocode
SET (rating, new_address, lon, lat)
= ( COALESCE(g.rating,-1), pprint_addy(g.addy),
ST_X(g.geomout)::numeric(8,5), ST_Y(g.geomout)::numeric(8,5) )
FROM (SELECT addid, address
FROM addresses_to_geocode
WHERE rating IS NULL ORDER BY addid LIMIT 3) As a
LEFT JOIN LATERAL geocode(a.address,1) As g ON true
WHERE a.addid = addresses_to_geocode.addid;
result
-----
Query returned successfully: 3 rows affected, 480 ms execution time.
SELECT * FROM addresses_to_geocode WHERE rating is not null;
addid | address | lon | lat | new_address | rating
-------+----------------------------------------------+-----------+----------+-------------------------------------------+--------
1 | 529 Main Street, Boston MA, 02129 | -71.07177 | 42.38357 | 529 Main St, Boston, MA 02129 | 0
2 | 77 Massachusetts Avenue, Cambridge, MA 02139 | -71.09396 | 42.35961 | 77 Massachusetts Ave, Cambridge, MA 02139 | 0
3 | 25 Wizard of Oz, Walaford, KS 99912323 | -97.92913 | 38.12717 | Willowbrook, KS 67502 | 108
(3 rows)
أمثلة: استخدام مرشّح هندسي
SELECT g.rating, ST_AsText(ST_SnapToGrid(g.geomout,0.00001)) As wktlonlat,
(addy).address As stno, (addy).streetname As street,
(addy).streettypeabbrev As styp,
(addy).location As city, (addy).stateabbrev As st,(addy).zip
FROM geocode('100 Federal Street, MA',
3,
(SELECT ST_Union(the_geom)
FROM place WHERE statefp = '25' AND name = 'Lynn')::geometry
) As g;
rating | wktlonlat | stno | street | styp | city | st | zip
--------+---------------------------+------+---------+------+------+----+-------
7 | POINT(-70.96796 42.4659) | 100 | Federal | St | Lynn | MA | 01905
16 | POINT(-70.96786 42.46853) | NULL | Federal | St | Lynn | MA | 01905
(2 rows)
Time: 622.939 ms
انظر أيضًا
Normalize_Address، Pprint_Addy، ST_AsText، ST_SnapToGrid، ST_X، ST_Y