由于必须大批量的加载覆盖物, 要求必须要秒级, 在看了百度提供的 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 秒立马点都有了, 现在不多大概几万个 -----
来源: http://blog.51cto.com/11964104/2129474