谷歌街景原理【翻译】
转载自:http://blog.163.com/outmen_jet/blog/static/832604682010821105019937/
原文:http://code.google.com/apis/maps/documentation/javascript/services.html#StreetView
翻译:任我骏驰
(转载请注明出处,标明本文地址)
第一部分:创建自定义全景图 (Creating Custom Panoramas)
每一个谷歌街景(Street View)全景照片其实是一张或一组提供了从一个地点360度全景视角的照片。街景全景照片是用了遵循“等矩形投影”(equirectangular (Plate Carrée) projection)的图片。这样的一个投影包括了一个360度的水平视野(完整地绕一周)和一个180度的垂直视野(从正上方到正下方)。这样的视野(fields of view)形成了一张宽高比为2:1的图片。一张完整的环绕一周的全景照片如下图。
把全景图当成是在球体上的投影,并用一个直角坐标系来描述。当需要把图片分割成直角瓦片,并通过计算瓦片坐标提供相对应的图片时,这样做是很有好处的。
第二部分:创建自定义的全景图瓦片(Creating Custom Panorama Tiles)
谷歌街景也支持不同级别的图片细节。这样就允许你从默认视野进行缩放控制。通常来说,谷歌街景为每一处全景照片提供了5个级别的缩放分辨率。要是你想通过用单独一张全景图片就完成所有级别的缩放,这样的一张图片要么需要相当大,而这会明显让你的程序变慢;要么这图片的分辨率就很低,致使当放大时就变成了一个糟糕的马赛克图像。然而,幸运的是,我们可以用一种类似用在谷歌地图瓦片上的设计模式来为各个缩放级别的全景图片提供合适的分辨率图像。
当一个谷歌街景图像初次载入,默认情况下,它处在缩放等级1,这时显示了整张全景照片25%的水平宽度(90度的水平视野)。这个视野大致符合一个正常人的视野。从这个默认视野进行“缩小”本质上是提供一个更广的视角,而“放大”则是将视角压窄,视角变小。
谷歌街景全景图自动为所选择的缩放级别计算合适的视野,然后通过选择一系列大致匹配当前水平视野尺寸的对应的图像瓦片,来选择最适合该分辨率的图片。
下面是视野与街景地图缩放级别的对照表:
![](http://img.ph.126.net/zIkB-X6KKZZGByprW72ahw==/1541356972468080109.png)
要注意,在街景中图片所显示的尺寸完全依赖于屏幕用来展示街景的容器的尺寸(宽度)。如果你用一个比原先更宽的容器来显示街景,服务将仍然提供在某个缩放等级下相同的视野,尽管它可能会换用更适合当前分辨率的一些图像瓦片。
因为一个全景图片是由一个“等矩形投影”组成,这样创建全景图像瓦片就会相对简单。尽管正方形的图像瓦片可能会在正方形的地图上提供更好的表现(因为视野将是正方形),但因为投影的图像的长宽比为2:1,所以2:1比例的图像瓦片用起来就会更简单。
用2:1比例的图像瓦片的情况下,一个单张环绕整个全景的图片就展现全部的全景“世界”(即源图片),这样的缩放级别(zoomLevel)为0级。随着缩放的增大,将需要4zoomLevel 块图像瓦片。(例如,在2级,整张全景图就要由16块图像瓦片组成。)注意:在铺瓦片时用的缩放等级并不直接对应控制街景视野的缩放等级;而是街景通过哪些砖块适合被选择,来控制缩放级别来选择一个视野(Field of View (FoV))。
![](http://img.ph.126.net/zRhTHY4jIFOVeMfpe55w3w==/3273835454123176749.png)
通常来说,你会要命名你的图像瓦片,这样它们才能被程序化地选择。这样的一个命名体制将在处理自定义全景图请求部分所讨论。
(转载请注明出处,标明本文地址)
【编后记】网上关于全景图片的算法很少,就算有,出来的效果也没有Google的那么流畅。我说这Google不是神了么?!呵呵 对中文资源绝望后,于是开始搜英文的资料,果然发现了这么一篇Google自己写的文档,相当激动啊~哈哈 本来是这是为JavaScript语言写的帮助文档,正好里面涉及了街景服务(StreetView)的原理,感觉弥足珍贵,而且发现这么好的资料居然没有中文版,于是就自己动手翻译啰~ 而且,我不止翻译了,我还利用它里面的理论已经成功开发出了一个全景图片浏览器,和Google原版的浏览起来几乎没差别了,一样流畅。今后公布下载地址。
谷歌街景原理【翻译】相关推荐
- Bundler 的作用及原理
Bundler 的作用及原理 翻译 · yesmeck · Created at one year ago · Last by teacafe2000 Replied at one year ago ...
- Java01-day01【发展史、跨平台原理、JRE和JDK、常用DOS命令、关键字、常量、数据类型、变量使用的注意事项、标识符、类型转换】
java零基础入门到精通(2019版)[黑马程序员] 视频+资料:[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] &qu ...
- 来自Riot 的一份游戏美术教程(五):技术美术
引言 前段时间,Riot Games推出了一个针对游戏美术的系列视频:So you wanna make games??这一系列的特点是短小精悍,每集只有十分钟,却囊括了游戏美术的各个方面,对于新手来 ...
- 小程序设计避免犯什么错_新设计师犯下的5种印刷错误以及如何避免
小程序设计避免犯什么错 Over the last year and a half, I've had the opportunity to teach the basics of typograph ...
- 这次,让算法走下神坛!
算法是"玄学"吗? 很多程序员对各种排序.搜索.遍历等常用算法了如指掌,但遇到实际问题时还是束手无策.耳熟能详的三本算法书<算法>.<算法导论>.<算 ...
- Rimworld Mod制作教程2 创建数据定义
文章目录 废话 核心内容 1 创建数据定义 1.1 定义一个新的抽象物品 手办基类 1.2 源源不断的手办(Garage Kid) 1.3 新材料(Stuff) 1.4 添加配方(Recipe) 1. ...
- 算法应该怎么“玩”?
特别提示 本课程为王晓华老师达人课课程,需要购买训练营课程的同学请点击下方链接: 28 天玩转算法-第02期 课程介绍 市面上关于算法的书可谓琳琅满目,有经典但难啃的.也有简单入门的.更有独辟蹊径的, ...
- 谷歌与DeepMind的控制权之战,刚刚开始
DeepMind和谷歌的关系可能并不像看上去那么美好.DeepMind缺乏持续稳定的营收能力,而谷歌毕竟不是做慈善的.双方之间争夺"独立自主权"的控制与反控制的战争已经开始! De ...
- Haskell大世界+思考
文章目录 基石般灵活表现自由的抽象范式 编程语言是什么? 推荐论文 大佬建议 Meta Haskell 实现 类型系统 语言抽象/模式 问题解决方案 Haskell在工业界有哪些实际的应用? 关于fp ...
最新文章
- Android 高级进阶之overdraw分析及解决
- Linux-sort排序
- widcomm BT search place
- 《贝叶斯方法:概率编程与贝叶斯推断》一导读
- 离散数学和组合数学什么关系_关系类型| 离散数学
- DJ Mix Pads 2 - Remix Version Mac - DJ混音音乐制作板
- IP地址专题六:计算相关地址
- 期刊的中科院分区和JCR分区以及影响因子查询方法
- java计算机毕业设计服装连锁店后台管理系统MyBatis+系统+LW文档+源码+调试部署
- python 字符串转字节_【转】python中的字符串和字节串
- 基于AVL-CRUISE 2014电动汽车建模与仿真之建模(一)
- Luogu 3174 [HAOI2009]毛毛虫
- android gps 室内定位方法,Android GPS室内定位问题的解决方法(location为null)
- 【鑫鑫批量挂Q器 v2.0绿色版】
- 【解决】Yandex浏览器Bing搜索遭遇trovi.com劫持
- 018 参数估计之点估计法:矩估计法、最大似然估计
- 华为手机如何与台式计算机连接不上,华为手机连接不上电脑怎么处理
- “Project1.exe”(Win32): 已加载“C:\Windows\syswow64\ntdll.dll”。无法查找或打开 PDB 文件。 “Project1.exe”(Win32): 已加载
- flatMap,zip,Merge区别
- 如何将数据从旧PC传输到新Mac