1. 程式人生 > >經緯座標(BLH)資料建立.kml檔案小工具設計 Java版

經緯座標(BLH)資料建立.kml檔案小工具設計 Java版

  技術背景
  
  KML,是標記語言(Keyhole Markup Language)的縮寫,最初由Keyhole公司開發,是一種基於XML 語法與格式的、用於描述和儲存地理資訊(如點、線、影象、多邊形和模型等)的編碼規範,可以被 Google Earth 和 Google Maps 識別並顯示。
  
  建立這個工具只是因為一次偶然的需求,因為要將一個2G的點雲資料導到Google Earth上進行顯示,手動編輯絕對是不可能的,所以臨時建立了這個小工具,為了方便使用,添加了一些簡易的操作介面,這樣便可以批量寫入經緯度三維座標資料(含高程)至kml檔案內,然後匯入Google Earth進行顯示。關於kml檔案的內部格式這裡就不再詳細描述了,具體內容請檢視參考部落格1【KML地圖檔案解析】。下面具體講述一下程式設計原理。
  
  實現原理
  
  本程式核心原理是很簡單的,首先將.csv(或.txt)檔案(內部格式為B,L,H 一行一個點座標)讀取以後,建立kml檔案的頭,然後根據kml檔案的固定格式,將資料寫入,最後檔案寫入完成以後,新增上檔案的尾部格式。檔案選擇採用的是JFileChooser,具體使用方法請檢視參考部落格2【swing中JFileChooser的用法】。
  
  最後是介面的簡要製作,新增兩個控制元件,一個是用來選擇檔案的,另一個為程式退出按鈕。不再具體闡述了,原理比較簡單,直接上程式碼吧。
  
  具體實現
  
  專案結構
  
  image
  
  核心部分
  
  複製程式碼
  
  1 package main;
  
  2
  
  3 import java.io.BufferedWriter;
  
  4 import java.io.File;
  
  5 import java.io.FileNotFoundException;
  
  6 import java.io.FileOutputStream;
  
  7 import java.io.FileReader;
  
  8 import java.io.FileWriter;
  
  9 import java.io.IOException;
  
  10 import java.io.LineNumberReader;
  
  11 import java.io.PrintStream;
  
  12 import javax.swing.JFileChooser;
  
  13 import javax.swing.JLabel;
  
  14
  
  15 public class BlhToKml {
  
  16
  
  17     /**
  
  18      * @param args
  
  19      */
  
  20     public static String InputFilePath;
  
  21     public static String OutputFilePath;
  
  22     @SuppressWarnings("static-access")
  
  23     public static void main() throws IOException{
  
  24         JFileChooser jfc=new JFileChooser();
  
  25         jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );
  
  26         jfc.showDialog(new JLabel(), "選擇檔案");
  
  27         File file = jfc.getSelectedFile();
  
  28         if(file == null){
  
  29             return;
  
  30         }
  
  31         String FilePath = file.getAbsolutePath();
  
  32         InputFilePath=FilePath;
  
  33         OutputFilePath=www.leyouzaixian2.com InputFilePath;
  
  34         if(OutputFilePath.www.dfgjyl.cn www.365soke.com/ indexOf(www.hjpt521.com ".")>=0)
  
  35          {
  
  36             OutputFilePath = OutputFilePath.substring(0, OutputFilePath.lastIndexOf("."));
  
  37          }else{
  
  38             return;
  
  39          }
  
  40         OutputFilePath=OutputFilePath+".kml";
  
  41         //System.out.println(OutputFilePath);
  
  42         WriteHeadInformationToFile1();
  
  43         WriteHeadInformationToFile2();
  
  44         ReplacePointInformation(www.mcyllpt.com);
  
  45         WriteEndInformationToFile(www.gcyl159.com);
  
  46         TipFrame TF = new TipFrame(www.gcyl152.com);
  
  47         TF.tishifu("已經轉換完成!");
  
  48     }
  
  49     //將標題寫入到指定路徑下的文字內
  
  50     public static void WriteHeadInformationToFile1() {
  
  51         String filePath = OutputFilePath;
  
  52         try {
  
  53             File file = new File(filePath);
  
  54             PrintStream ps = new PrintStream(new FileOutputStream(file));
  
  55             ps.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
  
  56             ps.append("<kml xmlns=\"http://www.opengis.net/kml/2.2\" xmlns:gx=\"http://www.google.com/kml/ext/2.2\" xmlns:kml=\"http://www.opengis.net/kml/2.2\"\r\n");
  
  57         } catch (FileNotFoundException e){
  
  58             e.printStackTrace();
  
  59         }
  
  60     }
  
  61     public static void WriteHeadInformationToFile2(){
  
  62         String filePath = OutputFilePath;
  
  63         try {
  
  64             FileWriter fw = new FileWriter(filePath, true);
  
  65             BufferedWriter bw = new BufferedWriter(fw);
  
  66             bw.write("xmlns:atom=\"http://www.w3.org/2005/Atom\">\r\n");
  
  67             bw.write("<Document>\r\n");
  
  68             bw.write("\t<name>Placemark.kml</name>\r\n");
  
  69             bw.write("\t<Style id=\"sh_placemark_circle_highlight\">\r\n");
  
  70             bw.write("\t\t<IconStyle>\r\n");
  
  71             bw.write("\t\t\t<color>ff0000ff</color>\r\n");
  
  72             bw.write("\t\t\t<scale>0.8</scale>\r\n");
  
  73             bw.write("\t\t\t<Icon>\r\n");
  
  74             bw.write("\t\t\t\t<href>http://maps.google.com/mapfiles/kml/shapes/open-diamond.png</href>\r\n");
  
  75             bw.write("\t\t\t</Icon>\r\n");
  
  76             bw.write("\t\t</IconStyle>\r\n");
  
  77             bw.write("\t\t<ListStyle>\r\n");
  
  78             bw.write("\t\t</ListStyle>\r\n");
  
  79             bw.write("\t</Style>\r\n");
  
  80             bw.write("\t<StyleMap id=\"msn_placemark_circle\">\r\n");
  
  81             bw.write("\t\t<Pair>\r\n");
  
  82             bw.write("\t\t\t<key>normal</key>\r\n");
  
  83             bw.write("\t\t\t<styleUrl>#sn_placemark_circle</styleUrl>\r\n");
  
  84             bw.write("\t\t</Pair>\r\n");
  
  85             bw.write("\t\t<Pair>\r\n");
  
  86             bw.write("\t\t\t<key>highlight</key>\r\n");
  
  87             bw.write("\t\t\t<styleUrl>#sh_placemark_circle_highlight</styleUrl>\r\n");
  
  88             bw.write("\t\t</Pair>\r\n");
  
  89             bw.write("\t</StyleMap>\r\n");
  
  90             bw.close();
  
  91             fw.close();
  
  92         } catch (Exception e) {
  
  93             e.printStackTrace();
  
  94         }
  
  95     }
  
  96     public static void ReplacePointInformation() throws IOException {
  
  97         String filePath = OutputFilePath;
  
  98         File sourceFile = new File(InputFilePath);
  
  99         int lineNum = getTotalLines(sourceFile);
  
  100         try {
  
  101             FileWriter fw = new FileWriter(filePath, true);
  
  102             BufferedWriter bw = new BufferedWriter(fw);
  
  103             for(int i = 0;i<lineNum;i++){
  
  104                 bw.write("\t<Placemark>\r\n");
  
  105                 bw.write("\t\t<styleUrl>#msn_placemark_circle</styleUrl>\r\n");
  
  106                 bw.write("\t\t<Point>\r\n");
  
  107                 String str1=readAppointedLineNumber(sourceFile, i+1);
  
  108                 bw.write("\t\t\t<coordinates>"+str1+",</coordinates>\r\n");
  
  109                 bw.write("\t\t</Point>\r\n");
  
  110                 bw.write("\t</Placemark>\r\n");
  
  111             }
  
  112             bw.close();
  
  113             fw.close();
  
  114         } catch (Exception e) {
  
  115             e.printStackTrace();
  
  116         }
  
  117     }
  
  118     public static void WriteEndInformationToFile() {
  
  119         String filePath = OutputFilePath;
  
  120         try {
  
  121             FileWriter fw = new FileWriter(filePath, true);
  
  122             BufferedWriter bw = new BufferedWriter(fw);
  
  123             bw.write("</Document>\r\n");
  
  124             bw.write("</kml>");
  
  125             bw.close();
  
  126             fw.close();
  
  127         } catch (Exception e) {
  
  128             e.printStackTrace();
  
  129         }
  
  130     }
  
  131     // 讀取檔案指定行。
  
  132     public static String readAppointedLineNumber(File sourceFile, int lineNumber)
  
  133             throws IOException {
  
  134         FileReader in = new FileReader(sourceFile);
  
  135         LineNumberReader reader = new LineNumberReader(in);
  
  136         String s = "";
  
  137         if (lineNumber <= 0 || lineNumber > getTotalLines(sourceFile)) {
  
  138             System.out.println("不在檔案的行數範圍(1至總行數)之內。");
  
  139             System.exit(0);
  
  140         }
  
  141         int lines = 0;
  
  142         while (s != null) {
  
  143             lines++;
  
  144             s = reader.readLine();
  
  145             if((lines - lineNumber) == 0) {
  
  146                 //System.out.println(s);
  
  147                 return s;
  
  148             }
  
  149         }
  
  150         reader.close();
  
  151         in.close();
  
  152         return s;
  
  153     }
  
  154     // 檔案內容的總行數。
  
  155     public static int getTotalLines(File file) throws IOException {
  
  156         FileReader in = new FileReader(file);
  
  157         LineNumberReader reader = new LineNumberReader(in);
  
  158         String s = reader.readLine();
  
  159         int lines = 0;
  
  160         while (s != null) {
  
  161             lines++;
  
  162             s = reader.readLine();
  
  163             if(lines>=2){
  
  164                 if(s!=null){
  
  165                     //System.out.println(s+"$");
  
  166                 }
  
  167             }
  
  168         }
  
  169         reader.close();
  
  170         in.close();
  
  171         //System.out.println(lines);
  
  172         return lines;
  
  173     }
  
  174 }
  
  複製程式碼
  
  窗體部分1-主介面
  
  複製程式碼
  
  1 package main;
  
  2
  
  3 import java.awt.Color;
  
  4 import java.awt.FlowLayout;
  
  5 import java.awt.Font;
  
  6 import java.awt.Frame;
  
  7 import java.awt.Label;
  
  8 import java.awt.event.ActionEvent;
  
  9 import java.awt.event.ActionListener;
  
  10 import java.awt.event.WindowAdapter;
  
  11 import java.awt.event.WindowEvent;
  
  12 import java.io.IOException;
  
  13 import javax.swing.JButton;
  
  14 import javax.swing.JLabel;
  
  15 import javax.swing.JPanel;
  
  16
  
  17 public class Frame1 {
  
  18
  
  19     /**
  
  20      * @param args
  
  21      */
  
  22     public static void main(String[] args) {
  
  23         // TODO Auto-generated method stub
  
  24         major_Frame();
  
  25     }
  
  26     public static void major_Frame(){
  
  27         final Frame major = new Frame("KML轉換器");
  
  28         major.setLayout(new FlowLayout(FlowLayout.CENTER));
  
  29         major.setBounds(400, 300, 430, 250);
  
  30         major.setBackground(new Color(255,255,255));
  
  31         JPanel jPanel = new JPanel();//建立jPanel
  
  32         jPanel.setBackground(new Color(255,255,255) );
  
  33         jPanel.add(new JLabel("<html><br>\t每一行的資料屬性為:精度,緯度,高程。每一個數據之間用英<br>" +
  
  34                 "文逗號隔開。<br><br><br></html>