快速生成百度地图大数据覆盖物的方法研究
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速生成百度地图大数据覆盖物的方法研究相关的知识,希望对你有一定的参考价值。
由于必须大批量的加载覆盖物,要求必须要秒级,在看了百度提供的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秒立马点都有了,现在不多大概几万个-----
以上是关于快速生成百度地图大数据覆盖物的方法研究的主要内容,如果未能解决你的问题,请参考以下文章