全国高清卫星影像(Google Earth)无偏移地图(19级,0.6米精度)免费送了
自从Google Earth 无法访问后,作为开发者的我感同身受,非常理解那么同行们的感受。
好在我已经下载了全国的地图数据,抱着一颗数据来源于网络服务于网络的心态,我把
我手上的全国Google Earth 19级数据免费的开放给大家,旨在能尽一点绵薄之力,避免
被那些不法之徒用来获取暴利。
数据我已经上传到百度云盘:目前已经把全国33个省、直辖市、特别行政区数据已经完全
传到网盘,总量约10T左右。


需要的朋友,可以通过微信搜索“JingWeiKuaiTu”微信号,获取地图。

当然如果有朋友特别急着用,也可以通过邮寄硬盘给到我这边,我会把全国的数据一并copy到硬盘
在回寄回去。
关于文件格式
通常我们在工作中下载谷歌卫星影像数据时,轻则几百M,重则几百个G甚至上TB级。影像数据太大,是大家经常会遇到的一个问题,
尤其是向下载一个省以上数据的时候该问题尤为突出。那么该问题是否有一个比较好的解决方案呢?
以全球为例,我们以19级为例,共有2^18 * 2^17 张瓦片,如此多的瓦片会让磁盘愈来愈慢,同时也无法维护。花费时间越来越长,最后不了了之。
当影像下载范围比较大时,我们可以采用金字塔分块下载的方式进行下载,系统会自动将大范围分成若干个块,且块与块之间是可以无缝拼接的。
一般情况我们选择全球前10级别作为基础级别,因数据量不大(越1G)左右,后续以10级作为基础级别,
全球19级别数据被划分为 2^8 * 2^7(512 * 256)个块。每个块中包含了512 * 256 张小瓦片。
采用高效的索引方式进行存储,全球前10级别的数据存储成一个文件(.fepk),11-19级别存储为n个文件。
例如全球第10级一共有 512 * 256 张瓦片(从第0级别开始计算),那么全球11-19级别会有512 * 256 个文件(.fepk)
数据包的命名:
8-126-234.fepk,其中:8:表示级别,126: 表示列号, 234: 表示行号,是第八级瓦片的编号,那么该文件
中将存储由当8-126-234瓦片分裂出来的所有子孙瓦片,8,9,10,11,12,13,14,15,16,17,... 所有级别的所有数据

文件格式开放
作为开发者深知每一家的地图格式都不尽相同,都有自己的规则,我这里把文件的存储格式开发给大家,起到抛砖引玉的左右
期待有更好的存储格式出现,共同提升国内GIS水平。
1 FEPK文件格式说明
我们一般不会直接采用瓦片作为管理单元,会把一个块作为管理单元,把数据划分为索引文件与数据文件,如下所示:
数据文件:world.fepk
索引文件:world.fepk.idx
1.1 索引文件
表 1字段说明
|
文件头 |
字段 |
值 |
|
文件头 |
char szMagic[20] |
fe.tile.store.data20字节 |
|
uint version |
版本号4字节 |
|
|
uint typeId |
数据类型 enumPKType { PK_IMAGE , PK_DEM, PK_VEC, PK_QXSY, PK_USER, };4字节 |
|
|
uint wgs84 |
是否是wgs84经纬投影4字节 |
|
|
uint flag |
4字节 |
|
|
uint64 timestamp |
时间戳8字节 |
|
|
float2 vStart |
经纬度最小范围4*2字节 |
|
|
float2 vEnd |
经纬度最大范围 4*2字节 |
|
|
LevSnaplevOff[24] |
级别索引,8 * 24 字节 |
|
|
char _reserve[240] |
保留 |
|
|
级别1 |
int2 _start |
2 * 4字节,瓦片最小行列号 |
|
int2 _end |
2 * 4字节,瓦片最大行列号 |
|
|
uint32 _offset |
4字节 |
|
|
uint32 _dataSize |
4字节 |
|
|
uint _lev |
4字节 |
|
|
char _reserve[216] |
216字节 |
|
|
瓦片数据索引矩阵数据PKTLHeader |
N * PKTLHeader N = (_end.x - _start.x + 1) * (_end.y - _start.y + 1) |
|
|
|
PKTLHeader |
|
|
级别2 |
|
|
|
级别3 |
|
|
|
级别… |
|
|
PKTLHeader定义:
struct PKTLHeader
{
/// 有无数据标记,即服务器上是否有该数据 0,无,1,有
uint64 _data:1;
/// 在本文件中是否已经存储 0,无,1,有
uint64 _stored:1;
/// 状态,
uint64 _state :1;
/// 数据地址,使用50个bit最大 2^54
/// 单个文件最大16 K T
uint64 _offset : 61;
/// 如果该值!= 0xFFFF,则有效,否则无效,
/// 使用该字段的意义在于解决网络读取问题,比如在云盘上
/// 先读取索引,如果没有数据大小,或者数据大小存储在数据文件中,则需要
/// 再次访问数据文件,才可以得大小,增加额外的IO,同时兼顾大小,该变量最大可以存储64K
/// 如果超过了64K,那么一样的需要访问数据文件获取大小
ushort _dataSize;
};
共计10自字节
LevSnap定义:
struct LevSnap
{
uint64 _lev:5;
uint64 _offset:59;
};
共计8字节
1.2 数据文件文件
|
文件头 |
字段 |
值 |
|
文件头 |
char szMagic[20] |
fe.tile.store.data20字节 |
|
uint version |
版本号4字节 |
|
|
uint typeId |
数据类型 enumPKType { PK_IMAGE , PK_DEM, PK_VEC, PK_QXSY, PK_USER, };4字节 |
|
|
uint wgs84 |
是否是wgs84经纬投影4字节 |
|
|
uint flag |
4字节 |
|
|
uint64 timestamp |
时间戳8字节 |
|
|
float2 vStart |
经纬度最小范围4*2字节 |
|
|
float2 vEnd |
经纬度最大范围 4*2字节 |
|
|
LevSnaplevOff[24] |
级别索引,8 * 24 字节 |
|
|
char _reserve[240] |
保留 |
|
|
数据0 |
Int4 |
4*4字节,行号,列号,级别,大小 |
|
数据 |
|
|
|
数据1 |
Int4 |
4*4字节,行号,列号,级别,大小 |
|
数据 |
|
|
|
数据… |
Int4 |
4*4字节,行号,列号,级别,大小 |
|
数据 |
|
1.3 访问SDK
为了方便大家使用数据,提供了C语言版本的SDK(x86/x64)两个版本
#pragma once
typedef void* FEPKFile;
/// 该文件不可以被修改
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned __int64 uint64;
struct FEPHHeader
{
/// 有无数据标记,即服务器上是否有该数据 0,无,1,有
uint64 _data : 1;
/// 在本文件中是否已经存储 0,无,1,有
uint64 _stored : 1;
/// 状态,
uint64 _state : 1;
/// 数据地址,使用50个bit最大 2^56
/// 单个文件最大16 K T
uint64 _offset : 61;
/// 如果该值!= 0xFFFF,则有效,否则无效,
/// 使用该字段的意义在于解决网络读取问题,比如在云盘上
/// 先读取索引,如果没有数据大小,或者数据大小存储在数据文件中,则需要
/// 再次访问数据文件,才可以得大小,增加额外的IO,同时兼顾大小,该变量最大可以存储64K
/// 如果超过了64K,那么一样的需要访问数据文件获取大小
ushort _dataSize;
};
extern "C"
{
/// <summary>
/// 打开文件函数,可以打开索引也可以打开数据文件
/// </summary>
/// <param name = "fileName">文件名称</param>
/// <return>0:失败,否则成功</return>
FEPKFile fepkOpenFile(const char* fileName);
/// <summary>
/// 读取索引数据函数
/// </summary>
/// <param name = "file">索引文件指针</param>
/// <param name = "x">列号</param>
/// <param name = "y">行号</param>
/// <param name = "z">级别</param>
/// <param name = "header">返回文件头信息</param>
/// <return>true:false</return>
bool fepkReadHeader(FEPKFile file,int x,int y,int z,FEPHHeader* header);
/// <summary>
/// 根据文件头信息读取文件大小(瓦片数据大小)
/// </summary>
/// <param name = "file">索引文件指针</param>
/// <param name = "header">文件头信息</param>
/// <param name = "pSize">输出文件大小</param>
/// <return>true:false</return>
bool fepkReadDataSize(FEPKFile file,const FEPHHeader* header,uint* pSize);
/// <summary>
/// 读取瓦片数据函数
/// </summary>
/// <param name = "file">索引文件指针</param>
/// <param name = "header">文件头信息</param>
/// <param name = "pBuf">输入缓冲区大小</param>
/// <param name = "nBufLen">缓冲区长度</param>
/// <return> -1:失败,0:无数据,>0 数据的真实大小</return>
int fepkReadData(FEPKFile file,const FEPHHeader* header,void* pBuf,uint nBufLen);
/// <summary>
/// 关闭文件
/// </summary>
void fepkCloseFile(FEPKFile file);
/// <summary>
/// 导出文件
/// </summary>
/// <param name = "fileName">输入缓冲区大小</param>
/// <param name = "dir">目标文件夹</param>
bool fepkExport(const char* fileName,const char* dir);
/// <summary>
/// 导出文件
/// </summary>
/// <param name = "fileName">输入缓冲区大小</param>
/// <param name = "dir">目标文件夹</param>
bool fepkExportWithLevs(const char* fileName, const char* dir,const unsigned* levs,unsigned levSize);
}
/// <summary>
/// 使用说明
/// FEPKFile file = fepkOpenFile("x:/xx/yy/abc/world0-8.fepk");
/// if (file == nullptr)
/// {
/// return;
/// }
/// FEPHHeader header;
/// uint nSize = 0;
/// if(!fepkReadHeader(file,0,0,0,&header))
/// {
/// return;
/// }
///
/// if(!fepkReadDataSize(file,&header,&nSize))
/// {
/// return;
/// }
/// char* pBuf = new char[nSize];
/// if(!fepkReadData(file,&header,pBuf,nSize))
/// {
/// delete []pBuf;
/// }
/// </summary>
1.4数据解包工具,即将.fepk数据解压成标准的瓦片
解压工具已经,已经上传到网盘,链接如下:
分享文件为:解压工具.zip
链接: https://pan.baidu.com/s/1I-yZUocJoUEJGBBqtpRuIg?pwd=j9p4
提取码: j9p4
使用方法:
G:\tools\tools>FEPKUNPack.exe -i D:\FE\data\fepk\8-420-95.fepk -o D:\FE\data\fepk\data
解压D:\FE\data\fepk\8-420-95.fepk文件中所有数据到data下


解压指定级别数据
针对已经存在的fpek,追加级别,如果级别已经存在,则不做处理,不存在则追加
命令行如下:
- 1. FEPKUNPack.exe -i y:/yyy.fepk -o x:/diir -l 10,11,12
解压10,11,12三级数据
- 2. FEPKUNPack.exe -i y:/yyy.fepk -o x:/diir -l 10-17
解压10~17级别数据
- 3. FEPKUNPack.exe -i y:/yyy.fepk -o x:/diir -l 12
只解压12级别数据
1.5 瓦片导出工具,按需可以对数据包进行按照区域导出
默认按省导出数据:


也可以自定义导出区域:

下载地址:
链接: https://pan.baidu.com/s/1wvYahjCsfl-ycU8fVMHXig?pwd=5ybb
提取码: 5ybb
1.6 加压成瓦片会带来很多问题
1.管理起来发杂,拷贝移动特别慢
当把一个fepk文件解压成标准的金字塔瓦片后,一个fepk文件中有32万张金字塔瓦片,当需要发布到服务器或者移交给客户的时候特别的慢,因此不建议大家解压成瓦片。
2.消耗磁盘
解压成金字塔瓦片后,磁盘空间会变大,笔者亲测,全国的数据解压前6.7T,解压后9.6T
3.版本维护困难
无法有效的管理数据的版本。
1.7 GIS数据服务
一键发布,可以在 cesium,arcgis supermap 等中直接使用
架构图如下所示,系统采用三层架构体系,采用面向组件的设计模式与方法,极大的提升了系统的吞吐量以及性能
应用层:接口采用http / https协议作为提供接口服务,实测,100000次/秒 数据访问接口速度,以摧拉枯朽的性能为应用保驾护航。
服务层:支持集群,提供高性能的服务。
物理层:客制化的硬件底层,提供高伸缩的硬件IO吞吐量。

服务器下载地址网盘链接如下:
分享文件为:瓦片服务.zip
链接: https://pan.baidu.com/s/1eT3PbYrG5j130DGp75410Q?pwd=kw6y
提取码: kw6y
环境需要:windows下需要安装.netcore6.0运行时库
1 .net运行时:dotnet-runtime-6.0.10-win-x64.exe
https://download.visualstudio.microsoft.com/download/pr/50336bc7-7fd1-4a12-b5a2-81ce0219edf9/8d862413975808de0d835888e41e49a7/dotnet-runtime-6.0.10-win-x64.exe
2 .netcore 运行时aspnetcore-runtime-6.0.7-win-x64.exe
3 如果系统报错, 没有证书,那么需要安装..net SDK
下载SDK
4 安装完后,控制台执行 dotnet dev-certs https,命令即可
支持通过http或者https方式访问瓦片数据
服务配置:
|
字段 |
值 |
|
dataPath |
"D:\\FE\\data\\fepk", |
|
imagePath |
"D:\\FE\\data\\def.jpg" |
|
httpPort |
"http://*:9000", |
|
httpsPort |
"https://*:9001" |
|
|
|
文件列表如下:

打开ModelData/Config.json文件,配置dataPath:即当前fepk文件的目录
也可以自定义配置端口号信息
配置完成后双击运行service.fepkHttp.vs2022.exe
画面如下:

服务器正常启动。

可以通过浏览器进行数据验证:
Htttp: http://localhost:9000/api/readImage?col=0&row=0&lev=0
Htttps: https://localhost:9001/api/readImage?col=0&row=0&lev=0

百度网盘下载:
链接:https://pan.baidu.com/s/13VngmOrsQYHSzV1KaHSJQQ?pwd=uj05
提取码:uj05
大小7T多

浙公网安备 33010602011771号