2012-09-24 11 views
10

मैं आपकी राय जानना चाहता हूं। मैंने एक एप्लिकेशन बनाया, जहां उपयोगकर्ता मार्ग बनाते हैं और हम इस मार्ग को ट्रैक करते हैं और डेटाबेस में सभी तरह से बिंदुओं को सहेजते हैं। फिर, एप्लिकेशन उपयोगकर्ताओं के तरीके से तुलना करता है।मार्ग बिंदुओं को बचाने और तुलना करने के लिए सबसे प्रभावी तरीका है?

वर्तमान में, मैं MSSQL सर्वर का उपयोग करता हूं, दो तालिकाओं का उपयोग करके, रूट्स के लिए एक और दूसरा रास्ता बिंदु (स्थानिक डेटा प्रकार के साथ) संग्रहीत करने के लिए। एसक्यूएल सर्वर भौगोलिक कार्यों जैसे st_distance का उपयोग कर संग्रहित प्रक्रिया में तुलना की जाती है ...

मैंने अन्य विकल्पों की जांच की है। एक जिसे मैंने कार्यान्वित किया है वह वस्तुओं का उपयोग कर ओरेकल 11 जी के साथ है। मैं केवल एक ऑब्जेक्ट टेबल में सभी डेटा स्टोर करता हूं, और जिस तरह से अक्षांश अक्षांश और देशांतर गुणों के साथ एक प्रकार के वररे में संग्रहीत किया जाता है। इस तरह डेटा को बहुत ही कुशल बचत और पुनर्प्राप्त करना है, लेकिन तुलना करते समय कुछ जटिल हो जाता है।

मैं NoSQL समाधान, कुछ एल्गोरिदम या इस कुशलतापूर्वक करने के लिए विधि की तलाश में हूं। तुम क्या सोचते हो?

+0

क्या मेरा उत्तर आपकी मदद करता है? –

+0

हां, इससे मदद मिली, धन्यवाद! मुझे लगता है कि समाधान जानकारी संग्रहीत करने के तरीके में नहीं है, लेकिन एल्गोरिदम में मार्ग बिंदुओं की तुलना करने के लिए। ऐसा करने के लिए मुझे सबसे पहले प्रासंगिक मार्गों की संख्या को कम से कम प्रासंगिक और वर्दी वाले लोगों को कम करना होगा जो अन्य मार्गों से मेल खाते हैं और फिर तुलना करें (जैसे आपके उत्तर राज्य)। मैंने वास्तव में इसका परीक्षण नहीं किया है, अगर यह बेहतर प्रदर्शन के साथ परिणाम देता है तो मैं अपना समाधान पोस्ट करूंगा। –

उत्तर

15

सभी एन रिकॉर्ड्स के लिए STDistance जैसे डेटाबेस फ़ंक्शंस का उपयोग करना उपोपयोगी है। आपका सीपीयू ओवरहेड तेजी से बढ़ेगा।

आपको क्या करना चाहिए वर्तमान खोजकर्ता के चारों ओर एक आयताकार के भीतर बिंदुओं की मात्रा की जांच करना है। यहाँ एक उदाहरण (MySQL में) है:

SELECT * FROM `points` 
    WHERE `latitude` >= X1 AND `latitude` <= X2 
    AND `longitude` >= Y1 AND `longitude` <= Y2 

यह प्रदान करता है अंक का एक कम superset कि फिर आगे orthodromic दूरी (पृथ्वी की वक्रता के संबंध में) की गणना के द्वारा कम किया जाना चाहिए Haversine formula का उपयोग कर।

latitude और longitude पर एक composite index स्थापित करने के लिए मत भूलना।

Orthodromic distance

यहाँ यह PHP में है:

<?php 
function haversine($latitude1, $longitude1, 
        $latitude2, $longitude2, $unit = 'Mi') { 
    $theta = $longitude1 - $longitude2; 
    $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + 
    (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta))); 
    $distance = acos($distance); 
    $distance = rad2deg($distance); 
    $distance = $distance * 60 * 1.1515; 
    switch ($unit) { 
    case 'Mi': 
     break; 
    case 'Km': 
     $distance = $distance * 1.609344; 
    } 
    return (round($distance, 2)); 
} 
?> 

सारांश यह है:

Example with CN Tower

:

यहाँ एक उदाहरण छवि को दर्शाता हुआ कि क्या करना है 10

लाल खोज को छोड़कर, पहली खोज में superset निर्धारित करने के लिए बाउंडिंग बॉक्स टकराव खोज (MySQL उदाहरण) शामिल होगी। दूसरी सत्यापन प्रक्रिया में यह गणना शामिल होगी कि क्या अंक हावर्सिन फॉर्मूला (PHP उदाहरण) के साथ उचित ऑर्थोड्रोमिक दूरी के भीतर हैं और subset (काले बिंदुओं से बना) ले रहे हैं।

+0

आपके उत्तर के लिए धन्यवाद, मैं इस विचार को लागू करने के समाधान के बारे में सोचने जा रहा हूं!मुझे इस समाधान के साथ चिंता है, मुझे लगता है कि यह उन बिंदुओं के लिए ठीक काम करता है जो बहुत करीब हैं, जब हम बड़ी दूरी के बारे में बात कर रहे हैं, तो अंक एक बड़े क्षेत्र में फैले हुए हैं, यह जटिल हो जाता है क्योंकि यह मेरे लिए काम नहीं करता है एक बहुत बड़ा आयताकार, मार्गों के बीच मैच मानदंड अधिक सटीक होना चाहिए। धन्यवाद! –

+0

कोई समस्या नहीं, आपके एल्गोरिदम के साथ शुभकामनाएं। –

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

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