PostGIS'de daire oluşturma?


22

PostGIS 1.5.2 kullanıyorum, geometrileri SRID: 900913. 600 kilometrelik yarıçapı olan merkez olarak bir nokta listesi kullanarak bir daire oluşturmam gerekiyor. Bu sorguyu kullanıyorum:

INSERT INTO circles (geom) (
   SELECT ST_Buffer(point, 600000, 'quad_segs=8') 
   FROM points
);

Ancak oluşturulan çevrelerin 600 kilometre yarıçapı yoktur (yarıçap bu uzunluğa yakındır, ancak tam olarak değildir).

PostGIS'te çevreler yaratmanın başka yöntemleri var mı?

NOT: Temsil edilen bilgiler İspanya'dandır. Doğru projeksiyon 4326'dır, ancak müşteri Google raster kullanmaktadır, bu nedenle yeniden yapılanmaları önlemek ve performansı artırmak için 900913’de veri depolarım.


1
600 km olmadığını bulmak için yarıçapı nasıl ölçtünüz?
underdark

1
@underdark İki şehir arasındaki mesafenin ve bu şehirlerden birinin merkezini kullanarak oluşturduğum dairenin diğer şehre uzanmadığını biliyorum. Gmap-pedometer.com
angelcervera


@underdark gmap-pedometer.com 'a 100km'den SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));fazla geri dönüş kullanıldığında , bu uzunluğu doğru olarak varsayarsam, daire yarıçapı mükemmel olur. Fakat insanlar ilk mesafeyi yarıçap olarak kullanırlar, st_distance tarafından döndürülen mesafeyi kullanmazlar. İlk mesafeyi ikincisine dönüştürmek mümkün mü?
angelcervera

Yanıtlar:


15

Bunu dene:

 SELECT ST_Transform(geometry( 
            ST_Buffer(geography( 
                ST_Transform( point, 4326 )), 
                600000)), 
            900913) FROM points`

Bu, coğrafyaya kayar, daha sonra, iyi bir düzlemsel tamponun çalıştığı geometriye geri dönmek için (ironik olarak) yerleşik SRID seçimini kullanır ve sonra geriye kayar. Mercator'daki yaklaşımınızın sorunu, Mercator'ın mesafeyi korumamasıdır. Daha uygun bir yerel projeksiyon kullanmak daha iyi sonuçlar verir ve yukarıdaki yöntemde olan budur.


4

Daha doğru bir daire elde etmek için quad_seg değerini artırabilirsiniz. Gerçek bir daire elde etmek için eğri bir geometri tipi ile çalışmak zorundasınız, ancak hangi yazılımı gösterebileceğini bilmiyorum.

90013 sridinin doğruluğu da çok kötü, çünkü tüm dünyayı kapsayan bir projeksiyon.

Yerel bir projeksiyon ile daha doğru bir sonuç alacaksınız.


@ nicklas-aven 600km mesafeden 100km fark mümkün mü? Çünkü 900913 projeksiyon kullanıyorum, 4326 kullanmıyorum?
angelcervera

1
Evet mümkün. Paul'ların , yanlışlıkların gis.stackexchange.com/questions/3264/… . Mesele şu ki 4326 öngörülmüyor.
Nicklas Avén

3

Çevrelerinizin nerede oluşturulduğuna bağlıdır. Ekvatorun yanında mı yoksa kutuplara mı yakın?

Bu haritaya bir göz atın . Antartica veya Grönland’ın gerçekten bu kadar büyük olduğunu mu düşünüyorsun? Kullandığınız projeksiyon bu, değil mi?

Bu USGS belgesini projeksiyonlarda , özellikle de aşağıdaki tabloda size hangi projeksiyonların neyin iyi olduğu konusunda hızlı bir fikir veren hızlı bir şekilde okumanızı tavsiye ederim .

Ve hepsinden sonra, nihayet sorunuza cevap vermeliyim :)

Nicklas'ın söylediği şey iyi bir tavsiyeydi. Yerel bölgeniz için daha iyi çalışacak belirli bir projeksiyon var mı?

Aksi takdirde, yeni PostGIS Coğrafya türüne bakmak isteyebilirsiniz . Bununla birlikte, en uygun cevap, verilerinizin bulunduğu yere bağlıdır.

GÜNCELLEME: Artık verilerinizin İspanya'da olduğunu biliyoruz, UTM Zone 31N gibi yerel bir projeksiyonda saklamayı , işlemlerinizi kullanarak ve ardından Google Web Mercator'a yansıtmayı düşündünüz mü?


1
Büyük alanları kapsayan haritalar için coğrafya türünü kullanmak için +1. Buradaki sorun postgis'de coğrafya türü için doğal tampon işlevi olmamasıdır. ancak, “en iyi srid” için dahili bir döküm var, tamponu oluşturduktan sonra 4326'ya geri dönüyor. Böylece verilerinizi bilmek ve bir srid'i seçmek daha iyi bir kontrol sağlıyor.
Nicklas Avén

Nicklas, oyuncu seçimi konusunda haklısın ve yerel projeksiyon hakkında% 100 sizinle aynı fikirdeyim (yani verilerinizi bilmek). Bununla birlikte, cevabı sadece “dünya çapında” bir veriye sahip olmak istiyorsa, IMHO, Coğrafya tipindeki döküm mantığı, SR'nin diğer belirli bir mesafe operasyonu için hangi SR'nin uygun olduğunu bulmak için daha iyi bir iş çıkartacaktır. karmaşık özel mantık. Coğrafya türüyle ilgili bir başka iyi şey, bir çok işlemin şu anda kartezyen matematiğe yapılmasına rağmen, işlemlerin küre matematiğini kullanmak için güncellenmeye devam etmesidir.
Ragi Yaser Burhum

2

Newish SQL / MM Part 3 geometri tipini CIRCULARSTRING ve / veya CURVEPOLYGON kullanabilirsiniz.

Bununla birlikte, bu tür desteğin hem iç işlevlerde hem de dış programlarda sınırlı olduğu konusunda uyarılmalıdır. Görselleştirmeye yardımcı olmak için ST_CurveToLine kullanabilirsiniz .

Ayrıca, bir biraz kapalı (PostGIS 2.0 svn arasında gibi) SELECT ST_Area('CURVEPOLYGON(CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1))'::geometry)yalnızca kaba bir yaklaşımdır tt . (3.14033115695475 ila 3.14159265358979'dan karşılaştırın pi()).


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.