Java生成KML文件,用OpenLayers技术显示在地图上.

来源:互联网 发布:php exec 没有执行 编辑:程序博客网 时间:2024/04/29 03:15

Java类:

/**
 * @description 生成XML文件
 * @author NJX
 * @time 09/08/06
 */
public class DomXmlDemo {
 private static String fileName;
 private Document document;

 // 构造方法传递文件的完整路径
 public DomXmlDemo(String name) {
  fileName = name;
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  try {
   DocumentBuilder builder = factory.newDocumentBuilder();
   this.document = builder.newDocument();
  } catch (ParserConfigurationException e) {
   System.out.println(e.getMessage() + "构造方法执行正确.");
   e.printStackTrace();
  }
 }

 /**
  * 创建XML文件
  */
 public void createXml() {
  // 创建XML文件中的第一个节点<KML>
  Element xml = this.document.createElement("XML");
  this.document.appendChild(xml);

  // 创建根节点<POINTS>
  Element points = this.document.createElement("POINTS");

  // 构造的第一个<POINT>节点
  Element point = this.document.createElement("POINT");

  // 构造<POINT>下的第一个NAME子节点
  Element name = this.document.createElement("NAME");
  name.appendChild(this.document.createTextNode("First Point"));
  point.appendChild(name);

  // 构造<POINT>下的二个<COLOR>子节点
  Element color = this.document.createElement("COLOR");
  color.appendChild(this.document.createTextNode("#000066"));
  point.appendChild(color);

  // 构造<POINT>下的第三个<LONGITUDE>子节点
  Element longitude = this.document.createElement("LONGITUDE");
  longitude.appendChild(this.document.createTextNode("-75.0822680013139"));
  point.appendChild(longitude);

  // 构造<POINT>下的第四个<LAIITUDE>子节点
  Element latitude = this.document.createElement("LATITUDE");
  latitude.appendChild(this.document.createTextNode("56.09825589333556"));
  point.appendChild(latitude);

  // 将所有的<POINT>子节点都添加给<POINTS>节点
  points.appendChild(point);
  // 将POINTS节点添加给XML节点
  xml.appendChild(points);
 }

 /**
  * 保存XML文件
  */
 public void saveXml() {
  TransformerFactory tf = TransformerFactory.newInstance();
  try {
   Transformer transformer = tf.newTransformer();
   transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
   transformer.setOutputProperty(OutputKeys.INDENT, "yes");
   DOMSource source = new DOMSource(document);
   // 将文件输出
   FileOutputStream fs = new FileOutputStream(fileName);
   // 读取文件
   PrintWriter pw = new PrintWriter(fs);
   // 存储文件
   StreamResult result = new StreamResult(pw);
   // 接收文件
   transformer.transform(source, result);
  } catch (TransformerConfigurationException e) {
   System.out.println(e.getMessage());
   e.printStackTrace();
  } catch (TransformerException e) {
   System.out.println(e.getMessage());
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   System.out.println(e.getMessage());
   e.printStackTrace();
  }
 }

 public static void main(String[] args) {
  DomXmlDemo dxd = new DomXmlDemo("F:/XmlLAndOpenLayers1/examples/xml/AAxml.xml");
  dxd.createXml();
  dxd.saveXml();
  System.out.println("XML文件已生成请查看 " + fileName + " 目录下的XML文件");
 }
}

--------------------------------------------------------------------
生成的ML文件:

<?xml version="1.0" encoding="UTF-8"?>
<XML>
<POINTS>
<POINT>
<NAME>First Point</NAME>
<COLOR>#000066</COLOR>
<LONGITUDE>-75.0822680013139</LONGITUDE>
<LATITUDE>56.09825589333556</LATITUDE>
</POINT>
</POINTS>
</XML>

---------------------------------------------------------------------
JavaScript代码:

<html>
<head>
  <title>OpenLayers Example</title>
    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
    <script src="../lib/OpenLayers.js"></script>
 <style type="text/css">
    #map {width:950px;height:483px;border:1px solid black;} /*dashed 虚线 solid 实线*/
</style>

<script type="text/javascript">
function test(lg,lt,sname,scolor)
{
  var pointE=new OpenLayers.Geometry.Point(lg,lt);
  var pointFeatureE=new OpenLayers.Feature.Vector(pointE);
      pointFeatureE.attributes={name:sname,favColor:scolor,align:"rt"};
      return pointFeatureE;
 }

//解析XML文件
var pointElementSize;
var outName=Array(),outColor=Array(),outlg=Array(),outlt=Array();
function parseXML()
 {
   try{
     xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
 }catch(e){
   try{
    xmlDoc=document.implementation.createDocument("","",null);
  }
  catch(e){
    alert(e.message);
    return;
  }
  }
  xmlDoc.async=false;
  //获取xml文件
  xmlDoc.load("F:/XmlLAndOpenLayers1/examples/xml/BBxml.xml");
  //获取所有POINT节点的个数
  pointElementSize=xmlDoc.getElementsByTagName("POINT").length;
  //循环显示所有POINT下节点下的子节点的值
  for(var i=0;i<pointElementSize;i++){
    outName[i]=xmlDoc.getElementsByTagName("NAME")[i].childNodes[0].nodeValue;
    outColor[i]=xmlDoc.getElementsByTagName("COLOR")[i].childNodes[0].nodeValue;
    outlg[i]=xmlDoc.getElementsByTagName("LONGITUDE")[i].childNodes[0].nodeValue;
    outlt[i]=xmlDoc.getElementsByTagName("LATITUDE")[i].childNodes[0].nodeValue;
   }
}

//获取地图层
function inits(){
  parseXML();
  var map;
  map=new OpenLayers.Map('map');
  var layer=new OpenLayers.Layer.WMS("OpenLayers WMS","http://labs.metacarta.com/wms/vmap0",{layers:'basic'});
  map.addLayer(layer);
  var renderer=OpenLayers.Util.getParameters(window.location.href).renderer;
  renderer=(renderer)?[renderer]:OpenLayers.Layer.Vector.prototype.renderers;
  //定义要显示图层的各种样式
  var vectorLayer=new OpenLayers.Layer.Vector("Simple Geometry",{styleMap:new OpenLayers.StyleMap({'default':{
   strokeOpacity:1,
   fillColor:"Black",//点的颜色
     strokeColor:"yellow",//点的边框颜色
   strokeWidth:1,//点边框的宽度
   fillOpacity:1,//透明度
   pointRadius:4,//点的大小
   pointEvents:"visiblePainted",//点击点的事件
   label:"${name}",//欲显示的值
   fontColor:"${favColor}",//字体颜色
   fontSize:"12px",//字体大小
   fontFamily:"Courier New,monospace",
   fontWeight:"bold",
   labelAlign:"${align}"//字体显示的在点附近的那个位置
  }}),
 renderers:renderer
  });
  var point=new OpenLayers.Geometry.Point(-80.04,45.68);//确定地图显示是中心位置所在的点的经纬度
  //将vectorLayer添加到map层上
  map.addLayer(vectorLayer);
  //确定地图加载显示的位置
  map.setCenter(new OpenLayers.LonLat(point.x,point.y),3);
  //循环将所有的点都添加显示在图层上
  for(var i=0;i<pointElementSize;i++){
     vectorLayer.addFeatures([test(outlg[i],outlt[i],outName[i],outColor[i])]);
   }
 }
 </script>
</head>
<body onload="inits()">
  <p>
  <div>
  <strong>
   <font style="font-size:18px;">解析XML并用OpenLayers将获取的数据显示在地图上</font>
  </strong>
  </div>
  <div id="map"></div>
</body>
</html>

 

原创粉丝点击