e47db889 by chiangbt

update3

1 parent c102032f
No preview for this file type
......@@ -4,15 +4,15 @@ TiandituDownload主要用于下载天地图数据,其坐标系为CGCS2000.
```java
// 设置要下载的图片存储sqlite路径
TiandituDownload tiandituDownload = new TiandituDownload("my.db");
// 范围起始点(左下角、右上角)
Point pt = new Point(29.76,106.64);
Point pt2 = new Point(35.33, 108.12);
// 下载器
// 2 为最小level,9为最大level
// TianDiTuTiledMapServiceType.IMG_C 为下载数据类型
// 最后一个参数为merge,为true时,会将地图及其注记一并下载融合到一张图片中去
tiandituDownload.Download(pt, pt2, 2,9, TianDiTuTiledMapServiceType.IMG_C, true);
// 设置要下载的图片存储sqlite路径
TiandituDownload tiandituDownload = new TiandituDownload("my.db");
// 范围起始点(左下角、右上角)
Point pt = new Point(29.76,106.64);
Point pt2 = new Point(35.33, 108.12);
// 下载器
// 2 为最小level,9为最大level
// TianDiTuTiledMapServiceType.IMG_C 为下载数据类型
// 最后一个参数为merge,为true时,会将地图及其注记一并下载融合到一张图片中去
tiandituDownload.Download(pt, pt2, 2,9, TianDiTuTiledMapServiceType.IMG_C, true);
```
\ No newline at end of file
......
......@@ -12,6 +12,7 @@ public class Main{
TiandituDownload tiandituDownload = new TiandituDownload("my.db");
Point pt = new Point(29.76,106.64);
Point pt2 = new Point(35.33, 108.12);
tiandituDownload.Download(pt, pt2, 2,9, TianDiTuTiledMapServiceType.VEC_C, true);
tiandituDownload.Download(pt, pt2, 7,9, TianDiTuTiledMapServiceType.VEC_C, true);
}
}
......
......@@ -16,6 +16,10 @@ import java.sql.*;
public class TiandituDownload {
// 级别
int[] level = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
// 分辨率
double[] res = {
1.40625,
0.703125,
......@@ -39,6 +43,7 @@ public class TiandituDownload {
2.68220901489258E-06,
1.34110450744629E-06
};
// 比例尺
double[] scale = {
400000000,
295497598.5708346,
......@@ -60,69 +65,83 @@ public class TiandituDownload {
4508.93552506767,
2254.467762533835,
1127.2338812669175,
563.616940
563.61694063345875
};
// 最小级别
int minLevel = 1;
// 最大级别
int maxLevel = 2;
// 保存数据的sqlite文件路径
String dbpath;
// SQLite链接
Connection conn = null;
Statement stmt = null;
public TiandituDownload(String dbpath){
this.dbpath =dbpath;
public TiandituDownload(String dbpath) {
this.dbpath = dbpath;
}
private CalEnv calculateEnv(Point originPoint, int level){
int startX = (int) Math.floor((originPoint.getLng() + 180)/(256 * res[level]));
int startY = (int) Math.floor((90 - originPoint.getLat())/(256 * res[level]));
if(startX<0)startX = 0;
if(startY<0)startY = 0;
/**
*
* @param originPoint 坐标点
* @param level 级别
* @return 改点在该级别所属的地图瓦片行列号
*/
private CalEnv calculateEnv(Point originPoint, int level) {
int startX = (int) Math.floor((originPoint.getLng() + 180) / (256 * res[level]));
int startY = (int) Math.floor((90 - originPoint.getLat()) / (256 * res[level]));
if (startX < 0) startX = 0;
if (startY < 0) startY = 0;
return new CalEnv(startX, startY);
}
private void Download(Point minPoint, Point maxPoint, int level, TianDiTuTiledMapServiceType type, boolean merge){
/**
*
* @param minPoint 下载范围左下角坐标
* @param maxPoint 下载范围右上角坐标
* @param level 下载级别
* @param type 下载数据类型
* @param merge 数据与其注记是否融合
*/
private void downloadSingLevelTiles(Point minPoint, Point maxPoint, int level, TianDiTuTiledMapServiceType type, boolean merge) {
try{
try {
CalEnv startEnv = calculateEnv(minPoint, level);
CalEnv stopEnv = calculateEnv(maxPoint, level);
// System.out.println(startEnv.getStartX() + ":" +startEnv.getStartY());
// System.out.println(stopEnv.getStartX() + ":" +stopEnv.getStartY());
PreparedStatement preparedStatement;
ResultSet rs;
for(int i = startEnv.getStartX(); i <= stopEnv.getStartX(); i++){
for(int j = stopEnv.getStartY(); j<= startEnv.getStartY(); j++){
for (int i = startEnv.getStartCol(); i <= stopEnv.getStartCol(); i++) {
for (int j = stopEnv.getStartRow(); j <= startEnv.getStartRow(); j++) {
boolean hasData = false;
try{
try {
// 查询瓦片是否存在
String querySQL = "select * from " + type + " where TILELEVEL = " + level + " and TILECOL = " + i + " and TILEROW = " + j;
rs = stmt.executeQuery(querySQL);
while(rs.next()){
while (rs.next()) {
hasData = true;
}
// 如果不存在
if(!hasData){
// 如果不存在则从网络获取
if (!hasData) {
String url = new TDTUrl(level, i, j, type).generatUrl();
// 获得地图瓦片
// 获得地图瓦片数据流
byte[] img = getTile(url);
System.out.println("正在下载 "+url);
System.out.println("正在下载 " + url);
// 如果merge为true,则在下载img_c或vec_c时将其注记图片一并下载
if(merge) {
if (merge) {
InputStream img_stream = new ByteArrayInputStream(img);
BufferedImage bImageFromConvert = ImageIO.read(img_stream);
String url2 = "";
if(type == TianDiTuTiledMapServiceType.IMG_C) {
if (type == TianDiTuTiledMapServiceType.IMG_C) {
url2 = new TDTUrl(level, i, j, TianDiTuTiledMapServiceType.CIA_C).generatUrl();
}else{
} else {
url2 = new TDTUrl(level, i, j, TianDiTuTiledMapServiceType.CVA_C).generatUrl();
}
byte[] img2 = getTile(url2);
......@@ -140,7 +159,7 @@ public class TiandituDownload {
baos.close();
}
// 将数据写入sqlite
String insertSQL = "INSERT INTO "+ type + "(TILELEVEL,TILECOL,TILEROW,TILEDATA) VALUES (?,?,?,?)";
String insertSQL = "INSERT INTO " + type + "(TILELEVEL,TILECOL,TILEROW,TILEDATA) VALUES (?,?,?,?)";
preparedStatement = conn.prepareStatement(insertSQL);
preparedStatement.setInt(1, level);
preparedStatement.setInt(2, i);
......@@ -148,17 +167,27 @@ public class TiandituDownload {
preparedStatement.setBytes(4, img);
preparedStatement.execute();
}
}catch (Exception e){
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
conn.commit();
}
}catch (Exception e){
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
/**
*
* @param minPoint 下载范围左下角坐标
* @param maxPoint 下载范围右上角坐标
* @param minLevel 下载最小级别
* @param maxLevel 下载最大级别
* @param type 下载数据类型
* @param merge 数据与其注记是否融合
* @throws SQLException
*/
public void Download(Point minPoint, Point maxPoint, int minLevel, int maxLevel, TianDiTuTiledMapServiceType type, boolean merge) throws SQLException {
try {
Class.forName("org.sqlite.JDBC");
......@@ -174,17 +203,23 @@ public class TiandituDownload {
stmt.executeUpdate(sql);
stmt.close();
for(int m = minLevel; m<= maxLevel; m++){
this.Download(minPoint, maxPoint, m, type, merge);
for (int m = minLevel; m <= maxLevel; m++) {
this.downloadSingLevelTiles(minPoint, maxPoint, m, type, merge);
}
conn.close();
System.out.println("下载完成");
}catch (Exception e){
} catch (Exception e) {
}
}
/**
* 下载网络数据
* @param url
* @return 图片数据流
* @throws Exception
*/
protected byte[] getTile(String url) throws Exception {
byte[] result = null;
try {
......
package utils;
/**
* 范围计算后的Row与Col类
*/
public class CalEnv {
private int startX;
private int startCol;
private int startY;
private int startRow;
public CalEnv(int startX, int startY) {
this.startX = startX;
this.startY = startY;
this.startCol = startX;
this.startRow = startY;
}
public int getStartX() {
return startX;
public int getStartCol() {
return startCol;
}
public void setStartX(int startX) {
this.startX = startX;
public void setStartCol(int startCol) {
this.startCol = startCol;
}
public int getStartY() {
return startY;
public int getStartRow() {
return startRow;
}
public void setStartY(int startY) {
this.startY = startY;
public void setStartRow(int startRow) {
this.startRow = startRow;
}
}
......
package utils;
/**
* 坐标点类
*/
public class Point {
private double lat;
......