前台利用javascript解析Json数据,生成编码折线
2009-12-30 10:19
519 查看
前台利用javascript解析Json数据,生成编码折线,因为利用浏览器解析,数据量大的情况下,会锁定浏览器,脚本执行太慢。
Js解析方法:
注意才方法没有计算编码级别:
package unit; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.sql.SQLException; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import net.sf.json.JSONArray; /** * 解析KML文件,获取特定线路站点经纬度 * 此类用于前台JS生成编码折线 * 解析此类格式 * * <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> 的数据 * * @author libin * */ public class KmlParse { //存储xml元素信息的容器 private static List<Leaf> elemList = new ArrayList<Leaf>(); @SuppressWarnings("unchecked") public static List nameTable = new ArrayList();//名称 @SuppressWarnings({ "unchecked"}) public static Hashtable LONGTable = new Hashtable();//经度 @SuppressWarnings("unchecked") public static Hashtable dimenTable = new Hashtable();//维度 @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 saxReader = new SAXReader(); //document = saxReader.read(new File(fileName)); //------------------------------------ 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.getPath(); 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 JSONArray parseKML(String file){ //首先清空元素列表 elemList.clear(); lvLONGList.clear(); lvDimenList.clear(); Document document = loadFile(file); Element root = document.getRootElement(); getElementList(root); getListStringForLW(elemList); ArrayList ArrayForMark = new ArrayList(); for(int i = 0; i < lvDimenList.size()&& i < lvLONGList.size(); i++){ PlaceMark mark = new PlaceMark(); mark.setLongitude(lvDimenList.get(i).toString());//设置经度 mark.setDimensionality(lvLONGList.get(i).toString());//设置维度 ArrayForMark.add(i, mark); } JSONArray jsonArrayForMark = JSONArray.fromObject(ArrayForMark); return jsonArrayForMark; } public static void main(String[] args) throws SQLException{ System.out.println( parseKML("E://eclipseworkspace//lw_tracing//WebRoot//kml//lw_line.kml")); } }
Js解析方法:
注意才方法没有计算编码级别:
GDownloadUrl("servlet/KmlParse_servlet", function(data){ var json = eval(data); for(var i = 0; i < json.length; i++){ createPoint(json[i].dimensionality,json[i].longitude); } encodedLine = createEncodings();//scripts/kmlParse.js });
/** * 站点经纬度坐标对象 * * @author libin * */ public class PlaceMark { public String longitude; // 经度 public String dimensionality;// 维度 public String getLongitude() { return longitude; } public void setLongitude(String longitude) { this.longitude = longitude; } public String getDimensionality() { return dimensionality; } public void setDimensionality(String dimensionality) { this.dimensionality = dimensionality; } }
相关文章推荐
- 【Servlet】在Servlet3.0中利用json+ajax把数据库查询出来的数据推向前台显示,无额外的json解析包
- javascript前台生成json,后台进行解析
- 利用gson解析和生成json数据(二)
- 利用gson解析和生成json数据(一)
- iOS利用AFNetworking进行JSON数据解析
- 如何使用JSON Framework库解析与生成json数据(iphone网络篇二)
- [置顶] 动态grid java 后台封装json数据返回到前台解析并展示
- 玩转Web之Json(三)-----easy ui怎么把前台显示的dataGird中的所有数据序列化为json,返回到后台并解析
- json数据生成、传输、解析、展现
- 关于jsp返回json数据给前台javascript
- Android 生成和解析JSON数据
- extjs前台请求json数据,并解析
- json数据解析和生成
- SpringMVC中利用json从后台穿数据到前台
- GSON方式生成和解析json数据
- 谈谈iOS开发之JSON格式数据的生成与解析
- JavaScript处理解析JSON数据过程详解
- Android开发中使用fastJSON将json格式的数据快速解析生成实体类并附上实体类生成器
- 《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
- JSON数据生成与解析