2010-06-16 6 views
5

मैं अपने आवेदन में स्थानों के लिए समर्थन में निर्मित करने की कोशिश कर रहा हूं और मैं उम्मीद करता हूं कि उपयोगकर्ता विभिन्न तरीकों से जीपीएस निर्देशांक इनपुट कर रहे हैं। मुझे नीचे दिए गए सभी को कनवर्ट करने की आवश्यकता है: अक्षांश - दिशा (एन/एस), degres, मिनट, सेकंड; देशांतर (ई/डब्ल्यू) - डिग्री, मिनट, सेकंड।विभिन्न स्वरूपों से PHP प्रारूप में जीपीएस अक्षांश/देशांतर (PHP में)

नोट, प्रत्येक उपयोगकर्ता इनपुट एक ही पंक्ति में होगा। मैं केवल एक ही तरह से इनपुट करने के लिए अपने उपयोगकर्ताओं को चाहते हैं, लेकिन निश्चित रूप से ppl निम्न में से एक के रूप में प्रवेश करेंगे ...:

जैसे: 9.182, -39,140625
9,182/-39,140625
9,182, -३९.१,४०,६२५
9,182 -39,140625
21 ° 16 '674S [some_separator] 27 ° 30' 318E
21 16 674S [some_separator] 27 30 318E

[some_separator] एक ही स्थान के रूप में अच्छी तरह से हो सकता है ...

अंतिम प्रारूप ब्यास की जरूरत है:
latitude.direction = दक्षिण
latitude.degrees = 21
latitude.minutes = 16
latitude.seconds = 674
longitude.direction = पूर्व
longitude.degrees = 27
longitude.minutes = 30
longitude.seconds = 318

(क) क्या इनपुट जीपीएस coordina को साधारण गैर तकनीक उपयोगकर्ताओं पूछने का सबसे आसान तरीका है ते?
(बी) मैं उपर्युक्त को अंतिम प्रारूप में कैसे परिवर्तित करूं? कोई भी अंतर्निहित फ़ंक्शंस जो डेटा इनपुट में इन भिन्नताओं को संभालता है?

मैंने GPS format in PHP देखा है - लेकिन मुझे एक और विविध इनपुट को संभालने की आवश्यकता है।

उत्तर

11

मैं इस के साथ काम कर रहा हूं (और मैंने देखा है कि आपने अपना प्रश्न संपादित किया है)।

ए) सामान्य गैर-तकनीकी उपयोगकर्ताओं को जीपीएस निर्देशांक इनपुट करने का सबसे आसान तरीका क्या है?

गैर-तकनीकी उपयोगकर्ताओं को विवरण दर्ज करने के लिए सबसे सरल, और सबसे उपयोगकर्ता अनुकूल फैशन Google मानचित्र का उपयोग करेगा। यह आपके इनपुट को पार्स करने के लिए Google Geocoder का उपयोग करने की अनुमति देगा (और अधिक मानकीकृत और स्वरूपित आउटपुट प्रदान करेगा)। इसके अलावा, यदि उपयोगकर्ता जो स्थान इनपुट कर रहा है वह उनका वर्तमान स्थान है, तो आप कुछ आधुनिक ब्राउज़रों द्वारा प्रदान की गई जिओलोकेशन कार्यक्षमता का उपयोग कर देख सकते हैं।

बी) मैं उपर्युक्त को अंतिम प्रारूप में कैसे परिवर्तित करूं? कोई भी अंतर्निहित फ़ंक्शंस जो डेटा इनपुट में इन भिन्नताओं को संभालता है?

अपने परीक्षण डेटा के आधार पर, मैंने इसे पार्स करने के लिए एक PHP नियमित अभिव्यक्ति तैयार की है और एक अनुमानित और मानकीकृत आउटपुट लौटा दिया है।

$rexp = '/^(\-?\d+(?:\.\d+)?)(?:\D+(\d+)\D+(\d+)([NS]?))?[^\d\-]+(\-?\d+(?:\.\d+)?)(?:\D+(\d+)\D+(\d+)([EW]?))?$/i'; 

$data = array(
    "21° 16' 674S, 27° 30' 318E" , 
    '21 16 674S, 27 30 318E' , 
    '9.182, -39.140625' , 
    '9.182/-39.140625' , 
    '9.182,-39.140625' , 
    '9.182 -39.140625' 
); 

foreach($data as $test) { 
    if(!preg_match($rexp , $test , $matches)) { 
    echo '<b>Failed</b>'; 
    } else { 
    // Match Found 
    } 
} 

आउटपुट:

array(
    [0] => Matched Text , 
    [1] => Full Degrees , 
    [2] => Minutes , 
    [3] => Seconds , 
    [4] => Hemisphere (N or S) , 
    [5] => Full Degrees , 
    [6] => Minutes , 
    [7] => Seconds , 
    [8] => Hemisphere (E or W) 
) 

उदाहरण:

// Matching 21° 16' 674S, 27° 30' 318E 
array(
    [0] => "21° 16' 674S, 27° 30' 318E" , 
    [1] => "21" , [2] => "16" , [3] => "674" , [4] => "S" , 
    [5] => "27" , [6] => "30" , [7] => "318" , [8] => "E" 
) 

// Matching 21 16 674S, 27 30 318E 
array(
    [0]=> "21 16 674S, 27 30 318E" , 
    [1]=> "21" , [2]=> "16" , [3]=> "674" , [4]=> "S" , 
    [5]=> "27" , [6]=> "30" , [7]=> "318" , [8]=> "E" 
) 

// Matching 9.182, -39.140625 
array(
    [0]=> "9.182, -39.140625" , 
    [1]=> "9.182" , [2]=> "" , [3]=> "" , [4]=> "" , 
    [5]=> "-39.140625" , [6]=> "" , [7]=> "" , [8]=> "" 
) 

// Matching 9.182/-39.140625 
array(
    [0]=> "9.182/-39.140625" , 
    [1]=> "9.182" , [2]=> "" , [3]=> "" , [4]=> "" , 
    [5]=> "-39.140625" , [6]=> "" , [7]=> "" , [8]=> "" 
) 

// Matching 9.182,-39.140625 
array(
    [0]=> "9.182,-39.140625" , 
    [1]=> "9.182" , [2]=> "" , [3]=> "" , [4]=> "" , 
    [5]=> "-39.140625" , [6]=> "" , [7]=> "" , [8]=> "" 
) 

// Matching 9.182 -39.140625 
array(
    [0]=> "9.182 -39.140625" , 
    [1]=> "9.182" , [2]=> "" , [3]=> "" , [4]=> "" , 
    [5]=> "-39.140625" , [6]=> "" , [7]=> "" , [8]=> "" 
) 

फिर आप बाद में, इस प्रक्रिया को नियमित अभिव्यक्ति के परिणाम, अक्षांश/देशांतर लिंक के लिए एक नाव तैयार कर सकते हैं तो :

// (Replacing the "Match Found" comment) 
    $latitude = $matches[1]+((int)$matches[2]/60)+((int)$matches[3]/3600)*(strtolower($matches[4])=='s'?-1:1); 
    $longitude = $matches[5]+((int)$matches[6]/60)+((int)$matches[7]/3600)*(strtolower($matches[8])=='w'?-1:1); 

जो उत्पादन करता है:

// Matching 21° 16' 674S, 27° 30' 318E 
$latitude = -21.4538888889 
$longitude = 27.5883333333 

// Matching 21 16 674S, 27 30 318E 
$latitude = -21.4538888889 
$longitude = 27.5883333333 

// Matching 9.182, -39.140625 
$latitude = 9.182 
$longitude = -39.140625 

// Matching 9.182/-39.140625 
$latitude = 9.182 
$longitude = -39.140625 

// Matching 9.182,-39.140625 
$latitude = 9.182 
$longitude = -39.140625 

// Matching 9.182 -39.140625 
$latitude = 9.182 
$longitude = -39.140625 
+0

लुकानोस को एक अद्भुत प्रयास के लिए बंद कर देता है ...! मैं अभी भी इसका परीक्षण कर रहा हूं लेकिन एक त्वरित रूप से मुझे यह देखने की ज़रूरत है कि मुझे क्या चाहिए !!! – Dave

+0

फ्लोट करने के लिए अनुवाद करते समय आप केवल अंतिम घटक पर -1 गुणा का उपयोग करते हैं। आपका कोड उत्तर में सूचीबद्ध शब्दों की तुलना में अलग-अलग परिणाम देता है, इसे ठीक करने के लिए आपको '$ अक्षांश = ($ मैचों [1] + ((int) $ मैचों [2]/60) में अनुवाद बदलने की आवश्यकता है (+ int) $ मैचों [3]/3600)) * (strtolower ($ मैचों [4]) == 'एस' - 1: 1); $ देशांतर = ($ मैचों [5] + ((int) $ मैचों [6]/60) + ((int) $ मैचों [7]/3600)) * (स्ट्रेटोलॉवर ($ मैचों [8]) == ' w '- 1: 1); ' – Kyborek

0
  1. विस्फोट() या preg_split() का उपयोग करके अक्षांश और देशांतर विभाजित करें।
  2. अक्षांश और देशांतर दोनों के लिए, यह निर्धारित करें कि इसे फ्लोट या मिनट के साथ दिया गया है या नहीं।
  3. डिग्री के मूल्य में कनवर्ट (नाव के रूप में)
1

मुझे लगता है कि सबसे अच्छा तरीका है, के रूप में ज्यादा संभव के रूप में उपयोगकर्ता इनपुट को प्रतिबंधित करने के लिए इतना है कि वे केवल मान्य डेटा दर्ज कर सकते हैं होगा। क्या आप प्रत्येक संभावित संभावना के लिए खाते की कोशिश करने के बजाय उपयोगकर्ता को आपके लिए टोकन में डेटा अलग करते हैं। उपयोगकर्ता को डेटा को सही तरीके से पॉप्युलेट करने के लिए मजबूर करने के लिए आवश्यकतानुसार कई टेक्स्टबॉक्स/ड्रॉप डाउन/आदि का उपयोग करें। मुझे लगता है कि आप & टेक्स्ट पार्सिंग की विविधता को कम करने के लिए वांछनीय होंगे।

उपयोगकर्ताओं को अपना डेटा किस प्रारूप में प्राप्त करता है? यदि यह केवल दशमलव अक्षांश/लंबा उदाहरण है (50.32,123.55) तो बस केवल दो संख्यात्मक इनपुट हैं जिन्हें वे भर सकते हैं, और संभवतः बॉक्स में एक उदाहरण मान शामिल कर सकते हैं। यदि उपयोगकर्ता अपना डेटा डिग्री/मिनट/दूसरे प्रारूप में प्राप्त करते हैं तो उनके पास वास्तव में इन फ़ील्ड हैं जिन्हें उन्हें प्रत्येक अक्षांश और देशांतर के लिए भरने की आवश्यकता है। यदि आप दशमलव & डिग्री दोनों प्रतिनिधित्वों के लिए अनुमति देते हैं तो इसे आपके सभी उपयोगकर्ताओं को कवर करना चाहिए।

पर्याप्त टोकन में डेटा को तोड़ने के लिए जितना आवश्यक हो उतना इनपुट है जो आपके प्रोग्राम में व्याख्या करते समय स्थिरता सुनिश्चित करता है!

संपादित करें: यदि आपको अपनी साइट के लिए स्वीकार्य लगता है तो एक मजेदार विचार होगा, जहां वह Google मानचित्र होगा जहां उपयोगकर्ता अपने वांछित स्थान पर मार्कर ड्रैग करेगा। फिर आप उस मार्कर से लगातार तरीके से जीपीएस निर्देशांक प्राप्त कर सकते हैं, और इसके लिए जो कुछ भी काम करने की आवश्यकता है उसका उपयोग करें!

0

आपकी सर्वश्रेष्ठ (लेकिन, स्वीकार्य रूप से, कम से कम गारंटीकृत) विधि उपयोगकर्ता व्यवहार को ड्राइव करने और उन्हें मानकीकृत और आसानी से पार्स किए गए प्रारूप में डेटा स्वरूपित करने का तरीका है। यहां तक ​​कि केवल एक या दो आसान मुख्य प्रारूपों को बदलने और उन्हें बदलने के लिए प्रोत्साहित करने के लिए एक उत्कृष्ट कदम होगा और आवश्यक त्रुटि सुधार/स्वरूपण की मात्रा को कम करेगा।

इसके अलावा, मैं सुझाव दूंगा कि नियमित अभिव्यक्तियां बनाना और उन रेगएक्सप्स के पीछे कार्य जो आप उपयोग करने जा रहे हैं, को मानकीकृत करने के लिए एक समाधान होगा।

मैंने आपके द्वारा प्रदान किए गए परीक्षण डेटा के खिलाफ कुछ RegExps चलाए हैं, लेकिन उस संबंध में बुलेटप्रूफ समाधान बनाने में समस्या हो रही है (ऐसा हो सकता है कि आपको प्रत्येक संयोजन को लेने के लिए कुछ अलग पैटर्न होने की आवश्यकता होगी)।

मैंने Google Geocoding API (जो आमतौर पर, काफी लचीला सिस्टम है, सादे पाठ पते के साथ-साथ कई लेट/लांग प्रारूपों के लिए अनुमति देता है) के माध्यम से प्रदान किए गए कुछ परीक्षण डेटा को पार्स करने का भी प्रयास किया है, लेकिन कोई खुशी नहीं है।

डेटा जितना अधिक मानक आ रहा है, सटीक जानकारी आने के लिए आसान है। शायद इनपुट चरण में एक मानचित्र (Google मानचित्र या अन्यथा) को एकीकृत करने से आप इनपुट को अधिक सटीक रूप से सत्यापित कर सकते हैं।

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