2012-06-01 21 views
7

हाय मेरे पास कुछ स्थितित्मक डेटा के साथ विरासत डीबी है। फ़ील्ड केवल 0°25'30"S, 91°7'W जैसे स्ट्रिंग वाले टेक्स्ट फ़ील्ड हैं। क्या कोई तरीका है कि मैं इन्हें Decimal Latitude और Decimal Longitude के लिए दो फ़्लोटिंग पॉइंट नंबरों में परिवर्तित कर सकता हूं?पायथन - बैच जीपीएस पोजिशन को लैट लॉन डेसिमल में कनवर्ट करें

संपादित करें:

तो एक उदाहरण होगा: 0°25'30"S, 91°7'W ->0.425, 91.116667 जहां मूल एकल क्षेत्र स्थिति पैदावार दो तैरता है।

किसी भी मदद की बहुत सराहना की।

+0

क्या आपके द्वारा दी गई के लिए समन्वय इसी उत्पादन होगा। इसके अलावा, अक्षांश में 3 संख्यात्मक फ़ील्ड हैं, रेखांश 2 .. यह सामान्य है कि यह कैसे निर्दिष्ट किया गया है (और आपके डेटा में निरंतर)? अब तक तुमने क्या प्रयास किये हैं? – Levon

+0

तो मैं तैरने के लिए उत्पन्न करना चाहता हूं: '0 डिग्री 25'30" एस, 91 डिग्री 7'W' -> '0.425',' 91.116667'। ऐसा लगता है कि डेटा में मिनटों से संबंधित हो सकता है या नहीं। जहां वहां है कोई भी तो मैं यह मान सकते हैं 0. –

+0

देशांतर 180 W = -180 180 E = 180 अक्षांश 90 एन = 90 90 एस = -90 उदाहरण -0.425, -९१.११६६६७ देना चाहिए। 0 डिग्री खोज के द्वारा इस की जाँच करें उदाहरण के लिए Google मानचित्र में 25'30 "एस, 91 डिग्री 7'W। –

उत्तर

2

यह आपके इनपुट स्ट्रिंग को आपके अपेक्षित आउटपुट में परिवर्तित करता है। यह मिनट और सेकंड को मौजूद नहीं कर सकता है।

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

# -*- coding: latin-1 -*- 
import re 

PATTERN = re.compile(r"""(?P<lat_deg>\d+)°  # Latitude Degrees 
         (?:(?P<lat_min>\d+)')? # Latitude Minutes (Optional) 
         (?:(?P<lat_sec>\d+)")? # Latitude Seconds (Optional) 
         (?P<north_south>[NS]) # North or South 
         ,[ ] 
         (?P<lon_deg>\d+)°  # Longitude Degrees 
         (?:(?P<lon_min>\d+)')? # Longitude Minutes (Optional) 
         (?:(?P<lon_sec>\d+)")? # Longitude Seconds (Optional) 
         (?P<east_west>[EW]) # East or West 
         """, re.VERBOSE) 

LAT_FIELDS = ("lat_deg", "lat_min", "lat_sec") 
LON_FIELDS = ("lon_deg", "lon_min", "lon_sec") 

def parse_dms_string(s, out_type=float): 
    """ 
    Convert a string of the following form to a tuple of out_type latitude, longitude. 

    Example input: 
    0°25'30"S, 91°7'W 
    """ 
    values = PATTERN.match(s).groupdict() 

    return tuple(sum(out_type(values[field] or 0)/out_type(60 ** idx) for idx, field in enumerate(field_names)) for field_names in (LAT_FIELDS, LON_FIELDS)) 


INPUT = """0°25'30"S, 91°7'W""" 

print parse_dms_string(INPUT) # Prints: (0.42500000000000004, 91.11666666666666) 
+0

धन्यवाद। मुझे देखने दो कि मैं इसके साथ क्या कर सकता हूं। –

16

यह दृष्टिकोण सेकंड और मिनट अनुपस्थित जा रहा है के साथ सौदा कर सकते हैं और मुझे लगता है कि कम्पास दिशाओं सही ढंग से हैंडल:

# -*- coding: latin-1 -*- 

def conversion(old): 
    direction = {'N':1, 'S':-1, 'E': 1, 'W':-1} 
    new = old.replace(u'°',' ').replace('\'',' ').replace('"',' ') 
    new = new.split() 
    new_dir = new.pop() 
    new.extend([0,0,0]) 
    return (int(new[0])+int(new[1])/60.0+int(new[2])/3600.0) * direction[new_dir] 

lat, lon = u'''0°25'30"S, 91°7'W'''.split(', ') 
print conversion(lat), conversion(lon) 
#Output: 
0.425 91.1166666667 
+1

+1 मेरे सिर को चोट पहुंचाने के लिए नहीं .. "सरल जटिल से बेहतर है।" – Levon

+1

कोई regexes = +1। – Droogans

+0

और यदि सेकंड फ्लोट प्रारूप में है? – ratata

1

एक साधारण दृष्टिकोण (यह देखते हुए कि मैं सिर्फ आज नियमित अभिव्यक्ति के बारे में अपने आप को सिखाया की वजह से यह समस्या)। लापता क्षेत्रों और कंपास दिशाओं के साथ सौदा।

# -*- coding: latin-1 -*- 
import re 
s = """0°25'30"S, 91°7'W""" 

def compLat_Long(degs, mins, secs, comp_dir): 
    return (degs + (mins/60) + (secs/3600)) * comp_dir 

def extract_DegMinSec(data): 
    m = re.search(r'(\d+°)*(\d+\')*(\d+")*', data.strip()) 
    deg, mins, secs = [0.0 if m.group(i) is None else float(m.group(i)[:-1]) for i in range(1, 4)] 
    comp_dir = 1 if data[-1] in ('W', 'S') else -1 
    return deg, mins, secs, comp_dir 

s1, s2 = s.split(',') 
dms1 = extract_DegMinSec(s1) 
dms2 = extract_DegMinSec(s2) 
print('{:7.4f} {:7.4f}'.format(compLat_Long(*dms1), compLat_Long(*dms2))) 

पैदावार

0.4250 91.1167