package com.wistron.WiGallery.GEO; import java.util.ArrayList; import java.util.List; import com.wistron.WiGallery.Element; import com.wistron.WiGallery.WiGalleryInterface.BatchProcessCallBack; import com.wistron.swpc.wicamera3dii.R; import android.content.Context; import android.util.Log; import Utilities.CSStaticData; import Utilities.FileOperation; /** * Copyright (c) 2011 Wistron SWPC * All rights reserved. * @author Cocoonshu * @date 2012-03-01 17:38:38 * @purpose 位置信息解析 * @detail */ public class GeoParser { private static String TAG = "GeoParser"; private static String UNKNOWN_LOCATION = "Unknown"; //默认未知地理位置字符串 public GeoParser(Context context) { UNKNOWN_LOCATION = context.getResources().getString(R.string.no_location); if(UNKNOWN_LOCATION == null || UNKNOWN_LOCATION.equals("")){ UNKNOWN_LOCATION = "Unknown"; } } /** * 查询位置信息 * @param longitude GPS 经度 * @param latitude GPS 纬度 * @param type 位置级别 * @return 根据位置级别的限制来返回不同的地区名称, Unknown则没有查询到结果 */ public static String parserGeo(Context context, double latitude, double longitude, CSStaticData.LIST_TYPE type) { String result = ""; String[] locality = null; GEOCacheHelper geoCacheHelper = null; //查询位置 geoCacheHelper = new GEOCacheHelper(context); locality = geoCacheHelper.getLocationString(latitude, longitude); //取出等级 result = translateLocalityFormat(locality, type); //过滤数据 if(result == null || result.equals("")){ result = context.getResources().getString(R.string.no_location); if(result == null){ //只判断空指针,不判断空串,方便以后需求兼容 result = UNKNOWN_LOCATION; } } return result; } /** * 批量查询位置信息 * @param context * @param coordinateMaps * @param type * @param callBack 执行进度回调接口 * @return */ public static List<Element> parserGeoBatch(Context context, List<Element> coordinateMaps, CSStaticData.LIST_TYPE type, BatchProcessCallBack callBack){ int mapsSize = 0; Element elem = null; List<String[]> mapsResult = null; List<Element> result = new ArrayList<Element>(coordinateMaps); //异步操作时间过长,传值防止数据变化 List<CoordinateMap> coordinateList = new ArrayList<CoordinateMap>(); GEOCacheHelper geoCacheHelper = null; if(result == null || result.size() == 0){ return result; } //生成经纬度坐标列表 mapsSize = result.size(); for(int i = 0; i < mapsSize; i++){ double[] gpsinfo = {Double.NaN, Double.NaN}; elem = result.get(i); gpsinfo[0] = result.get(i).m_latitude; gpsinfo[1] = result.get(i).m_longitude; if(Double.isNaN(gpsinfo[0])||Double.isNaN(gpsinfo[1])){//若数据库里没有,就去文件系统上查 gpsinfo = FileOperation.getGPSInfoFromFile(result.get(i).getName()); } coordinateList.add(new CoordinateMap(gpsinfo[0], gpsinfo[1])); } //查询地理地址 geoCacheHelper = new GEOCacheHelper(context); mapsResult = geoCacheHelper.getLocationStringBatch(coordinateList, callBack); //为链表的每个元素赋上地址信息 for(int i = 0; i < mapsSize; i++){ result.get(i).m_str_address = mapsResult.get(i); if(CSStaticData.DEBUG){ Log.w(TAG, "[parserGeoBatch]查询GPS(" + result.get(i).m_latitude + ", " + result.get(i).m_longitude + ") = " + result.get(i).m_str_address); } } return result; } /** * 把位置数组转换为可阅读字符串 * @param locality * @param type * @return */ private static String translateLocalityFormat(String[] locality, CSStaticData.LIST_TYPE type){ String result = ""; int loop = 0; if(type == CSStaticData.LIST_TYPE.LIST_LOCATION_1){ loop = 1; } if(type == CSStaticData.LIST_TYPE.LIST_LOCATION_2){ loop = 2; } if(type == CSStaticData.LIST_TYPE.LIST_LOCATION_3){ loop = 3; } if(type == CSStaticData.LIST_TYPE.LIST_LOCATION_4){ loop = 4; } if(locality.length < loop){ loop = locality.length; } for(int i = 0; i < loop; i++){ if(locality[i] != null && !locality[i].equals("")){ result += locality[i] + ", "; } } try{ if(result == null || result.equals("")){ result = UNKNOWN_LOCATION; }else{ result = result.substring(0, result.length() - 2); } }catch (IndexOutOfBoundsException e) { if(CSStaticData.DEBUG){ e.printStackTrace(); } result = UNKNOWN_LOCATION; } return result; } }