PostGIS'de sınırlayıcı kutu sorgusu gerçekleştiriliyor mu? [kapalı]


22

coordinatesFormda uzun bir lat alanı olan neredeyse 2 milyon satırlık bir PostgreSQL tablom var POINT(-73.4938 33.2405).

Bu alanda coğrafi bir endeks bulunduğunu varsayalım; rastgele bir sınırlama kutusundaki tüm satırları seçmenin en etkili ve en hızlı yolu nedir?

Kutu gibidir SW long-lat: -74.0042 40.7688, NE long-lat: -73.8809 40.7984.


Saklanan koordinatlarınız zaten uzun mu yoksa ızgara mı (X, Y)?
Martin F.

1
Basit matematik burada yapardı ... Eğer point.x, SW.x'ten daha büyük ve NE.x'ten daha küçük ve point.y, SW.y'den daha büyük ve aynı zamanda NE.y'den daha küçük ise, nokta aynı zamanda MBR. Mekansal sorgu kullanmaktan daha hızlı olup olmadığını bilmiyorum. Denemek ister misin?
Michal Zimmermann

@zimmi: O yok aslında devlet öğeleri bu vardır sadece noktaları; karmaşık geometriler olabilirler.
Martin F

Bunlar şunlardır rağmen sadece noktalar ;-). WINT olarak saklanan POINT (-73.4938 33.24059) şeklinde uzun süredir.
Avishai

Q’yu (ve A’mı) bu bilgiyi yansıtacak şekilde düzenledim. :-)
Martin F

Yanıtlar:


24

Verilen sınırlama kutusu sınırlarının depolanan koordinatlarla aynı mekansal referans sisteminde olduğunu ve hangi uzaysal operatörünün (kesişen veya içerdiği) ihtiyacınız olduğunu bildiğinizi varsayalım:

SELECT *
FROM   my_table
WHERE  coordinates 
    && -- intersects,  gets more rows  -- CHOOSE ONLY THE
    @ -- contained by, gets fewer rows -- ONE YOU NEED!
    ST_MakeEnvelope (
        xmin, ymin, -- bounding 
        xmax, ymax, -- box limits
        my_srid)

Alternatif olarak, "içerir" ("içerdiği" yerine) sesini tercih ederseniz, WHEREfıkra döndürülmelidir:

WHERE  ST_MakeEnvelope (...)
    ~ -- contains, gets same fewer rows 
    coordinates 

Not: (yukarıdaki OP tarafından yayınlandıktan sonra OP tarafından) kayıtların basit noktalar olduğu düşünülürse, fark "kesişen" ve "kontrol altında tutma" arasındaki tek noktalarını etkileyen, çok ince hale gelir kenarlarında sınırlayıcı kutusunun.


İyi bir noktaya değindin. Eğer gerçekten eğer bir harita işaretleyici görmek mümkün olmayacaktır çünkü iyi olmalı İçeren üzerine sınırda (yani, tarayıcı krom muhtemelen).
Avishai

What's the fastest ...?: OP
Magno C

Farkında olun: &&ve @poligon Geometri ile kesiştiği zaman işe görünmüyor. Bu durumda, kullanın ST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))veya alternatif olarakST_Contains
Alex

4
SELECT ST_Y(the_geom) AS latitude, ST_X(the_geom) as longitude
from units u where the_geom && ST_MakeEnvelope(left, bottom, right, top, 4326)

1
4326'nın SRID olduğunu söylemeye gerek yok.
Magno C

2

Görünüşe göre, yorum eklemek için yeterli puanım yok bu yüzden sadece "X> min_x ve x <max_x ve y> min_y ve y <max_y" ile karşılaştırılan matematiğe karşı hem ST_MakeEnvelope, hem de denedim. .. ortalama ST_MakeEnvelope 60ms aldı ve matematik karşılaştırması benim özel bbox sorguda 155ms aldı.

Öyleyse mekansal arama ST_MakeEnvelope matematik karşılaştırmasından daha hızlı olmalı!


1
Aslında, eğer doğru dizinleri yaratırsanız min_x, max_x, min_y ve max_y çok daha hızlı olacaktır. Çok büyük bir veri kümesine (3 milyondan fazla poligona) INDEXsahibim ve hem ST_MakeEnvelope hem de (ST_XMax, ST_XMin, ST_YMax, ST_YMin) üzerinden yaptım ve aradaki fark matematikten yana. Zarf kavşak 2 dakika sürdü (2 dakika, sadece Spatial indeksleme için 40s sadece ben
bıraktım
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.