Daha çox

Spatialite: həndəsələr üzrə məkan indeksi

Spatialite: həndəsələr üzrə məkan indeksi


Hal -hazırda sorğu optimallaşdırması üçün məkan giriş metodlarından istifadə etməyi öyrənirəm. Spatialite yemək kitabındakı nümunələri araşdırıram və burada ilişmişəm http://www.gaia-gis.it/gaia-sins/spatialite-cookbook/html/pp-adjacent.html

Dərsliyə görə, məsafələrinin <1 km -dən çox olduğu məskunlaşma yerlərini tapmaq üçün bu sorğunu etməliyik.

Pp1.name AS "PopulatedPlace #1", GeodesicLength (MakeLine (pp1.geometry, pp2.geometry)) AS "Məsafə (metr)", pp2.name AS "PopulatedPlace #2" dən populated_places AS pp1, populyasiya edilmiş yerlər AS pp2 WHERE GeodesicLength (MakeLine (pp1.geometry, pp2.geometry)) <1000.0 AND pp1.id <> pp2.id AND pp2.ROWID IN (idx_populated_places_geometry'den pkid SEÇİN RTreeDistWithin (ST_X (p_p1) həndəsə), 0.02)) SİFARİŞ 2;

RTree *** geocallback funksiyalarının artıq istifadə edilməməsi səbəbindən bir səhv atır. Bu barədə yeniləməni yoxladım və bu, virtual məkan indeksinin istifadəsi ilə əvəz olundu. Formanın alt sorğusundan istifadə etməliyik

SpatialIndex -dən ROWID SEÇİN f_table_name =  Və search_frame = 

Buna görə bunu sınadım

Pp1.name "PopulatedPlace #1", GeodesicLength (MakeLine (pp1.geometry, pp2.geometry)) AS "Məsafə (metr)", pp2.name AS "PopulatedPlace #2" dən məskunlaşmış yerlərdən AS pp1, məskunlaşmış yerlər AS pp2 HARADA GeodesicLength (MakeLine (pp1.geometry, pp2.geometry)) <1000.0 AND pp1.id <> pp2.id AND pp2.ROWID IN (SpatialIndex -dən ROWID SEÇİN f_table_name = 'populated_places' AND search_frame = ppD.geometry 2p1.geometry) ;

Və nəticə çox yanlış idi

PopulatedPlace # 1 məsafə (metr) PopulatedPlace # 2 Ariano 0.000000 Ariano Campolongo Maggiore 0.000000 Campolongo Maggiore Campolongo Maggiore 0.000000 Campolongo Maggiore Campolongo Maggiore 0.000000 Campolongo Maggiore Campolongo Maggiore 0.000000 Campolongo Maggiore Campolongo Maggiore 0.000000 Campolongo Maggiore Campolongo Maggiore 0.000000 Campolongo Maggiore Ariano 0.000000 Ariano

Aralarındakı məsafə <1km olan cütlükləri mənə verməmək. Səhv bir məkan indeksi alt sorğusu istifadə edirəm? Axtardığım şey, bir şərti təmin edən populated_places cədvəlinin bir sıra satırlarını əldə etmək üçün məkan indeksinin alt sorğusundan necə düzgün istifadə etməyimdir (yuxarıdakı nümunədə bir -birindən <1km aralıdakı cütlüklər)

Qeyd: populated_places.geometry POINT-2D və srid = 4236 tiplidir.

YENİLƏNİB: Bunu etdiyim halda:

Pp1.name AS "PopulatedPlace #1", GeodesicLength (MakeLine (pp1.geometry, pp2.geometry)) AS "Məsafə (metr)", pp2.name AS "PopulatedPlace #2" dən populated_places AS pp1, populyasiya edilmiş yerlər AS pp2 WHERE Geodezik Uzunluq (MakeLine (pp1.geometry, pp2.geometry)) <10000.0 VƏ s.1

Doğru nəticələr əldə edirəm, ancaq 10 km -dən az məsafələr üçün. Yanlış olan <1km məsafələr yoxdur kimi görünür.


Spatialite-in məkan indekslərini idarə etmə üsulu yemək kitabı yazıldıqdan sonra dəyişdi (indi bir neçə yaşı var) və R-Tree əvəzinə virtual məkan indeksindən istifadə edir. Düzəliş etdiyiniz bəyanat doğru olmağa yaxın idi, ancaq nöqtələri seçmək istədiyiniz məsafəni göstərmədiniz. Sizdə var idi:

WHERE f_table_name = 'populated_places' AND search_frame = pp1.geometry)

Hansı ki, yalnız üst -üstə düşən yerləri verəcək. Bunu sınayın:

WHERE f_table_name = 'populated_places' AND search_frame = tampon (pp1.geometry, 0.02))

Bütün yerləri bir -birindən 1000 metr aralıda almaq. Bunun ən təsirli yolunun olub -olmadığından əmin deyiləm - ancaq məlumat dəstində sınadım və işlədi. (Bu dərsliyi bir neçə il əvvəl etmişəm və hələ də məlumatların əlində idim). Çoxbucaqlılarla işləsəniz, axtarış çərçivəsi çoxbucağın həndəsəsinin məhdudlaşdırıcı qutusu olardı. Ancaq nöqtələrlə (və eyni təbəqədəki nöqtələrlə) işlədiyinizə görə, axtarış çərçivəsini, nöqtə ətrafındakı məsafəni göstərən bəzi girişlər verməlisiniz.


Videoya baxın: HENDESİ FİQURLARİ OYRENEK