您的位置:首页 > 其它

解析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("%");
}

}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐