• 全国高清卫星影像(Google Earth)无偏移地图(19级)免费送了


    自从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)

    文件格式开放

    作为开发者深知每一家的地图格式都不尽相同,都有自己的规则,我这里把文件的存储格式开发给大家,起到抛砖引玉的左右

    期待有更好的存储格式出现,共同提升国内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字节

    real2   vStart

    经纬度最小范围8*2字节

    real2   vEnd

    经纬度最大范围 8*2字节

    LevSnaplevOff[24]

    级别索引,8 * 24 字节

    char    _reserve[240]

    保留

    级别1

    int2    _start

    2 * 4字节,瓦片最小行列号

    int2    _end

    2 * 4字节,瓦片最大行列号

    uint64  _offset

    8字节

    uint64  _dataSize

    8字节

    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:2;

            /// 在本文件中是否已经存储 0,无,1,有

            uint64  _stored:2;

            /// 状态,

            uint64  _state :6;

            /// 数据地址,使用50bit最大 2^54

            /// 单个文件最大16 K T

            uint64  _offset : 54;

            /// 如果该值!= 0xFFFF,则有效,否则无效,

            /// 使用该字段的意义在于解决网络读取问题,比如在云盘上

            /// 先读取索引,如果没有数据大小,或者数据大小存储在数据文件中,则需要

            /// 再次访问数据文件,才可以得大小,增加额外的IO,同时兼顾大小,该变量最大可以存储64K

            /// 如果超过了64K,那么一样的需要访问数据文件获取大小

       ushort  _dataSize;

    };

    共计10自字节

    LevSnap定义:

    struct  LevSnap

        {

            uint64  _lev:8;

            uint64  _offset:56;

    };

    共计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字节

    real2   vStart

    经纬度最小范围8*2字节

    real2   vEnd

    经纬度最大范围 8*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;
    
    #pragma  pack (push,1)  
    /// 该文件不可以被修改
    typedef unsigned    short       ushort;
    typedef unsigned    int         uint;
    typedef unsigned    __int64     uint64;
    struct  FEPHHeader
    {
        /// 有无数据标记,即服务器上是否有该数据 0,无,1,有
        uint64  _data : 2;
        /// 在本文件中是否已经存储 0,无,1,有
        uint64  _stored : 2;
        /// 状态,
        uint64  _state : 6;
        /// 数据地址,使用50个bit最大 2^54
        /// 单个文件最大16 K T
        uint64  _offset : 54;
        /// 如果该值!= 0xFFFF,则有效,否则无效,
        /// 使用该字段的意义在于解决网络读取问题,比如在云盘上
        /// 先读取索引,如果没有数据大小,或者数据大小存储在数据文件中,则需要
        /// 再次访问数据文件,才可以得大小,增加额外的IO,同时兼顾大小,该变量最大可以存储64K
        /// 如果超过了64K,那么一样的需要访问数据文件获取大小
        ushort  _dataSize;
    };
    #pragma pack(pop)
    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数据解压成标准的瓦片

            上述文件文档等数据都可以在QQ群中获取

      QQ群号(600975169)

      二维码:

      

    扫码分享到朋友圈:

  • 相关阅读:
    P3507 [POI2010]GRA-The Minima Game
    P2038 无线网络发射器选址
    2017.9.23清北第二场
    P3183 [HAOI2016]食物链
    2017.9.17校内noip模拟赛解题报告
    Day2代码
    P1328 生活大爆炸版石头剪刀布
    Fibinary Numbers
    Mac os 进行Android开发笔记(1)
    python中文注释及输出出错
  • 原文地址:https://www.cnblogs.com/FastEarth/p/14406360.html
Copyright © 2020-2023  润新知