您的位置:首页 > Web前端 > JavaScript

前台利用javascript解析Json数据,生成编码折线

2009-12-30 10:19 519 查看
前台利用javascript解析Json数据,生成编码折线,因为利用浏览器解析,数据量大的情况下,会锁定浏览器,脚本执行太慢。

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: