1. 程式人生 > >快速生成百度地圖大數據覆蓋物的方法研究

快速生成百度地圖大數據覆蓋物的方法研究

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秒立馬點都有了,現在不多大概幾萬個-----

技術分享圖片

快速生成百度地圖大數據覆蓋物的方法研究