2009-08-17 12 views
5

मेरे पास एक स्थानिक रूप से सक्षम डेटाबेस (डीबी 2, इस मामले में) है। मुझे एक टेबल में बड़ी संख्या में वर्गों को स्टोर करने की आवश्यकता है। कौन सा मानक स्थानिक एसक्यूएल डेटाटाइप सबसे उपयुक्त है?स्थानिक एसक्यूएल: एक वर्ग के लिए सबसे उपयुक्त डेटाटाइप?

मुझे लगता है मैं एक ST_polygon इस्तेमाल कर सकते हैं लगता है, लेकिन शायद वहाँ एक और अधिक विशेष प्रकार है जो

  • बेहतर प्रदर्शन
  • बेहतर डेटा की गारंटी देता है देना होगा (मैं अगर एक त्रुटि के रूप में यह पकड़ने के लिए चाहते हैं किसी को जहां खास कॉलम में एक गैर वर्ग का मान संग्रहीत)

मैं एक ST_rectangle या ST_squar लगता है की कोशिश की है ई प्रकार, लेकिन वे मौजूद नहीं हैं (?)

जबकि मैं डीबी 2 के साथ काम कर रहा हूं, मैं उन समाधानों में भी रूचि रखता हूं जो डीबी 2 पर काम नहीं करते हैं, जब तक कि वे मानक-अनुरूप हों ।

उत्तर

1

डीबी 2 में यह एक बहुभुज भी है। ऐसा लगता है कि ग्रिड भंडारण कर रहे हैं, तो एक त्वरित जांच हो सकता है कि अगर ST_ENVELOPE (ज्यामिति) == ज्यामिति तो आप एक वर्ग

है यह कोड

DB2's documentation

SET CURRENT PATH = CURRENT PATH, db2gse; 
CREATE TABLE sample_geoms (id INTEGER, geometry ST_Geometry); 

INSERT INTO sample_geoms VALUES 
(1, ST_Geometry(ST_Point('point EMPTY',0))); 

INSERT INTO sample_geoms VALUES 
(2, ST_Geometry(ST_Point('point zm (10 10 16 30)' ,0))); 

INSERT INTO sample_geoms VALUES 
(3, ST_Geometry(ST_Multipoint('multipoint m (10 10 5, 50 10 6, 
     10 30 8)' ,0))); 

INSERT INTO sample_geoms VALUES 
(4, ST_Geometry(ST_Linestring('linestring (10 10, 20 10)',0))); 

INSERT INTO sample_geoms VALUES 
(5, ST_Geometry(ST_Polygon('polygon((40 120, 90 120, 90 150, 
     40 150, 40 120))',0))); 


SELECT id, CAST(ST_AsText(ST_Envelope(geometry)) as VARCHAR(160)) Envelope 
FROM sample_geoms; 

परिणाम से है:

ID   ENVELOPE 
----------- --------------------------------------------------------------- 
     1  - 

     2  POLYGON ((9 9, 11 9, 11 11, 9 11, 9 9)) 

     3  POLYGON ((10 10, 50 10, 50 30, 10 30, 10 10)) 

     4  POLYGON ((10 9, 20 9, 20 11, 10 11, 10 9)) 

     5  POLYGON ((40 120, 90 120, 90 150, 40 150, 40 120)) 

आईडी = 5 देखें? अंतिम पॉलीगॉन == ST_ENVELOPE (ज्यामिति)

1

आप ST_Envelope की तलाश कर रहे हैं - मुझे डीबी 2 के बारे में निश्चित जानकारी नहीं है लेकिन यह ओजीसी मानक का हिस्सा है। कोई भी गैर-लंबवत या गैर-क्षैतिज रेखा, या बहुभुज, इस फ़ंक्शन के माध्यम से एक आयताकार उत्पन्न करेगा, जो आमतौर पर फ्लोट के रूप में निर्देशांक संग्रहीत करेगा।

+1

जोड़ सकते हैं लेकिन ST_envolope, एक समारोह, नहीं एक प्रकार है जहाँ तक मैं देख सकता है? –

+0

क्षमा करें, मैंने अभी बहुत सारे बकवास बकवास हटा दिए हैं। अंक पोस्टगिस में फ्लोट 4 के अनुक्रम के रूप में संग्रहीत किए जाते हैं, डीबी 2 के बारे में निश्चित नहीं है, लेकिन यह लगभग समान होना चाहिए, या शायद डीबी 2/ओरेकल 'संख्या' प्रकारों में से एक होना चाहिए। मैं अनुमान लगा रहा हूं कि सभी आयतों को सामान्य स्थानिक प्रश्नों के लिए स्मार्ट इंडेक्सिंग के माध्यम से भू-कार्यक्षमता सक्षम करने के साथ कुछ बुनियादी फ्लोट प्रकार के रूप में संग्रहीत समन्वय होते हैं। – unmounted

+1

ट्रॉल्स सही है। ST_ENVELOPE एक ऐसा फ़ंक्शन है जो ST_POLYGON लौटाता है; ST_ENVELOPE एक प्रकार नहीं है। "फ्लोट" अनुकूलन PostGIS के लिए विशिष्ट है। –

4

भले ही आपका डेटा आयताकार या वर्ग का प्रतिनिधित्व करता हो, फिर भी आपको ST_POLYGON प्रकार का उपयोग करने की आवश्यकता होगी। हालांकि, जब आप डेटा के खिलाफ कोई क्वेरी करते हैं, तो आप ST_EnvIntersects जैसे पहले ऑर्डर फ़िल्टर का उपयोग कर सकते हैं।

आम तौर पर, एक स्थानिक डेटाबेस लिफाफे की तुलना करेगा (यानी एक आयताकार जिसमें बहुभुज होता है) एक चौराहे के लिए। फिर यह अधिक महंगा पॉलीगॉन-टू-पॉलीगॉन चौराहे की गणना करता है। इस मामले में, चूंकि आपके बहुभुज लिफाफे के बराबर हैं, इसलिए आप दूसरे और महंगे कदम को छोड़ सकते हैं।

जहाँ तक डेटा सत्यापन के रूप में, आप एक डेटाबेस ट्रिगर कि ST_EQUALS की जाँच करता है (ST_ENVELOPE (geom), geom) = 1.

संबंधित मुद्दे