PostGIS'deki kısmi 3B özellikleri nasıl ele alırsınız?


10

Anket verilerinden kısmi 3B bilgiler içeren özelliklerimiz var.

En yaygın örnek, anketin yapıldığı belirli noktalarda yükseklik bilgilerini içeren bir yolu temsil eden bir 2D LineString olabilir. Diğer örnekler arasında çatı şekilleri - Bazı kilit noktaların bina planından belirlenmiş bir yüksekliğe sahip olduğu, ancak hepsinin değil bir MultiLineString.

PostGIS'i kullanarak, bu tür bilgileri, enterpolasyonlu bilgileri kaybetmeden veya oluşturmadan mümkün olduğunca erişilebilir tutmak için hangi veri modelini depolamanızı önerirsiniz?


Yüksekliği içeren bir yolu temsil eden 2D LineString - yani 3D - verileriniz için ST_Force_3D kullanın - postgis.refractions.net/documentation/manual-1.5SVN/…
Mapperz

0 z koordinatı doğru değil ve veri kaynağıyla aynı değeri temsil etmiyor. ST_Force_3D bizim için çalışmaz. Fikir, veri kaynağı ile veri tabanımız arasında doğru bir çift yönlü eşleme yapabilmektir.
işgal edildi muhtemelen

Yanıtlar:


2

Ölçülmeyen Z değerlerini olarak saklayabilirsiniz 'nan'::float8. Örneğin:

SELECT ST_AsText(g), ST_X(g), ST_Y(g), ST_Z(g), ST_Z(g) <> 'nan'::float8 AS has_z
FROM (
  SELECT ST_MakePoint(1, 2, 'nan'::float8) AS g
  UNION SELECT ST_MakePoint(4, 5, 6) AS g
) AS f;

       st_astext       | st_x | st_y | st_z | has_z
-----------------------+------+------+------+-------
 POINT Z (1 2 1.#QNAN) |    1 |    2 |  NaN | f
 POINT Z (4 5 6)       |    4 |    5 |    6 | t
(2 rows)

Ancak, NaN değerleri yazılım geliştiricileri tarafından her zaman test edilmediğinden veya işlenmediğinden, bu durum sizi rahatsız edebilir. Örneğin, PostGIS yukarıdakilerin WKT sürümünü ayrıştıramıyor

SELECT 'POINT Z (1 2 1.#QNAN)'::geometry;

ERROR:  parse error - invalid geometry
LINE 1: SELECT 'POINT Z (1 2 1.#QNAN)'::geometry;
               ^
HINT:  "POINT Z (1 2 1.#Q" <-- parse error at position 17 within geometry

1

Üç sıralı (üçlü) değerlere sahip linestlerin tepe noktalarını tutmak için üç boyutlu ikincil bir geometri sütunu oluşturun. Bu şemanın çalışması için aşağıdaki varsayımlar varsayılmıştır:

  • linestring geçerlidir, yinelenen noktalar içermez
  • geometriler linestringlerdir
  • ikincil bir geometri sütununda saklanabilmesi için belirli bir geometriye 3B koordinatları olan en az iki tepe noktası olmalıdır
  • bir tetikleyici, ACID değerini korumak için ikincil geometri sütununu dolduracaktır.

Geçerli olan geometri, zincirlerde yinelenen noktalara izin vermeyecek ve kendiliğinden kesişme olmayacak kadar yeterli olmalıdır. Böylece her koordinat, kaynak geometrisindeki tepe noktasını tanımlamak için primery anahtarı gibi davranacaktır.

Bu ilişkisel modelden de doğrudur:

  • hiçbir azalma olmayacak, bilgi içermeyen tepe noktası ikincil geometri sütununda görünmüyordu
  • kaynak verilerdeki değişiklikler tetikleyici tarafından türetilmiş verilere yayılacaktır.
  • sadece gerçek olduğu düşünülen bilgiler veritabanında saklanır, yapay veriler oluşturulmaz.

Çok satırlı durum için işler biraz daha zor olabilir, çünkü şimdi kompozit birincil anahtar içeren ek bir tabloya sahip olmalıdır:

  • kaynak geometrisinin satır kimliği (gid, benzersiz bir tanımlayıcı)
  • verilen MultiGeometri içindeki [1-N] aralığının içinde kontrol edilmesi gereken geometriN konumu
  • ilgili tablo rowid (gid) için bir yabancı anahtar
  • aralığın geçerli olduğundan emin olmak için bir tetikleme / kontrol fonksiyonu

Yukarıdaki birincil anahtar, belirli bir geometri için kopya geometri indekslerinin eklenmesini önleyecektir. Tetikleyici / kontrol geçersiz dizinleri engelleyecektir. Ayrıca buradaki satırlar yabancı anahtar verilen kaynak verilerden olmalıdır. Önceki tüm kurallar geçerlidir.

Bir sadeleştirme, ek sütun üzerinde kullanılması, ancak tür geometrisinin değil, dizi olarak bildirilen aynı Z değeri türünün kullanılması olacaktır.

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.