2014-11-12 3 views
6

Я попытался двумя разными способами попытаться получить название города, а также аббревиатуру состояния только из класса Address, без везения. Первый возвращает государство как «CA 92055» с почтовым индексом, а вторая попытка возвращает полное имя штата. Какие-нибудь быстрые пути вокруг этого?Получение аббревиатуры государства от getAdminArea();

Первой попытка, которую государство в конце концов возвращается «CA 92055» (Zip последовала после сокращений)

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

Хорошая точка @pellyadolfo - еще не нужно было заниматься интернационализацией имен американских государств, но не могли ли вы добавить некоторую логику для дополнительных языков, а затем просто поменять на хэш-карту, основанную на желаемом языке? – Bourne

+0

Привет @Bourme, конечно, вы могли бы, но я считаю это трудной задачей. Например, Нью-Йорк на английском языке будет возвращен как нуэва-Йорк на испанском языке геокодером. Таким образом, вам понадобится новая карта на рассматриваемый язык, который, по моему мнению, является длинной задачей и потенциально подвержен ошибкой. Но, технически, это возможно, я согласен. – pellyadolfo

3

Я работал вокруг него, находя последние 2 буквы слова в полный адрес (предполагается, что адрес в США предоставленный Google Maps для Android геокодер). Он работает для всех случаев, которые я нашел:

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

ошибка: город США может содержать подстроку «usa»: Thousand Oaks – user1269737

1

Вот комбинированная и измененная версия ответов Бурна и пельменидольфо. Сначала он пытается сопоставить полное имя состояния с кодом состояния (работает и для канадских провинций и меньше подвержен ошибкам, чем регулярное выражение), и если это не сработает, оно возвращается к решению регулярного выражения (которое имеет потенциал для поэтому я предпочитаю его в качестве резервного решения, но могу работать с разными языками или странами).

Решение regex было улучшено, чтобы включить проверку на работоспособность в начале и имеет более расширенное регулярное выражение, чтобы исключить необходимость вручную отфильтровывать «США» (это позволяет канадским адресам работать). Он также удаляет вызов «toupper()», который имеет побочный эффект преобразования «St» (сокращение от «улицы») в «ST», что может привести к ложному совпадению.

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"); 
     } 
    } 
} 

Регулярное выражение будет соответствовать любой из двух букв верхнего регистра слова:

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

Проблема здесь является «США» будет фактически соответствовать «США» с простой две буквы верхний регистр поиска. Поэтому нам нужен предпросмотр и назад ':

?<! 

' назад матч

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

Посмотрите за матч, и убедитесь, что не алфавитно-цифровой символ есть (то есть, должно быть «начало строки ", пробел, запятая и т. д.до матча)

([A-Z]{2}) 

Матч две прописные буквы

?! 

опережения матча

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

Посмотрите вперед в матче, и убедитесь, что не алфавитно-цифровой символ есть (т.е. должен быть «конец строки» или пробел, запятая и т. д. после матча)

0

Это работает для меня по адресам в США:

String[] spState = addressInformation.get(0).getAddressLine(1).split(" "); 
String state = spState[1]; 
Смежные вопросы