2014-11-12 7 views
6

मैंने शहर के नाम के साथ-साथ किसी भी भाग्य के साथ केवल पता वर्ग से राज्य संक्षेप प्राप्त करने की कोशिश करने में दो अलग-अलग तरीकों का प्रयास किया है। पहला ज़िप कोड के साथ "सीए 92055" जैसे राज्य को वापस कर रहा है, और दूसरा प्रयास पूर्ण राज्य का नाम देता है। इस के आसपास कोई त्वरित तरीका?getAdminArea() से राज्य संक्षेप प्राप्त करना;

प्रथम प्रयास है जो राज्य में समाप्त होता लौटने "सीए 92,055"

Geocoder geoCoder = new Geocoder(getActivity(), Locale.getDefault()); 
       List<Address> addresses; 
       try { 
        addresses = geoCoder.getFromLocation(mLatitude, mLongitude, 10); 
        int i=1; 
        for(Address addObj:addresses) 
        { 
         // Looping once 
         if(i==1) 
         { 

          String add_line1_extract; 

          add_line1_extract=addObj.getAddressLine(1); 

          String string = add_line1_extract; 
          String[] parts = string.split(","); 

          //Setting city 
          mCity = parts[0]; 

          //setting state 
          mState = parts[1]; 

          // Final Output 
          String cityAndState = mCity + ", " + mState; 
          i++; 

         } 
        } 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 

दूसरा प्रयास (ज़िप संक्षिप्त रूप के बाद पीछा किया), अब करीब नहीं जिप हो रही ... लेकिन ... (पूर्ण राज्य रिटर्न नाम):

Geocoder geoCoder = new Geocoder(getActivity(), Locale.getDefault()); 
       List<Address> addresses; 
       try { 
        addresses = geoCoder.getFromLocation(mLatitude, mLongitude, 10); 
        int i=1; 
        for(Address addObj:addresses) 
        { 
         // Looping once 
         if(i==1) 
         { 

          //Setting city 
          mCity = addObj.getSubLocality();        
          //setting state 
          mState = addObj.getAdminArea(); 

          i++; 
         } 
        } 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 

उत्तर

5

मैं नहीं मानता कि आप getAdminArea से सीधे एक राज्य संक्षिप्त नाम प्राप्त कर सकते हैं() के बावजूद क्या प्रलेखन कहते हैं। हालांकि, जब अमेरिका और कनाडा से निपटते हैं, तो आप एक हैशपैप स्थापित कर सकते हैं जो राज्य/प्रांतों को संदर्भ पर संक्षेप में मानचित्रित करेगा।

कुछ इस तरह का प्रयोग करें:

Map<String, String> states = new HashMap<String, String>(); 
states.put("Alabama","AL"); 
states.put("Alaska","AK"); 
states.put("Alberta","AB"); 
states.put("American Samoa","AS"); 
states.put("Arizona","AZ"); 
states.put("Arkansas","AR"); 
states.put("Armed Forces (AE)","AE"); 
states.put("Armed Forces Americas","AA"); 
states.put("Armed Forces Pacific","AP"); 
states.put("British Columbia","BC"); 
states.put("California","CA"); 
states.put("Colorado","CO"); 
states.put("Connecticut","CT"); 
states.put("Delaware","DE"); 
states.put("District Of Columbia","DC"); 
states.put("Florida","FL"); 
states.put("Georgia","GA"); 
states.put("Guam","GU"); 
states.put("Hawaii","HI"); 
states.put("Idaho","ID"); 
states.put("Illinois","IL"); 
states.put("Indiana","IN"); 
states.put("Iowa","IA"); 
states.put("Kansas","KS"); 
states.put("Kentucky","KY"); 
states.put("Louisiana","LA"); 
states.put("Maine","ME"); 
states.put("Manitoba","MB"); 
states.put("Maryland","MD"); 
states.put("Massachusetts","MA"); 
states.put("Michigan","MI"); 
states.put("Minnesota","MN"); 
states.put("Mississippi","MS"); 
states.put("Missouri","MO"); 
states.put("Montana","MT"); 
states.put("Nebraska","NE"); 
states.put("Nevada","NV"); 
states.put("New Brunswick","NB"); 
states.put("New Hampshire","NH"); 
states.put("New Jersey","NJ"); 
states.put("New Mexico","NM"); 
states.put("New York","NY"); 
states.put("Newfoundland","NF"); 
states.put("North Carolina","NC"); 
states.put("North Dakota","ND"); 
states.put("Northwest Territories","NT"); 
states.put("Nova Scotia","NS"); 
states.put("Nunavut","NU"); 
states.put("Ohio","OH"); 
states.put("Oklahoma","OK"); 
states.put("Ontario","ON"); 
states.put("Oregon","OR"); 
states.put("Pennsylvania","PA"); 
states.put("Prince Edward Island","PE"); 
states.put("Puerto Rico","PR"); 
states.put("Quebec","PQ"); 
states.put("Rhode Island","RI"); 
states.put("Saskatchewan","SK"); 
states.put("South Carolina","SC"); 
states.put("South Dakota","SD"); 
states.put("Tennessee","TN"); 
states.put("Texas","TX"); 
states.put("Utah","UT"); 
states.put("Vermont","VT"); 
states.put("Virgin Islands","VI"); 
states.put("Virginia","VA"); 
states.put("Washington","WA"); 
states.put("West Virginia","WV"); 
states.put("Wisconsin","WI"); 
states.put("Wyoming","WY"); 
states.put("Yukon Territory","YT"); 
+2

समस्या जो मैं इस समाधान के साथ देखता हूं वह अंग्रेजी के अलावा अलग-अलग भाषाओं के लिए राज्य का नाम है। – pellyadolfo

+0

अच्छा बिंदु @ पेलियाडोल्फो - अभी तक अमेरिकी राज्य के नामों के लिए अंतर्राष्ट्रीयकरण से निपटना नहीं है, लेकिन क्या आप अतिरिक्त भाषाओं के लिए कुछ तर्क नहीं जोड़ सकते हैं और फिर वांछित भाषा पर आधारित हैशपैप में बस स्वैप कर सकते हैं? – Bourne

+0

हाय @ बॉर्मे, यकीन है कि आप कर सकते हैं, लेकिन मैं इसे एक कठिन उपभोग करने वाला कार्य के रूप में देखता हूं। उदाहरण के लिए अंग्रेजी में न्यू यॉर्क को geocoder द्वारा स्पेनिश में न्यूवे यॉर्क के रूप में वापस कर दिया जाएगा। तो आपको प्रति भाषा एक नया नक्शा चाहिए, जो मुझे लगता है कि मुझे लगता है कि एक लंबा काम है और संभावित रूप से त्रुटि प्रवण है। लेकिन, तकनीकी रूप से, व्यवहार्य है, मैं सहमत हूं। – pellyadolfo

3

मैं पूरा पता में पिछले 2 पत्र शब्द का पता लगाकर उसके चारों ओर काम किया (गूगल द्वारा प्रदान की एक अमेरिका पते संभालने एंड्रॉयड जियोकोडर नक्शे)। यह उन सभी मामलों के लिए काम करता है जो मैंने पाया है:

private String getUSStateCode(Address USAddress){ 
    String fullAddress = ""; 
    for(int j = 0; j <= USAddress.getMaxAddressLineIndex(); j++) 
     if (USAddress.getAddressLine(j) != null) 
      fullAddress = fullAddress + " " + USAddress.getAddressLine(j); 

    String stateCode = null; 
    Pattern pattern = Pattern.compile(" [A-Z]{2} "); 
    String helper = fullAddress.toUpperCase().substring(0, fullAddress.toUpperCase().indexOf("USA")); 
    Matcher matcher = pattern.matcher(helper); 
    while (matcher.find()) 
     stateCode = matcher.group().trim(); 

    return stateCode; 
} 
+0

धन्यवाद @pellyadolfo, पूरी तरह से काम करता है :) –

+1

बग: यूएसए शहर में "यूएसए" सबस्ट्रिंग हो सकता है: हजार ओक्स – user1269737

1

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

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

(?<![A-Za-z0-9])([A-Z]{2})(?![A-Za-z0-9]) 

चुनौती यहाँ "संयुक्त राज्य अमेरिका" है वास्तव में "अमेरिका" एक सरल दो पत्र अपर केस खोज से मेल खाना होगा:

import android.location.Address; 
import android.util.Log; 

import java.util.HashMap; 
import java.util.Map; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class StateNameAbbreviator { 
    private static final String TAG = "StateNameAbbreviator"; 

    static private Map<String, String> mStateMap = null; 

    static public String getStateAbbreviation(Address address) { 
     if (address == null) { 
      return null; 
     } 

     populateStates(); 

     String stateCode = mStateMap.get(address.getAdminArea()); 
     if (stateCode == null) { 
      Log.d(TAG, "State mapping failed, parsing from address"); 
      stateCode = parseStateCodeFromFullAddress(address); 
      if (stateCode == null) { 
       Log.d(TAG, "Could not parse state from address"); 
      } 
     } 
     else { 
      Log.d(TAG, "Successfully mapped " + address.getAdminArea() + " to " + stateCode); 
     } 

     return stateCode; 
    } 

    static private String parseStateCodeFromFullAddress(Address address) { 
     if ((address == null) || address.getMaxAddressLineIndex() < 0) { 
      return null; 
     } 

     String fullAddress = ""; 
     for(int j = 0; j <= address.getMaxAddressLineIndex(); j++) { 
      if (address.getAddressLine(j) != null) { 
       fullAddress += " " + address.getAddressLine(j); 
      } 
     } 

     Log.d(TAG, "Full address: " + fullAddress); 

     Pattern pattern = Pattern.compile("(?<![A-Za-z0-9])([A-Z]{2})(?![A-Za-z0-9])"); 
     Matcher matcher = pattern.matcher(fullAddress); 

     String stateCode = null; 
     while (matcher.find()) { 
      stateCode = matcher.group().trim(); 
     } 

     Log.d(TAG, "Parsed statecode: " + stateCode); 

     return stateCode; 
    } 

    private static void populateStates() { 
     if (mStateMap == null) { 
      mStateMap = new HashMap<String, String>(); 
      mStateMap.put("Alabama", "AL"); 
      mStateMap.put("Alaska", "AK"); 
      mStateMap.put("Alberta", "AB"); 
      mStateMap.put("American Samoa", "AS"); 
      mStateMap.put("Arizona", "AZ"); 
      mStateMap.put("Arkansas", "AR"); 
      mStateMap.put("Armed Forces (AE)", "AE"); 
      mStateMap.put("Armed Forces Americas", "AA"); 
      mStateMap.put("Armed Forces Pacific", "AP"); 
      mStateMap.put("British Columbia", "BC"); 
      mStateMap.put("California", "CA"); 
      mStateMap.put("Colorado", "CO"); 
      mStateMap.put("Connecticut", "CT"); 
      mStateMap.put("Delaware", "DE"); 
      mStateMap.put("District Of Columbia", "DC"); 
      mStateMap.put("Florida", "FL"); 
      mStateMap.put("Georgia", "GA"); 
      mStateMap.put("Guam", "GU"); 
      mStateMap.put("Hawaii", "HI"); 
      mStateMap.put("Idaho", "ID"); 
      mStateMap.put("Illinois", "IL"); 
      mStateMap.put("Indiana", "IN"); 
      mStateMap.put("Iowa", "IA"); 
      mStateMap.put("Kansas", "KS"); 
      mStateMap.put("Kentucky", "KY"); 
      mStateMap.put("Louisiana", "LA"); 
      mStateMap.put("Maine", "ME"); 
      mStateMap.put("Manitoba", "MB"); 
      mStateMap.put("Maryland", "MD"); 
      mStateMap.put("Massachusetts", "MA"); 
      mStateMap.put("Michigan", "MI"); 
      mStateMap.put("Minnesota", "MN"); 
      mStateMap.put("Mississippi", "MS"); 
      mStateMap.put("Missouri", "MO"); 
      mStateMap.put("Montana", "MT"); 
      mStateMap.put("Nebraska", "NE"); 
      mStateMap.put("Nevada", "NV"); 
      mStateMap.put("New Brunswick", "NB"); 
      mStateMap.put("New Hampshire", "NH"); 
      mStateMap.put("New Jersey", "NJ"); 
      mStateMap.put("New Mexico", "NM"); 
      mStateMap.put("New York", "NY"); 
      mStateMap.put("Newfoundland", "NF"); 
      mStateMap.put("North Carolina", "NC"); 
      mStateMap.put("North Dakota", "ND"); 
      mStateMap.put("Northwest Territories", "NT"); 
      mStateMap.put("Nova Scotia", "NS"); 
      mStateMap.put("Nunavut", "NU"); 
      mStateMap.put("Ohio", "OH"); 
      mStateMap.put("Oklahoma", "OK"); 
      mStateMap.put("Ontario", "ON"); 
      mStateMap.put("Oregon", "OR"); 
      mStateMap.put("Pennsylvania", "PA"); 
      mStateMap.put("Prince Edward Island", "PE"); 
      mStateMap.put("Puerto Rico", "PR"); 
      mStateMap.put("Quebec", "PQ"); 
      mStateMap.put("Rhode Island", "RI"); 
      mStateMap.put("Saskatchewan", "SK"); 
      mStateMap.put("South Carolina", "SC"); 
      mStateMap.put("South Dakota", "SD"); 
      mStateMap.put("Tennessee", "TN"); 
      mStateMap.put("Texas", "TX"); 
      mStateMap.put("Utah", "UT"); 
      mStateMap.put("Vermont", "VT"); 
      mStateMap.put("Virgin Islands", "VI"); 
      mStateMap.put("Virginia", "VA"); 
      mStateMap.put("Washington", "WA"); 
      mStateMap.put("West Virginia", "WV"); 
      mStateMap.put("Wisconsin", "WI"); 
      mStateMap.put("Wyoming", "WY"); 
      mStateMap.put("Yukon Territory", "YT"); 
     } 
    } 
} 

regex किसी भी दो पत्र अपरकेस शब्द से मेल खाएगी। तो हम एक अग्रदर्शी और lookbehind की जरूरत है:

?<! 

lookbehind मैच मैच के पीछे

(?<![A-Za-z0-9]) 

देखो, और वहाँ एक अक्षरांकीय चरित्र वहाँ नहीं है यह सुनिश्चित कर लें (यानी, लाइन का एक "शुरू होना चाहिए ", व्हाइटस्पेस, कॉमा, इत्यादि।पहले मैच)

([A-Z]{2}) 

मैच दो बड़े अक्षरों

?! 

मैच के अग्रदर्शी

(?![A-Za-z0-9]) 

मैच से आगे देखो, और सुनिश्चित करें कि अल्फानुमेरिक चरित्र वहाँ नहीं है (यानी, मिलान के बाद "लाइन का अंत" या व्हाइटस्पेस, कॉमा इत्यादि होना चाहिए)

0

यह यूएस पते पर मेरे लिए काम करता है:

String[] spState = addressInformation.get(0).getAddressLine(1).split(" "); 
String state = spState[1]; 
संबंधित मुद्दे