Daha çox

PostGIS: Ünvan nömrəsindən bir ev nömrəsinin yaxınlaşdırılması


Kanada üçün əks-geokoder hazırlayıram. İndiyə qədər bir lat / lng verilmişsə, küçənin hər iki tərəfi üçün xətt seqmentinin istiqaməti və ünvan aralıqlarını özündə birləşdirən ən yaxın küçəni (xətt seqmenti) tapa bilərəm. İndi verilən lat / lng nöqtəsinə ən yaxın ev nömrəsini proqramlı şəkildə yaxınlaşdırmanın ən yaxşı yolunu tapmağa çalışıram.

Küçə məlumatlarını ehtiva edən bir sıra nümunəsi:

- [KAYD 1] - […] l_adddirfg | Eyni İstiqamət l_hnumf | 3219 l_hnuml | 3235 l_stname_c | Breen Road Şimal-qərb r_adddirfg | Eyni İstiqamət r_hnumf | 3224 r_hnuml | 3236 r_stname_c | Breen Road Şimal-qərb the_geom | 0105000020E610000001000000010200000002000000B0F6990E78885CC088DF2B5F3C8C49400875B39A89885CC0A0BCA6AC4B8C4940

Beləliklə, "the_geom" xətt seqmentinin yaxınlığında yerləşən bir lat / lng koordinatı verilərkən, bir şəxs görmə qabiliyyəti ilə küçənin hansı tərəfində olduğunu (sol və ya sağ tərəf) və seqment boyunca nə qədər olduğunu - bununla bir ev nömrəsini təqribən. Məsələn, nöqtə sağ tərəfdədirsə, küçənin dörddə üçü, r_hnumf (sağ tərəf, birinci nömrə) və r_hnuml (sağ, son nömrə) sahələrini istifadə edərdim ... Küçə ünvanı yəqin ki, yaxındır:

3232 Breen Road Şimal-qərb

Axtardığım bu, PostGIS-də (yeni olduğum üçün) hesablama / təxmini və ya sıra gətirildikdən sonra tətbiq qatında ən yaxşı təcrübədir.

Təşəkkürlər!


Çözüm tamamilə PostGIS-də qurula bilər.

Bir nöqtə (evin yeri, mən onu bir nöqtə kimi modelləşdirmişəm) və bir küçə seqmentini (bu nöqtəyə ən yaxın küçə, LİNESTRING kimi modelləşdirilmiş) nəzərə alaraq soruşursunuz:

  • Nöqtənin bir küçə seqmentinin solunda olduğunu necə izah etmək olar

Mümkün bir həll yolu küçə seqmentindəki evə ən yaxın nöqtəni təyin etmək və sonra bu nöqtənin evin solunda və ya sağında yerləşdiyini müəyyən etməkdir (operator)&<birinci həndəsə arqumenti üst-üstə düşürsə və ya ikinci həndəsə arqumentinin solundadırsa, doğru qayıdır).&<əslində məhdudlaşdırıcı qutularla işləyir, amma nöqtələrlə işlədiyimiz üçün bunun heç bir əhəmiyyəti olmamalıdır.

osm = # seçin 'POINT (4 1)' :: həndəsə & 
  • Küçə seqmentindəki ev nə qədər uzundur

Yenə də bu, küçə seqmentindəki evin ən yaxın nöqtəsindəki nöqtənin (0 ilə 1 arasında bir dəyər) nə qədər olduğuna çevrilir. Bunun üçün st_line_locate_point adlı daxili bir funksiyası var:

osm = # select st_line_locate_point ('LINESTRING (1 1,2 3,6 6)' :: həndəsə, 'POINT (2 1)' :: həndəsə); st_line_locate_point ---------------------- 0.0618033988749895 (1 sıra) osm = # seçin st_line_locate_point ('LINESTRING (1 1,2 3,6 6)' :: həndəsə , 'POINT (5 6)' :: həndəsə); st_line_locate_point ---------------------- 0.889442719099992 (1 sıra)


Http://www.postgis.org/documentation/manual-svn/ST_Line_Locate_Point.html saytına baxın

Səhifədəki nümunə mahiyyətcə sizin də etməyə çalışdığınız şeydir düşünürəm.