PostGIS ST_Buffer Yarıçapı Yardımı


9

Belirli bir noktanın beş mil yarıçapındaki tüm noktaları bulmaya çalışıyorum. Ben böyle bir sorgu var:

SELECT * FROM table WHERE ST_Contains(ST_Buffer(geomFromText('POINT(0 0)', 4326), ?), latlon)

?Beş mil almak için (yarıçap) ne koyduğumu anlayamıyorum. Her şey EPSG 4326'da ve PostGIS belgelerine göre (anlatabildiğim kadarıyla), yarıçapım metre olarak olmalı. 12,070,0 m (yaklaşık 5 mil) koyarsam, ülke çapında yarı yarıya maç alırım. Ne özlediğimi bilen var mı?


4326 dd'dir (ondalık derece). 12070, latlon olarak yansıtıldığında oldukça büyük bir alandır (yarıçap).
Brad Nesom

1
yanlış - 12 070 metre = 7.49995029 mil 5 mil 8046,72 metre yani (? = 8046,72) - veri coğrafya veya geometriniz mi?
Mapperz

Yanıtlar:


14

Verileriniz öngörülmediği için - bir küredeki noktalardır - doğrusal mesafeler bir anlam ifade etmez. Ekvatordaki beş mil, kutup dairesinde 5 milden çok daha küçük bir açıdır. Ama neyse ki PostGIS (> = 1.5) aradığınız cevaba sahiptir:

SELECT * FROM table WHERE ST_DWithin(ST_GeogFromText('SRID=4326;POINT(0,0)'), geography(latlon), 12070);

geographySadece bu tür şeyler için tasarlanmış bir türü vardır. Geometriye benzer, ancak sadece EPSG: 4326 kullanır ve onunla çalışan çok daha az işlev vardır.

Yukarıdaki örnekte , ilgi noktası üzerinde ST_GeogFromText () (ayrıca bir ST_GeographyFromText () var ve bir fark olup olmadığından emin değilim ) çağırdım ( SRID parametresi olduğu için düzenli WKT ile çalışabilir) ve latlon sütununu coğrafi konum türüne dökün. Bunların çoğunu yapıyorsanız, tablonuzda bir coğrafya sütunu oluşturmak ve oyuncu kadrosunu tamamen atlamak daha verimli olabilir. Son olarak, ST_DWithin () coğrafya parametrelerini alabilir ve doğrusal mesafelerde doğru olanı yapar.


Yardımı takdir ediyorum. PostGIS için hala oldukça yeniyim.
Nik

4

belki de bunun yerine ST_DWithin işlevini istersiniz. st_buffer belgesindeki nota bakın.
ST_Buffer

İnsanlar genellikle bu işlevi yarıçap aramaları yapmak için kullanma hatasını yaparlar. Özel alan arama için bir arabellek oluşturmak yavaş ve anlamsızdır. Kullanım ST_DWithin yerine.

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.