快速生成百度地圖大數據覆蓋物的方法研究
阿新 • • 發佈:2018-06-14
sys 實例化 pat lis csv AC () ima tla 由於必須大批量的加載覆蓋物,要求必須要秒級,在看了百度提供的mapv大數據展示,有所啟發,地址:http://mapv.baidu.com/gallery.html
因為之前數據都存在數據庫,通過下載demo裏面的文件,發現他們加載的基本都是csv或者json文件,我就想如果對於靜態數據,將我所有多的數據放到文件裏面直接加載再好不過,於是我就進行了代碼的編寫,首先是生成能夠解析的文件,對照文件格式分別生成了畫線段和面的方法,代碼大概如下:
package usi.product.showfile; import java.io.IOException; import java.nio.charset.Charset; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import com.csvreader.CsvWriter; /** * * @author Rawirm *這個類用來生成csv文件,該文件用來加載的是道路的信息,道路信息一條占一行進行存儲的 */ public class ProduceBuildingFile { public static void main(String[] args) throws IOException { List<BuildingCover> list=getDBData(); List<JsonString> list2=dealGroupMsg2(list); writeFile(list2,"H://移動大數據//測試數據等//buidingString.csv"); System.out.println("文件已經生成!"); } public static List<JsonString> dealGroupMsg2(List<BuildingCover> rs){ List<JsonString> list=new ArrayList<JsonString>(); Map<String, List<String>> result = null; if(rs.size() > 0){ result=new HashMap<String, List<String>>(); for (int i=0;i<rs.size();i++) { String key=rs.get(i).getGroupid(); String value="["+rs.get(i).getLongitude()+","+rs.get(i).getLatitude()+"]"; if(result.containsKey(key)){ result.get(key).add(value); }else{ List<String> valueList = new ArrayList<String>(); valueList.add(value); result.put(key, valueList); } } } Set<String> s = result.keySet(); for(String key : s){ JsonString js=new JsonString(); js.setGroupid(key); js.setCoordinate(result.get(key)); list.add(js); } return list; } /** * 連接數據庫的方法 */ public static List<BuildingCover> getDBData(){ List<BuildingCover> list =new ArrayList<BuildingCover>(); Connection con = null;// 創建一個數據庫連接 PreparedStatement pre = null;// 創建預編譯語句對象,一般都是用這個而不用Statement ResultSet rs = null;// 創建一個結果集對象 try { Class.forName("oracle.jdbc.driver.OracleDriver");// 加載Oracle驅動程序 System.out.println("開始嘗試連接數據庫!"); String url = "jdbc:oracle:" + "thin:@localhost:1521:test";// 127.0.0.1是本機地址,XE是精簡版Oracle的默認數據庫名 String user = "****";// 用戶名,系統默認的賬戶名 String password = "****";// 你安裝時選設置的密碼 con = DriverManager.getConnection(url, user, password);// 獲取連接 System.out.println("連接成功!"); String sql = "select t.pointid,t.groupid,t.longitude,t.latitude from road_building_msg_test t where t.groupid like ‘b%‘ order by t.pointid ";// 預編譯語句,“?”代表參數 pre = con.prepareStatement(sql);// 實例化預編譯語句 rs = pre.executeQuery();// 執行查詢,註意括號中不需要再加參數 while (rs.next()){ Transform transform =new Transform(); Point point=transform.wgs84tobd09(rs.getString("longitude"),rs.getString("latitude")); BuildingCover buildingCover=new BuildingCover(); buildingCover.setPointid(rs.getString("pointid")); buildingCover.setGroupid(rs.getString("groupid")); buildingCover.setLongitude(point.getLng()+""); buildingCover.setLatitude(point.getLat()+""); list.add(buildingCover); } }catch (Exception e){ e.printStackTrace(); }finally{ try { // 逐一將上面的幾個對象關閉,因為不關閉的話會影響性能、並且占用資源 // 註意關閉的順序,最後使用的最先關閉 if (rs != null) rs.close(); if (pre != null) pre.close(); if (con != null) con.close(); System.out.println("數據庫連接已關閉!"); } catch (Exception e) { e.printStackTrace(); } } return list; } /** * 寫csv文件的方法 * @throws IOException */ public static void writeFile(List<JsonString> str,String outputPath) throws IOException{ //取出數據循環寫進一張新的表 CsvWriter wr =new CsvWriter(outputPath,‘,‘,Charset.forName("GBK")); String[] headers = {"geometry"}; wr.writeRecord(headers); for(int i=0;i<str.size();i++){ String[] data={"{\"type\": \"Polygon\", \"coordinates\":["+str.get(i).getCoordinate()+"]}"}; wr.writeRecord(data); } wr.close(); }
裏面有其他的方法註釋了,用到就用,不用拉到,自己改!!!最終1秒立馬點都有了,現在不多大概幾萬個-----
快速生成百度地圖大數據覆蓋物的方法研究