POINT (X, Y) और GeomFromText ("POINT (XY)") में क्या अंतर है?


17

मैं अपने MySQL डेटाबेस में कुछ ज्यामितीय पदों को संग्रहीत करना चाहता हूं। इसके लिए मैं POINT डेटाटाइप का उपयोग करता हूं। लगभग हर जगह मैंने पढ़ा कि फ़ंक्शन GeomFromTextका उपयोग तालिका में डेटा डालने के लिए किया जाना चाहिए।

हालांकि, मुझे पता चला कि POINT(X,Y)यह भी काम करता है। मुझे ऐसा कोई विवरण नहीं मिला जिसके GeomFromTextबजाय इसका उपयोग क्यों किया जाए POINT

उदाहरण के लिए मेरे पास निम्नलिखित सरल संबंध हैं:

CREATE TABLE Site (
    SiteID      BIGINT UNSIGNED,
    Position    POINT
);

और मैं निम्नलिखित दो वेरिएंट का उपयोग करके मान सम्मिलित कर सकता हूं:

INSERT INTO Site (
    1,
    GeomFromText( 'POINT(48.19976 16.45572)' )
);

INSERT INTO Site (
    2,
    POINT(48.19976, 16.45572)
);

जब मैं तालिका SELECT * FROM Siteदेखता हूं ( ) मैं स्थान के लिए एक ही बाइनरी बूँद देखता हूं, और जब मैं निर्देशांक SELECT *, AsText(Position) FROM Siteदेखता हूं (तो ) मैं भी समान मान देखता हूं।

तो GeomFromText का उपयोग क्यों किया जाना चाहिए? क्या इन दोनों वेरिएंट के बीच कोई (ज्ञात) प्रदर्शन अंतर है? यह MySQL के अलावा अन्य डेटाबेस सिस्टम में कैसे हल किया जाता है?


मुझे नहीं पता कि क्या कोई प्रदर्शन अंतर है (मुझे लगता है कि नहीं, लेकिन यह केवल एक अनुमान है)। लेकिन दूसरी तालिका से अक्षांश और देशांतर मान परिवर्तित करते समय दूसरा दृष्टिकोण सरल होगा। INSERT INTO Site (Position) SELECT POINT(latitude, longitude) FROM tmpसे ज्यादा सरल है...SELECT GeomFromText(CONCAT('POINT(',latitude,' ',longitude,')' )) ...
ypercubeᵀᴹ

मुझे निर्माण करने के लिए दूसरा संस्करण बहुत सरल लगता है, इसीलिए मैं सोच रहा हूं कि आमतौर पर पहले वाला लगभग हर जगह उपयोग किया जाता है जहां मैंने MySQL स्थानिक एक्सटेंशन का उपयोग किया है।
ComSubVie

मैंने सिर्फ दोनों वेरिएंट का उपयोग करके ऊपर (मेरे होस्ट पर) तालिका में 10.000.000 स्थान सम्मिलित करने का प्रयास किया और किसी भी औसत दर्जे के प्रदर्शन अंतर का पता नहीं लगाया।
ComSubVie

कृपया MySQL 8+ के प्रकाश में और पश्चात के
इवान कैरोल

जवाबों:


16

MySQL स्थानिक एक्सटेंशन से संबंधित दो अलग-अलग द्विआधारी प्रारूप हैं, मानकों से "प्रसिद्ध बाइनरी" (WKB) प्रारूप, और MySQL आंतरिक GEOMETRYडेटा प्रकार।

MySQL 5.1.35 से पहले, जैसे कार्यों POINT()ने MySQL के आंतरिक डेटा प्रकार को वापस नहीं किया; वे WKB लौटे ... तो उससे पहले, आपको यह करना था:

INSERT INTO t1 (pt_col) VALUES (GeomFromWKB(Point(1,2)));

लेकिन अब, आपके उदाहरण के अनुसार, यह काम करता है:

INSERT INTO t1 (pt_col) VALUES(Point(1,2));

डेवलपर्स के श्रेय के लिए, जब वे बदल गए Point()और इसी तरह के कार्यों (अधिक सान्द्रता से) GEOMETRYवस्तुओं को लौटाते हैं, तो उन्होंने अनुमति दी GeomFromWKB()और इसी तरह के कार्यों को वास्तव में इनपुट के रूप में WKB या MySQL ज्यामिति डेटा स्वीकार करते हैं, भले ही कार्यों को WKB को इनपुट के रूप में स्वीकार करने का इरादा हो।

तथ्य यह है कि 1 विधि नए सर्वरों पर (तकनीकी रूप से गलत होने के बावजूद) काम करती है और दूसरा तरीका MySQL से पहले बिल्कुल भी काम नहीं करता है। 5.1.35 आपको बता सकता है कि आपके द्वारा देखे गए दृष्टिकोण का उपयोग करके उदाहरण क्यों लिखे गए थे - पूरी तरह से मुद्दे से बचें। नहीं तो ... मुझे यहाँ कुछ नहीं मिला है।

समसामयिक और फिर पार्सिंग पाठ सहजता से धीमी और कार्यों की तुलना में अधिक त्रुटि-प्रवण लगता है जो उचित चरों को इनपुट के रूप में स्वीकार करता है, इसलिए मैं किसी भी कारण के बारे में नहीं सोच सकता हूँ कि संघटित तार को शिल्प करना और पाठ-आधारित कार्यों का उपयोग करना।

http://dev.mysql.com/doc/refman/5.1/en/creating-spatial-values.html#gis-wkb-functions

http://dev.mysql.com/doc/relnotes/mysql/5.1/en/news-5-1-35.html


1
धन्यवाद, दिलचस्प है कि यह केवल जारी किए गए नोटों में "फुटनोट" के रूप में उल्लिखित है और दस्तावेज में कहीं नहीं है। इसलिए मैं पाठ आधारित विधियों से दूर रहूँगा।
कॉमस्बवी

1
ऐसा क्यों है कि 5 साल बाद MySQL डॉक्स अभी भी डालने के बाद ST_GeomFromText () फ़ंक्शन का उपयोग करने के उदाहरण देते हैं? क्या यह उत्तर अभी भी प्रासंगिक है? यह भ्रामक .. का एक सा dev.mysql.com/doc/refman/5.7/en/populating-spatial-columns.html
मैट कीरन

1
@MattKieran WKB और WKT, भू-स्थानिक डेटा को व्यक्त करने के लिए मानकीकृत, खुले प्रारूप हैं। उदाहरण उनका उपयोग करते हैं क्योंकि मानक-उन्मुख भू-स्थानिक अनुप्रयोग पहले से ही इन प्रारूपों में डेटा रख सकते हैं, MySQL बाह्य ज्यामिति को एक ही तर्क के रूप में स्वीकार करने की अनुमति देता है ST_GeomFromText()और इसी तरह के रूपांतरण कार्यों के लिए बाहरी अनुप्रयोगों की आवश्यकता के बजाय मूल एसक्यूएल कार्यों का उपयोग करता है जो ज्यामिति वस्तुओं का निर्माण करते हैं, जो स्थानिक फ़ंक्शन संदर्भ में पाए जाते हैं । डॉक्स को बेहतर तरीके से व्यवस्थित किया जा सकता है।
माइकल - sqlbot 22

इसके अलावा @MattKieran यह उत्तर इस अर्थ में अभी भी प्रासंगिक है कि यह बताता है कि पुराने उदाहरणों को डॉक्स के संकेत के विपरीत क्यों लिखा जा सकता है, क्यों MySQL स्पष्ट प्रकार के बेमेल के साथ काम करता है जो फ़ंक्शन का उपयोग करके इस तरह से संकेत प्रतीत होता है। सभी तीन विधियाँ - मूल SQL फ़ंक्शंस, WKB (बाइनरी), या WKT (टेक्स्ट) - मान्य हैं। किसी भी अधिक की जरूरत नहीं है , WKB से मूल फ़ंक्शन रिटर्न मान को परिवर्तित कर रहा है , क्योंकि उनके वापसी प्रकार अब WKB नहीं हैं क्योंकि वे कई साल पहले थे।
माइकल - sqlbot

4

MySQL 8+

बाद के लिए केवल एक चीज जो इसे मायने रखती है

  • Point(X,Y)सटीकता के साथ संख्याओं के लिए एक निर्माता है और इसे तेजी से बनाने के लिए पहले पाठ को परिवर्तित करने की आवश्यकता नहीं है। यह RETURN A POINTया FAIL की गारंटी है । यदि आप इस तरह से सोचना चाहते हैं तो यह दृढ़ता से टाइप करता है।
  • अच्छी तरह से ज्ञात पाठ (WKT) निर्माता: ये हमेशा धीमे होते हैं , क्योंकि इन्हें अच्छी तरह से ज्ञात पाठ (WKT) को पार्स करने के लिए एक अतिरिक्त कदम की आवश्यकता होती है । पुराने संस्करणों में ध्यान दें यह ST_उपसर्ग के बिना पाया जा सकता है ; जहां उपलब्ध है, ST_उपसर्ग के साथ संस्करण का उपयोग करें । WKT-constructors का उपयोग केवल तभी करें जब आपका इनपुट पहले से ही प्रसिद्ध पाठ हो। यदि नहीं, तो Point(x,y)ऊपर दिए गए कंस्ट्रक्टर का उपयोग करें ।
    • ST_GeomFromText(wkt, srid)MySQL द्वारा समर्थित किसी भी स्थानिक प्रकार को वापस कर सकते हैं और WKT द्वारा प्रस्तुत किया जा सकता है। यदि आप इस तरह से सोचना चाहते हैं तो यह शिथिल टाइप करता है।
    • ST_PointFromText(wkt, srid)POINTजाने-माने पाठ से एक जोरदार-टाइप- अवरोधक।

स्पष्टता

इतिहास के पाठ को छोड़ दें, तो कभी नहीं GeomFromText(Point(x,y))। यह भयानक, असमर्थित और अनिर्दिष्ट है।


-1

GeomFromText या किसी अन्य * FromText फ़ंक्शन के साथ आप SRID निर्दिष्ट कर सकते हैं । मुझे नहीं लगता कि आप इसे अन्यथा कर सकते हैं।

PointFromText('POINT(lat lng)', 4326)

यह दूसरे तरीके के POINT(lng lat)बजाय अर्थातPOINT(lat lng)
ज़िशान

MySQL वैसे भी SRIDs का उपयोग नहीं करता है। तो यह बहुत बेकार है। यदि आपको SRID की आवश्यकता है, तो PostgreSQL / PostGIS पर माइग्रेट करें।
इवान कैरोल

1
MySQL 8 SRIDs का उपयोग करता है। वास्तव में, मैं एक MySQL DB के साथ परेशान हो रहा हूँ क्योंकि यह SRIDs की तुलना में 5.7 से 8 तक ठीक है।
cmoran92
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.