致谢

感谢网友提出这个问题。大家有问题也可以在评论区提出,有问必有答。如果涉及商业需求,需要较完整/详尽的工程,可以联系作者133-2459-8743。

问题描述

网友提出要做一个基于osgearth的导弹按轨迹飞行的程序,并放置一些地面站。我准备基于最新的oe版本,分几个步骤把这个功能给做出来。节号命名为18.1, 18.2以示连贯。oe当前最新版本是3.1,说老实话不是很稳定。我们做为商业公司,做军工的,稳定性为首要,升级版本是很慎重的,我看调研了好长时间了,还没有升。

本节资源

本文集包括本节所有资源包括模型代码都在此下载,按节的序号有文件或文件夹:

【击此打开网盘资源链接】

本节功能

1. 本节要完成一个可以加载本地瓦片的功能,这往往是做球的第一步。为了保证程序简单,我们只加载本地影像数据,举一反三,高程瓦片之类的,用户可以根据自己的切片数据自行设计。

2. 具体细节瓦片我们加载data/image下的,我们弄了几张图片当示例。可以看到瓦片0级,1级,2级是满的,突然跳到第8级,有几张台湾的高清数据。因此本节用户可以将操作器拉到台湾那里,会有高清的显示。

3. 加载高程我们直接使用一个全球900m的高程图,使用gdal加载,全球900米的高程图要放在data\elevation\900_ludi_haiyang.tif,高程图在网盘的公共数据文件夹下。

具体实现和方法

1. oe提供了丰富的示例,我们可以使用osgEarth_Viewer arcgisonline.earth来看一看在线的,发现高程也有,是影像也有。都是瓦片化的。那么我们直接看它咋搞的,本地建一个不就行了吗?

2. arcgisonline.earth里的影像标签使用的是ArcGISServerImage,如下:

    <ArcGISServerImage name="World-Imagery"><url>http://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/</url></ArcGISServerImage>

在代码中对应的是ArcGISServer和ArcGISServer.cpp,看代码我们要先关注它究竟从网上下载了什么,发现了下载了以下东西:

1) bool
ArcGISServer::MapService::init( const URI& _uri, const osgDB::ReaderWriter::Options* options )函数中下载了一个json文件,URL通过调试得知在这里:http://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/?f=pjson

从浏览器里打开网址下载,然后给存到本地data\image\base.json

2) 在GeoImage
ArcGISServerImageLayer::createImageImplementation(const TileKey& key, ProgressCallback* progress) const 函数中下载的就是瓦片数据了,URL如下:
http://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/0/0/0.jpeg
放浏览器里一打开,是瓦片数据,我们也在本地也建上:data\image\0\0\0.jpeg,我们像模像样的下载0级,1级,2级的瓦片,然后再取几张台湾的8级做点高清的数据。框架就算完工了。

3. 在我们自己的工程里,把ArcGISServer和ArcGISServer.cpp改个名字,将ArcGIS整个替换成MyGIS,

然后在earth文件中将标签名称和URL一修改:

    <MyGISServerImage name="WorldImagery0"><cache_policy usage="no_cache"/>    <url>./image</url></MyGISServerImage>

这就是要读本地的./image文件夹下的影像了,此外我们还要修改上面两处下载数据的地方,一个是读json的bool
ArcGISServer::MapService::init,现在叫bool
MyGISServer::MapService::init了,
将这个:std::string json_url = uri.full()+ sep + std::string(“f=pjson”);
直接改成:std::string json_url = uri.full()+"/base.json"; 这样他就读我们./image/base.json文件了。

然后是读瓦片时接URL的函数:
GeoImage
ArcGISServerImageLayer::createImageImplementation
现在叫
GeoImage
MyGISServerImageLayer::createImageImplementation了
将:
buf << options().url()->full() << “/tile”
修改成:
buf << options().url()->full() << “”
因为我们./image下直接就是数据了,没有再一层tile了。

至此就完工了。

进一步思考
1. 瓦片的种类很多,从金字塔的结构上来分,有第0级是一张照片的,有第0级是两张照片的(我们习惯称为平顶的或尖顶的),这两种都很常用。本例就是尖顶的。从投影上常见的两类,一个是墨卡托投影,一类是等经纬度网格投影。用户可以仿照本例的方法,学习一下oe加载TMS、XYZ等类型的瓦片,看看这些瓦片都是怎么组成的。以根据自己的数据获取的内容来确定采用哪种加载本地瓦片的方式。

2. 获取瓦片可以使用下载器,搜一下“地图下载器”,随便选一款,享受免费数据吧。

3. 也可以将数据放在局域网,自己架一个HTTP服务,这样使用的就是像ARCGIS一样的远程URL请求。当然如果需要一个专业的地理信息服务器来存放数据,可以选开源的,比如GeoServer,当然如果经费允许也可以选择一款商业的功能强大的且提供源码的地理信息服务器,仅此一家:恒歌科技r的FreeXServer,可以点击了解。

第18.1节 OE3.1实例-加载本地瓦片数据相关推荐

  1. 使用Sencha Touch加载本地Json数据

    本例没有采用Sencha的mvc模式.只是一个简单的读取加载本地Json数据示例. 文档结构如下: app.js代码如下: Ext.require(['Ext.form.Panel','Ext.dat ...

  2. 解决mysql load data加载本地null数据,表里出现0的情况

    解决mysql load data加载本地null数据,表里出现0的情况 问题说明: sql执行语句如下代码块: ---- 欢迎讨论沟通 ---- 问题说明: 本人在使用mysql加载本地数据过程中, ...

  3. 百度离线使用百度地图离线JavaScript API加载本地瓦片地图 -java教程

    最近笔者几篇文章介绍了改百度离线的文章. 关联文章的地址 1.首先取获百度 JavaScript API 首先用浏览器开打 http://api.map.baidu.com/api?v=1.3 如下图 ...

  4. Echarts 异步请求不能加载本地JSON数据解决方案,以及Http-Server安装与使用

    文章目录 一.前言 二.分析&解决方案 三.Http-Server简介&安装方法 四.启动http本地服务方法 五.附:Http-Server可选配置 一.前言 最近学习eharts制 ...

  5. Jquery中使用JsonP加载本地json文件解决跨域问题

    场景 jquery中直接请求本地json文件时会提示跨域问题. Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获 ...

  6. cesium 3dtiles 加载本地数据_深入echarts学习:加载跨域、异步、本地json数据的防坑录

    1 说明: ===== 1.1 推荐指数:★★★★ 1.2 网上这方面说明,大多模棱两可,坑很多,讲透彻的不多,故本人做一个小结. 1.3 我曾介绍echarts的简单基本用法: <Echart ...

  7. Flutter 实例 - 加载更多的ListView

    Dart4Flutter - 01 – 变量.类型和函数 Dart4Flutter – 02 –控制流 和异常 Dart4Flutter – 03 – 类和泛型 Dart4Flutter – 04 – ...

  8. PHP+Ajax点击加载更多列表数据实例

    PHP+Ajax点击加载更多列表数据实例 一款简单实用的PHP+Ajax点击加载更多列表数据实例,实现原理:通过"更多"按钮向服务端发送Ajax请求,PHP根据分页参数查询将最新的 ...

  9. Echarts3实例 加载地图

    前言 Echarts加载GeoJson数据生成canvas地图,可以实现地图简单的展示,获取GeoJson数据的方法见:https://blog.csdn.net/idomyway/article/d ...

最新文章

  1. IndexError: list index out of range的解决办法
  2. 【Android 逆向】Android 逆向工具 ( Apktool | IDA | Python )
  3. 2.15 Python 中的广播-深度学习-Stanford吴恩达教授
  4. Message Queue中的推与拉(转)
  5. 牧马人鼠标g13鼠标宏_达尔优EM910牧马人轻量化游戏鼠标评测
  6. Python机器学习:多项式回归与模型泛化006验证数据集与交叉验证
  7. c语言科学计数法输出1_e10,PAT 1024科学计数法的代码实现及错误分析(C语言)
  8. 算法——排序——快速排序图解动画
  9. Unity3D游戏开发之自由视角状态下的角色控制
  10. Structed Streaming(Continuous Processing报错):StreamingQueryException;java.util.NoSuchElementException
  11. 港股常见的宽基指数:恒生指数、H股指数和香港中小指数
  12. 【Python机器学习】标注任务与序列问题讲解(图文解释)
  13. wpf matlab混编,WPF(C#)与MATLAB混合编程
  14. 投资 - 出口 - 消费
  15. Apache Dubbo基本使用
  16. AML(Automation Markup Language)简单介绍
  17. java游戏oppo飞鹰计划,高德发布打假平台“飞鹰计划”,首批接入200多个品牌
  18. 有软件测试台式电脑电源供电不足吗,电脑电源供电不足惹起的六种觉见故障
  19. 一步一步掌握线程机制(六)---Atomic变量和Thread局部变量
  20. 智能化整体图例,布线、安防、广播会议、电视、楼宇、消防、电气图的图例【转自微信公众号弱电课堂】

热门文章

  1. 如何运用SCQA发现问题?
  2. java字符串Emoji表情的处理
  3. ios表格添加底纹_如何在Word中的表格单元格中添加底纹
  4. 电脑回收站清空了怎么恢复回来
  5. k203m机型java游戏_唯美中国风 品步步高K203M的江南之美
  6. php提取域名字符串,由字符串,提取完整子域名的方法 -php
  7. call 和 apply 方法
  8. 复利计算5.0 结对
  9. 选购移动硬盘注意事项
  10. Adobe国际认证|InDesign 中的 Adob​e Capture