package unit; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import unit.GPolyline2; /** * 解析KML文件,得到编码折线(以字符串形式表示) * 然后返回页面 * 该方法用于解析 * <coordinates> 114.603325, 37.427359, 50.90 114.604025, 37.428438, 50.90 114.599972, 37.525815, 29.90 114.598970, 37.535222, 33.40 114.589994, 37.617946, 34.80 114.589880, 37.618956, 35.20 114.579965, 37.694322, 39.40 114.579317, 37.695190, 40.30 114.569753, 37.708272, 42.60 114.569112, 37.709142, 43.20 114.559623, 37.722202, 45.10 114.558989, 37.723076, 45.40 114.549448, 37.736103, 49.20 114.548594, 37.737259, 49.60 114.539893, 37.753110, 44.90 114.539696, 37.754055, 44.70 114.529925, 37.799285, 52.80 114.529705, 37.800290, 52.80 114.519833, 37.845255, 51.00 114.519614, 37.846256, 51.40 114.509846, 37.891104, 49.50 114.509624, 37.892112, 49.30 </coordinates> 此类格式的KML文件 * @author libin * */ public class KmlParseForString { //存储xml元素信息的容器 private static List<Leaf> elemList = new ArrayList<Leaf>(); @SuppressWarnings("unchecked") public static List lvLONGList = new ArrayList(); @SuppressWarnings("unchecked") public static List lvDimenList = new ArrayList(); /** * 载入一个KML文件 * @param fileName * @return */ private static Document loadFile(String fileName){ Document document = null; try{ SAXReader reader = new SAXReader(); FileInputStream in = new FileInputStream(new File(fileName)); InputStreamReader inReader=new InputStreamReader (in,"UTF-8"); BufferedReader bufReader=new BufferedReader(inReader); document = reader.read(bufReader); }catch(Exception ex){ ex.printStackTrace(); } return document; } /** * 递归遍历方法 * * @param element */ @SuppressWarnings("unchecked") private static void getElementList(Element element) { List elements = element.elements(); if (elements.size() == 0) { //没有子元素 String xpath = element.getName(); String value = element.getTextTrim(); elemList.add(new Leaf(xpath, value)); } else { //有子元素 for (Iterator it = elements.iterator(); it.hasNext();) { Element elem = (Element) it.next(); getElementList(elem); } } } /** * 这个方法也可以用于读取地图线路kml文件 * @param elemList */ @SuppressWarnings("unchecked") private static void getListStringForLW(List<Leaf> elemList){ @SuppressWarnings("unused") StringBuffer sb = new StringBuffer(); String S = ""; for(Iterator<Leaf> it = elemList.iterator(); it.hasNext();){ Leaf leaf = it.next(); if("coordinates".equals(leaf.getXpath())){ S = leaf.getValue(); if(!"".equals(S)){ int length = S.split(",").length; String[] arr = new String[length]; arr = S.split(","); for(int i = 0; i < length; i++){ if(i==0){ lvDimenList.add(arr[i]); } if(i==1){ lvLONGList.add(arr[i]); } if((i!=0) && (i%2==0) && (i!=length-1)){ lvDimenList.add(arr[i].trim().split(" ")[1]); } if((i!=1) && (i%2==1)){ lvLONGList.add(arr[i].split(" ")[1]); } } } } } } /** * 解析指定路径的KML文件,获取经纬度坐标 * @param file */ @SuppressWarnings("unchecked") public static String parseKML(String file){ //首先清空元素列表 elemList.clear(); lvLONGList.clear(); lvDimenList.clear(); Document document = loadFile(file); Element root = document.getRootElement(); getElementList(root); getListStringForLW(elemList); StringBuffer linePolyStbuf = new StringBuffer(); for(int i = 0; i < lvDimenList.size()&& i < lvLONGList.size(); i++){ linePolyStbuf.append(lvLONGList.get(i).toString());//追加维度 linePolyStbuf.append(","); linePolyStbuf.append(lvDimenList.get(i).toString());//追加经度 if(i < lvDimenList.size()-1){ linePolyStbuf.append(";"); } } // String gPolyline = GPolyline.encodeLine(linePolyStbuf.toString()); String gPolyline = GPolyline2.createEncodings(linePolyStbuf.toString()); return gPolyline; } public static void main(String[] args){ System.out.println(parseKML("E://eclipseworkspace//lw_tracing//WebRoot//kml//lw_line.kml")); } }