解析KML文件 , 获取Coordinates标签中的经纬度坐标值
2009-12-30 10:50
211 查看
<textarea name="code" class="java" cols="50" rows="15">package mapServlet; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import unit.GPolyline2; import unit.KmlParseForCoordinate; /** * KML 标签coordinates解析Servlet * @author libin * */ public class KmlParseForCoordinate_servelt extends HttpServlet { private String filePath = "E://eclipseworkspace//lw_tracing//WebRoot//kml//test.kml"; /** * 缺省串行版本标识 */ private static final long serialVersionUID = 1L; @SuppressWarnings("unchecked") @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ArrayList coorArr = new ArrayList(); StringBuffer result = new StringBuffer(); String coorPolyline = ""; String levels = "";//编码级别 response.setContentType("text/xml;charset=UTF-8"); // String coordinates = KmlParseForCoordinate.getCoordinates(filePath);//用于单条线处理 coorArr = KmlParseForCoordinate.getCoordinatesForArr(filePath);//用于多条线路处理 for(int index = 0; index < coorArr.size(); index++){ //得到每一条线路内容 String coordinates = coorArr.get(index).toString(); StringBuffer linePolyStbuf = new StringBuffer(); //解析每一条线路 int coorLength = coordinates.split(",").length; String[] coorArray = coordinates.split(","); for(int i = 0; i <= coorLength-1;i++){ if(i==0){ linePolyStbuf.append(coorArray[i+1]); linePolyStbuf.append(","); } if(i==1){ linePolyStbuf.append(coorArray[i-1]); linePolyStbuf.append(";"); } if((i!=0) && (i%2==0) && (i!=coorLength-1)){ linePolyStbuf.append(coorArray[i+1]); linePolyStbuf.append(","); } if((i!=1) && (i%2==1)){ linePolyStbuf.append(coorArray[i-1]); linePolyStbuf.append(";"); } } coorPolyline = GPolyline2.createEncodings(linePolyStbuf.toString()); levels = GPolyline2.encodeLevel(linePolyStbuf.toString()); //设置每一个线路的编码折线和编码级别 String resultPoly = coorPolyline+"#"+levels; //放入结果集中 result= result.append(resultPoly); //每一条线路用%分隔 if(index < coorArr.size()-1){ result = result.append("%"); } } PrintWriter out = response.getWriter(); //out.println(coorPolyline+"#"+levels); out.println(result.toString()); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the POST method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } } 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; /** * 解析KML文件 * 获取Coordinates标签中的经纬度坐标值 * 用于解析 * <Placemark> <styleUrl>#khStyle1042</styleUrl> <LineString> <coordinates> 118.789748,30.93991700000001,118.776237,30.93783, </coordinates> </LineString> </Placemark> 此类格式的文件 * @author libin * */ public class KmlParseForCoordinate { //存储xml元素信息的容器 private static List<Leaf> elemList = new ArrayList<Leaf>(); /** * 载入一个文件 * @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文件中的coordinates的标签,得到经纬度连接字符串 * @param elemList KML元素容器 * @return */ private static String getListStringForCoordinate(List<Leaf> elemList){ StringBuffer sb = new StringBuffer(); String keyName = ""; for(Iterator<Leaf> it = elemList.iterator(); it.hasNext();){ Leaf leaf = it.next(); if("coordinates".equals(leaf.getXpath())){ keyName = leaf.getValue(); if(!"".equals(keyName)){ sb.append(keyName); } } } return sb.toString(); } /** * 获得kml文件中的<coordinates>标签内容,并且每一个<coordinates>标签内容是一个单独的对象,存于ArrayList对象中 * @param elemList * @return */ private static ArrayList<StringBuffer> getListStringForCoordinateArr(List<Leaf> elemList){ ArrayList<StringBuffer> coorArr = new ArrayList<StringBuffer>(); for(Iterator<Leaf> it = elemList.iterator(); it.hasNext();){ Leaf leaf = it.next(); if("coordinates".equals(leaf.getXpath())){ StringBuffer sb = new StringBuffer(); String keyName = ""; keyName = leaf.getValue(); if(!"".equals(keyName)){ sb.append(keyName); } coorArr.add(sb); } } return coorArr; } /** * 解析指定的KML文件,得到经纬度字符串 * 此方法最好用于一条线路的解析 * @param file * @return */ public synchronized static String getCoordinates(String file){ //首先清空列表 elemList.clear(); Document document = loadFile(file); Element root = document.getRootElement(); getElementList(root); return getListStringForCoordinate(elemList); } /** * 解析KML文件,每一个<coordinates>标签内容是一个单独的对象,存于ArrayList对象中 * 这个方法最好用于多条线的解析 * @param file * @return */ public synchronized static ArrayList<?> getCoordinatesForArr(String file){ //首先清空列表 elemList.clear(); Document document = loadFile(file); Element root = document.getRootElement(); getElementList(root); return getListStringForCoordinateArr(elemList); } public static void main(String[] args){ String filePath = "E://eclipseworkspace//lw_tracing//WebRoot//kml//test.kml"; // System.out.println(getCoordinates(filePath)); StringBuffer result = new StringBuffer(); String coorPolyline = ""; String levels = "";//编码级别 ArrayList<?> coorArrayList = new ArrayList<Object>(); coorArrayList = getCoordinatesForArr(filePath); System.out.println("ArrayList size :" + coorArrayList.size()); for(int index = 0; index < coorArrayList.size(); index++){ //得到每一个标签内容 String coordinates = coorArrayList.get(index).toString(); StringBuffer linePolyStbuf = new StringBuffer(); //解析每一个标签值 int coorLength = coordinates.split(",").length; String[] coorArray = coordinates.split(","); for(int i = 0; i <= coorLength-1;i++){ if(i==0){ linePolyStbuf.append(coorArray[i+1]); linePolyStbuf.append(","); } if(i==1){ linePolyStbuf.append(coorArray[i-1]); linePolyStbuf.append(";"); } if((i!=0) && (i%2==0) && (i!=coorLength-1)){ linePolyStbuf.append(coorArray[i+1]); linePolyStbuf.append(","); } if((i!=1) && (i%2==1)){ linePolyStbuf.append(coorArray[i-1]); linePolyStbuf.append(";"); } } coorPolyline = GPolyline2.createEncodings(linePolyStbuf.toString()); levels = GPolyline2.encodeLevel(linePolyStbuf.toString()); //设置每一个线路的编码折线和编码级别 String resultPoly = coorPolyline+"#"+levels; //放入结果集中 result= result.append(resultPoly); //每一条线路用%分隔 if(index < coorArrayList.size()-1){ result = result.append("%"); } } } }
相关文章推荐
- 解析KML文件并提取coordinates中的经纬度坐标信息
- 如何将经纬度数据通过ArcGIS转换为KML文件展绘到Google Earth 并且获取大致面积
- Android中数据文件解析(Json解析【从服务器端获取数据并且解析,显示在客户端上面】)
- iOS大文件分片上传和断点续传 标签: iOS大文件分片断点续传获取视频获取图片 2016-05-17 15:52 4881人阅读 评论(8) 收藏 举报 分类: 技术—iOS 版权声明:本文为博
- 用户Ip地址和百度地图api接口获取用户地理位置(经纬度坐标,城市)
- 解析KML文件,得到编码折线(以字符串形式表示)
- JarFile解析jar文件。获取jar中后缀为class文件路径
- jsoup 解析html网页标签获取数据(java 网页解析 数据)
- Android 高德地图获取屏幕中心的经纬度坐标
- struts2 + ajax(由前台的form提交数据到后台,再根据form所调用返回获取的后台json格式的数据返回到前端,然后前端用jquery对json数据进行解析)==》》涉及文件上传的部分
- Android中数据文件解析(Json解析【从服务器端获取数据并且解析,显示在客户端上面】)
- Android 获取服务器数据解析Text数据,存在htmel标签的处理办法
- android 获取经纬度城市名(通过baidumapapi 以及 json解析)
- Python 获取接口数据,解析JSON,写入文件
- 微信公众号开发,获取用户的地理位置坐标,经纬度
- 根据xml的标签解析文件的Demo
- ASP.NET MVC 关于MasterPage中<script>标签的文件路径自动解析
- java解析PDF文件,并获取到指定数据(升级版)
- 百度地图获取二个经纬度坐标间的距离
- 获取2个经纬度坐标之间的距离