当使用谷歌广告进行海外网络推广时,如何提前看到广告的效果?

很多用户在制作完广告后就迫不及待想去看看自己的广告是否展示,在什么位置展示。那我们真的去浏览器里面去搜索吗?

如果你通过搜索触发自己的广告,这会导致广告的展示次数增加,却未能累积点击次数,从而降低点记录,致使广告无法达到应有的展示频率。如果我们不小心点击了广告,还要付相应的费用。

另外,如果你反复通过 Google 搜索查找自己的广告而从不对其进行点击,我们可能会彻底无法再看到它。这是因为 Google 的系统会停止向我们展示它认为我们不感兴趣的广告。

那正确的方法是什么呢?我们应该通过【广告预览及诊断工具】查看我们的广告详情。该工具提供的结果与 Google 搜索完全一致,因而便于我们在不增加展示次数的情况下了解某个广告的排名。

1、登陆你的Google Ads账户,点击工具与设置>规划>广告预览及诊断

2、我们分别输入搜索关键字词,设置地理位置、语言、设备等信息。进行搜索,展示结果如下:(我们就可以看到我们的广告展示情况了)

注意:

1、通过搜索触发自己的广告,点击需要付费,不点击会降低点击率

2、反复通过 Google 搜索查找自己的广告而从不对其进行点击,可能会彻底无法再看到它。这是因为 Google 的系统会停止向我们展示它认为我们不感兴趣的广告。

海外营销必须了解的六种常见谷歌工具

Google目前旗下6款产品 超过10亿月活,分别是视频服务YouTube、操作系统Android、搜索、地图、浏览器Chrome以及应用店Google Play。流量非常巨大,是做海外营销必不可少的渠道,本文主要是简单介绍几个谷歌常用的免费工具。

第一是谷歌的全球商机通(market finder),也是免费的,直接输入你要调研的品类

链接:https://ads.google.cn/intl/ALL_cn/marketfinder/#!/10878/

谷歌的全球商机通的数据都是免费的,数据也非常详细,大家可以去尝试下,也可以点开下面每个的类目去仔细看看,这对于做后续的营销推广有很重要的借鉴意义,比如这个国家用户的购买行为分析是怎么样的,主要通过哪些渠道,偏线上还是线下,线上哪些是主要渠道等等。

比如以智能手机为例,看US的市场情况,可以看到手机的搜索次数,estimeated cpc以及36%的人购买决策中会使用搜索引擎, 所以做好搜索闭环,作为营销漏斗的最后一环是多么重要,在整个链路营销中,Search也是转化最高的一个渠道。

另外一个比较重要的参考点就是购买行为分析, 各个购买阶段的互联网使用习惯,购物频次,登录设备,调研设备等,这样我们就可以针对这些人群投放ads的时候有个数据参考,比如他们的购机频次大都集中在每年至少一次,那么在设置ads targeting的时候就可以用户安卓手机1年或者以上的人群,提高转化。

第二个工具就是Google trend,可以看到某个品类或者品牌的趋势情况,这对于准入市场可以作为很大的一个参考,看下这个品类的trend是上升还是下降。

以印度市场为例,三个手机品牌所做campaign的一些trend,根据有些波峰突升的情况, 就可以去他们的社交媒体上去看看做了哪些campaign的动作,另外还可以看到哪些区域是比较火热的,这样做广告投放的时候可以主要针对这些地区。另外还可以看到一些搜索量上升的词,是不是跟最近所做的产品主要宣传点相符合,也可以把这个热词加入到Google ads account里面进行Search ads的投放。

第三个就是Google关键词规划师(Keywords planner),发现新关键词以及获取搜索量和预测数据, 这些是作为规划关键词预算投放的重要基础。

谷歌关键词规划师工具就在Google ads account的工具与设置那里,比如我们输入自己的品牌词,产品词等,根据规划师给出的大概搜索量以及预估的CPC,就大概知道需要安排多少预算可以cover住,另外关键词规划师也会提供一些拓展的词汇,扩大搜索量,都可以加到google ads account的关键词列表上去。

第四个就是Google GA(Google analytics),GA实在是太重要了,整个链路营销的过程,转化路径跟过程一目了然。

比如有多少到站UV,流量来源,转化情况,会话数,跳出率,转化率,转化金额跟次数,收入等,这对于媒介组合投放策略的制定,后续优化等等都是非常重要的数据,打通从前端到后端的数据。

另外对于哪些页面用户停留时间长,哪些时间短,对于优化网站非常重要,分析用户到站之后的行为分析。到站用户的画像,比如年龄,性别,Affinity, in-market等兴趣爱好标签,这些兴趣爱好的用户标签可以用来投放ads作为TA投放。

GA的转化,归因分析,社交跟展示广告的助攻转化,转化路径等等非常清楚,GA实在是太重要了,上面看到的数据太多了,以后要专门讲一讲GA,学会分析GA是做独立站必不可少的一步。

分享给大家一个谷歌出的教程链接https://analytics.google.com/analytics/academy/

提到GA就介绍下GA URL Builder,用带UTM的链接才能在GA平台看到流量转化跟流量,是哪些投放渠道带来的,下面这个链接就是创建GA的URL Builder,按照上面的提示去创建UTM链接,就会在下面生成独特的链接,也可以转化为短链。

链接:https://ga-dev-tools.appspot.com/campaign-url-builder/

第五个就是Thinkwithgoogle( https://www.thinkwithgoogle.com/ ),借助Google思考与数据报告,指南,信息图表和文章,了解最新的营销研究和数字趋势。

Thinkwithgoogle上面有很多的洞察,最新型的创意广告以及案例分析,是了解google广告创意以及最新数据洞察的一个不错的平台。

最后一个就是google广告学习平台(https://support.google.com/),是学习谷歌搜索广告,视频广告以及展示类广告等一个很好的平台,会教你如何设置Google ads,管理优化广告,衡量广告效果等.

以上几个工具是小编经常用到的比较实用的, 还有Google search console等很多的谷歌工具。 另外google ads的广告类型也比较多,主要有Search ads(包含关键词搜索,shopping ads),展示广告(GDN,Gmail等)以及Youtube视频广告(bumper,trueview, overlay等),接下来会一个个去写写这个ads的投放以及优化,欢迎大家继续关注(来源:南溪跨境)

以上内容属作者个人观点,不代表雨果网立场!本文经原作者授权转载,转载需经原作者授权同意。

上雨果网搜索“跨境资料库”,领取欧美/东南亚各国市场商机、各大平台热销品报告、跨境电商营销白皮书!

谷歌为苹果系统开发输入法,为用户提供更多选择

近日,据外媒报道,谷歌为了霸占苹果市场的高频使用入口,特意为 iOS 系统研发一款第三方输入法软件。据称,它会和谷歌搜索引擎进行整合。这说明,此输入法可以让用户拥有更多的搜索选择。

据悉,与 Android 输入法相比,这款新的第三方输入法的功能更强大。Android 输入法具备手势识别等功能,而这款新的第三方输入法与谷歌的 Logo 进行了整合,当你点击这个 Logo 的时候,就会转到另一个页面,即谷歌的搜索页面。不仅如此,它还拥有一些可用于 GIF 搜索和图片的按钮,有了这个服务,苹果用户就再也不用担心 GIF 这一难题了。当然,谷歌做这么多也是为了更好的推广自己。

不可否认,Android 和 iOS 历来都是竞争对手,但 iOS 的很多产品都是由谷歌开发供应的。到现在为止,iOS 系统的 Google mail、Google map、Chrome浏览器以及 YouTube 等产品都是由谷歌开发的。当然,布局 iOS 生态系统对谷歌来说一样很重要。

不过,第三方输入法在 iPhone 和 iPad 上从来都被待见,此次,谷歌推出第三方输入法能否取得成功,我们还不得而知。最后,谷歌也没公布这个第三方输入法具体上线的时间,作为用户的我们只有静静等待了。

谷歌为苹果用户开发了一种IOS输入法

继微软开发了一款 iOS 输入法 Word Flow 之后,谷歌也在近日为苹果用户开发了一款 iOS 输入法应用,名为 Gboard。这款输入法最大的特色就是不需要跳出 App,直接可以用谷歌进行搜索。

使用手机 App 和朋友聊天的时候,如果突然想要搜索某项资讯,我们都会先退出当前应用,然后打开浏览器进行搜索,或者双击Home键,切换到之前打开的 Safari 来搜索信息,然后再把搜索结果复制到聊天窗口。而谷歌为了帮助用户省去这些麻烦,为 iPhone 推出了一款全新的输入法应用 Gboard,可以让用户不用再转换到浏览器就可以直接进行搜索。

比如,在和朋友聊天时,想要查找某个餐厅的地址,不需要进入浏览器或者地图再进行搜索,只要点击键盘左上角的符号 G,就可以使用搜索功能。搜索结果会以卡片式视窗显示在聊天室下方,左右滑动就可以浏览不同的搜索结果,只要点击想要分享的搜索结果,资料就会直接传送到聊天窗口,省去了不少麻烦。

谷歌指出,除了进行一般的搜索之外,你也可以在同一搜索框中,直接搜索表情符号或者 GIF 图片,比如输入「笑脸」、「哭泣」都可以直接显示表情符号,这样一来就可以省下在数百个表情符号当中滑动搜索的时间,搜索到的表情符号,同样只需要点击一下就可以传送到聊天窗口,非常方便。

目前 Gboard 已经在美国地区的 App Store 上架,中国区还需要再等一等,不过,因为众所周知的原因,谷歌的搜索服务在中国无法使用,所以,这款 Gboard 输入法对于中国的 iPhone 用户来说,到时候的体验可能就要打一些折扣了。

想了解更多关于苹果设备的使用知识与技巧以及查询保修,可以关注我的微信公众号:cxkj-001(果粉俱乐部)。

无需跳出键盘即可进行搜索:Android用户也可以使用gboard输入法

安卓中国5月14日消息,昨天Google发布一款针对IOS设备的虚拟键盘Gboard,并对外宣称IOS平台是最适合测试该输入法的平台。该款输入法最大的特点是它在输入界面整合了谷歌搜索功能,不需要打开外部浏览器,就可以直接在键盘上搜索到你想要了解的资料。由于这款优秀的输入法被IOS平台独占了,所以很多Android用户表示不满,不过不用担心,今日Google正式宣布这款输入发也会登录Android平台。

Gboard团队的Bri Connelly表示:“我们的团队正努力地将这款优秀的输入法用同样的方式移植到Android平台。”希望他们努力克服困难,早日把这款优秀的输入法带到Android平台当中,让更多Android用户体验到这款便利的输入法。|最新最全手机科技数码资讯,尽在安卓论坛! 关注微信公众号:安卓论坛(anzhuo-cn)、好机友(jiyou3g)。

开源免费!谷歌人工智能模型强化学习框架上线GitHub!

强化学习 – 一种人工智能(AI)技术,使用奖励(或惩罚)来驱动代理人朝着特定目标前进 – 训练打败Alpha Go世界冠军的系统并掌握Valve的Dota 2.它是Google子公司的核心部分 DeepMind的深度Q-network(DQN),可以在多个工作人员中分配学习,例如,在Atari 2600游戏中实现“超人”性能。 麻烦的是,强化学习框架需要时间来掌握一个目标,往往不太灵活的,而且不是很稳定。

这也就是谷歌提出替代方案的原因:基于TensorFlow的开源强化框架,它是一个机器学习库。 目前,它已经上线Github。

“受到大脑中奖励动机行为的主要成分之一的启发,并反映了神经科学与强化学习研究之间强烈的历史联系,该平台旨在实现可以推动激进发现的那种投机性研究,”Pablo Samuel Castro和 Google Brain Team的研究人员Marc G. Bellemare在一篇博文中写道。 “这个版本还包括一组阐明如何使用我们框架的colabs。”

他们和Google Brain团队开发了强化框架,其中考虑了三个原则:灵活性,稳定性和可重复性。

为此,它包括一套精心编写的代码(15个Python文件),专注于街机学习环境 – 一个用视频游戏评估AI技术的平台 – 以及四种不同的机器学习模型:上述DQN;C51; Rainbow代理的简化版本; 和隐式分位数网络。 为了重现性,代码在Arcade学习环境支持的60个游戏中提供完整的测试覆盖率和训练数据(采用JSON和Python pickle格式),并遵循标准化经验评估结果的最佳实践。

除了增强框架的发布,谷歌还推出了一个网站,允许开发人员快速可视化多个代理的培训运行。 它还提供经过训练的模型,原始统计日志和TensorFlow事件文件,用于TensorBoard绘图,TensorBoard是Mountain View公司的TensorFlow程序可视化工具套件。

“我们的希望是,我们的框架的灵活性和易用性将使研究人员能够尝试新的思想,包括增量和激进,”Bellemare和Castro写道。 “我们已经积极地将它用于我们的研究,发现它使我们能够灵活地快速迭代许多想法。 我们很高兴看到社区可以帮助做些更伟大的事。“

鉴于TensorFlow目前这么流行,想要学习和实践的程序员们也可以了解下谷歌最近的AI开源项目——AIY Projects。AIY 全称是 Artificial Intelligence Yourself,顾名思义就是利用 AI 来进行的 DIY 功能套件。谷歌目前为 AIY Projects 推出了两款硬件–AIY Voice Kit 和 AIY Vision Kit。其中, Vision Kit(视觉套件)附带的软件可运行三个基于TensorFlow的神经网络,可以处理图像识别和计算机视觉, 支持离线识别上千种常见物体(动物、植物)以及人脸、面部表情等。

谷歌为此还发布了一个TensorFlow.js的工具,有了这项工具,即使不是机器视觉领域的专家,大家也可以实现很多应用场景,比如在浏览器中训练自己的宠物脸辨识系统,在自家的监视系统中使用等等。

我花了一周的时间才最终理解RPC框架

【51CTO.com原创稿件】RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。

RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有:

  • 应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
  • 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
  • 通信框架:MINA 和 Netty。

目前流行的开源 RPC 框架还是比较多的,有阿里巴巴的 Dubbo、Facebook 的 Thrift、Google 的 gRPC、Twitter 的 Finagle 等。

下面重点介绍三种:

  • gRPC:是 Google 公布的开源软件,基于最新的 HTTP 2.0 协议,并支持常见的众多编程语言。RPC 框架是基于 HTTP 协议实现的,底层使用到了 Netty 框架的支持。
  • Thrift:是 Facebook 的开源 RPC 框架,主要是一个跨语言的服务开发框架。

用户只要在其之上进行二次开发就行,应用对于底层的 RPC 通讯等都是透明的。不过这个对于用户来说需要学习特定领域语言这个特性,还是有一定成本的。

  • Dubbo:是阿里集团开源的一个极为出名的 RPC 框架,在很多互联网公司和企业应用中广泛使用。协议和序列化框架都可以插拔是极其鲜明的特色。

完整的 RPC 框架

在一个典型 RPC 的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件,其中“RPC 协议”就指明了程序如何进行网络传输和序列化。

图 1:完整 RPC 架构图

如下是 Dubbo 的设计架构图,分层清晰,功能复杂:

图 2:Dubbo 架构图

RPC 核心功能

RPC 的核心功能是指实现一个 RPC 最重要的功能模块,就是上图中的”RPC 协议”部分:

图 3:RPC 核心功能

一个 RPC 的核心功能主要有 5 个部分组成,分别是:客户端、客户端 Stub、网络传输模块、服务端 Stub、服务端等。

图 4:RPC 核心功能图

下面分别介绍核心 RPC 框架的重要组成:

  • 客户端(Client):服务调用方。
  • 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。
  • 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。
  • 服务端(Server):服务的真正提供者。
  • Network Service:底层传输,可以是 TCP 或 HTTP。

Python 自带 RPC Demo

Server.py:

from SimpleXMLRPCServer import SimpleXMLRPCServer
def fun_add(a,b):
totle = a + b
return totle
if __name__ == ‘__main__’:
s = SimpleXMLRPCServer((‘0.0.0.0’, 8080)) #开启xmlrpcserver
s.register_function(fun_add) #注册函数fun_add
print “server is online…”
s.serve_forever() #开启循环等待

Client.py:

from xmlrpclib import ServerProxy #导入xmlrpclib的包
s = ServerProxy(“https://172.171.5.205:8080”) #定义xmlrpc客户端
print s.fun_add(2,3)

开启服务端:

开启客户端:

Wireshark 抓包分析过程

客户端去往服务端:

  • 客户端 IP:172.171.4.176
  • 服务端 IP:172.171.5.95

通信使用 HTTP 协议,XML 文件传输格式。传输的字段包括:方法名 methodName,两个参数 2,3。

图 5:Request 抓包

服务端返回结果,字段返回值 Value,结果是 5:

图 6:Response 抓包

在这两次网络传输中使用了 HTTP 协议,建立 HTTP 协议之间有 TCP 三次握手,断开 HTTP 协议时有 TCP 四次挥手。

图 7:基于 HTTP 协议的 RPC 连接过程

详细调用过程

Python 自带 RPC 的 Demo 小程序的实现过程,流程和分工角色可以用下图来表示:

图 8:RPC 调用详细流程图

一次 RPC 调用流程如下:

  • 服务消费者(Client 客户端)通过本地调用的方式调用服务。
  • 客户端存根(Client Stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体。
  • 客户端存根(Client Stub)找到远程的服务地址,并且将消息通过网络发送给服务端。
  • 服务端存根(Server Stub)收到消息后进行解码(反序列化操作)。
  • 服务端存根(Server Stub)根据解码结果调用本地的服务进行相关处理
  • 服务端(Server)本地服务业务处理。
  • 处理结果返回给服务端存根(Server Stub)。
  • 服务端存根(Server Stub)序列化结果。
  • 服务端存根(Server Stub)将结果通过网络发送至消费方。
  • 客户端存根(Client Stub)接收到消息,并进行解码(反序列化)。
  • 服务消费方得到最终结果。

RPC 核心之功能实现

RPC 的核心功能主要由 5 个模块组成,如果想要自己实现一个 RPC,最简单的方式要实现三个技术点,分别是:

  • 服务寻址
  • 数据流的序列化和反序列化
  • 网络传输

服务寻址

服务寻址可以使用 Call ID 映射。在本地调用中,函数体是直接通过函数指针来指定的,但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。

所以在 RPC 中,所有的函数都必须有自己的一个 ID。这个 ID 在所有进程中都是唯一确定的。

客户端在做远程过程调用时,必须附上这个 ID。然后我们还需要在客户端和服务端分别维护一个函数和Call ID的对应表。

当客户端需要进行远程调用时,它就查一下这个表,找出相应的 Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。

实现方式:服务注册中心。

要调用服务,首先你需要一个服务注册中心去查询对方服务都有哪些实例。Dubbo 的服务注册中心是可以配置的,官方推荐使用 Zookeeper。

实现案例:RMI(Remote Method Invocation,远程方法调用)也就是 RPC 本身的实现方式。

图 9:RMI 架构图

Registry(服务发现):借助 JNDI 发布并调用了 RMI 服务。实际上,JNDI 就是一个注册表,服务端将服务对象放入到注册表中,客户端从注册表中获取服务对象。

RMI 服务在服务端实现之后需要注册到 RMI Server 上,然后客户端从指定的 RMI 地址上 Lookup 服务,调用该服务对应的方法即可完成远程方法调用。

Registry 是个很重要的功能,当服务端开发完服务之后,要对外暴露,如果没有服务注册,则客户端是无从调用的,即使服务端的服务就在那里。

序列化和反序列化

客户端怎么把参数值传给远程的函数呢?在本地调用中,我们只需要把参数压到栈里,然后让函数自己去栈里读就行。

但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。

这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。

只有二进制数据才能在网络中传输,序列化和反序列化的定义是:

  • 将对象转换成二进制流的过程叫做序列化
  • 将二进制流转换成对象的过程叫做反序列化

这个过程叫序列化和反序列化。同理,从服务端返回的值也需要序列化反序列化的过程。

网络传输

网络传输:远程调用往往用在网络上,客户端和服务端是通过网络连接的。

所有的数据都需要通过网络传输,因此就需要有一个网络传输层。网络传输层需要把 Call ID 和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。

只要能完成这两者的,都可以作为传输层使用。因此,它所使用的协议其实是不限的,能完成传输就行。

尽管大部分 RPC 框架都使用 TCP 协议,但其实 UDP 也可以,而 gRPC 干脆就用了 HTTP2。

TCP 的连接是最常见的,简要分析基于 TCP 的连接:通常 TCP 连接可以是按需连接(需要调用的时候就先建立连接,调用结束后就立马断掉),也可以是长连接(客户端和服务器建立起连接之后保持长期持有,不管此时有无数据包的发送,可以配合心跳检测机制定期检测建立的连接是否存活有效),多个远程过程调用共享同一个连接。

所以,要实现一个 RPC 框架,只需要把以下三点实现了就基本完成了:

  • Call ID 映射:可以直接使用函数字符串,也可以使用整数 ID。映射表一般就是一个哈希表。
  • 序列化反序列化:可以自己写,也可以使用 Protobuf 或者 FlatBuffers 之类的。
  • 网络传输库:可以自己写 Socket,或者用 Asio,ZeroMQ,Netty 之类。

RPC 核心之网络传输协议

在第三节中说明了要实现一个 RPC,需要选择网络传输的方式。

图 10:网络传输

在 RPC 中可选的网络传输方式有多种,可以选择 TCP 协议、UDP 协议、HTTP 协议。

每一种协议对整体的性能和效率都有不同的影响,如何选择一个正确的网络传输协议呢?首先要搞明白各种传输协议在 RPC 中的工作方式。

基于 TCP 协议的 RPC 调用

由服务的调用方与服务的提供方建立 Socket 连接,并由服务的调用方通过 Socket 将需要调用的接口名称、方法名称和参数序列化后传递给服务的提供方,服务的提供方反序列化后再利用反射调用相关的方法。

最后将结果返回给服务的调用方,整个基于 TCP 协议的 RPC 调用大致如此。

但是在实例应用中则会进行一系列的封装,如 RMI 便是在 TCP 协议上传递可序列化的 Java 对象。

基于 HTTP 协议的 RPC 调用

该方法更像是访问网页一样,只是它的返回结果更加单一简单。

其大致流程为:由服务的调用者向服务的提供者发送请求,这种请求的方式可能是 GET、POST、PUT、DELETE 等中的一种,服务的提供者可能会根据不同的请求方式做出不同的处理,或者某个方法只允许某种请求方式。

而调用的具体方法则是根据 URL 进行方法调用,而方法所需要的参数可能是对服务调用方传输过去的 XML 数据或者 JSON 数据解析后的结果,最后返回 JOSN 或者 XML 的数据结果。

由于目前有很多开源的 Web 服务器,如 Tomcat,所以其实现起来更加容易,就像做 Web 项目一样。

两种方式对比

基于 TCP 的协议实现的 RPC 调用,由于 TCP 协议处于协议栈的下层,能够更加灵活地对协议字段进行定制,减少网络开销,提高性能,实现更大的吞吐量和并发数。

但是需要更多关注底层复杂的细节,实现的代价更高。同时对不同平台,如安卓,iOS 等,需要重新开发出不同的工具包来进行请求发送和相应解析,工作量大,难以快速响应和满足用户需求。

基于 HTTP 协议实现的 RPC 则可以使用 JSON 和 XML 格式的请求或响应数据。

而 JSON 和 XML 作为通用的格式标准(使用 HTTP 协议也需要序列化和反序列化,不过这不是该协议下关心的内容,成熟的 Web 程序已经做好了序列化内容),开源的解析工具已经相当成熟,在其上进行二次开发会非常便捷和简单。

但是由于 HTTP 协议是上层协议,发送包含同等内容的信息,使用 HTTP 协议传输所占用的字节数会比使用 TCP 协议传输所占用的字节数更高。

因此在同等网络下,通过 HTTP 协议传输相同内容,效率会比基于 TCP 协议的数据效率要低,信息传输所占用的时间也会更长,当然压缩数据,能够缩小这一差距。

使用 RabbitMQ 的 RPC 架构

在 OpenStack 中服务与服务之间使用 RESTful API 调用,而在服务内部则使用 RPC 调用各个功能模块。

正是由于使用了 RPC 来解耦服务内部功能模块,使得 OpenStack 的服务拥有扩展性强,耦合性低等优点。

OpenStack 的 RPC 架构中,加入了消息队列 RabbitMQ,这样做的目的是为了保证 RPC 在消息传递过程中的安全性和稳定性。

下面分析 OpenStack 中使用 RabbitMQ 如何实现 RPC 的调用。

RabbitMQ 简介

以下摘录自知乎:

对于初学者,举一个饭店的例子来解释这三个分别是什么吧。不是百分百恰当,但是应该足以解释这三者的区别。

RPC:假设你是一个饭店里的服务员,顾客向你点菜,但是你不会做菜,所以你采集了顾客要点什么之后告诉后厨去做顾客点的菜,这叫 RPC(remote procedure call),因为厨房的厨师相对于服务员而言是另外一个人(在计算机的世界里就是 Remote 的机器上的一个进程)。厨师做好了的菜就是RPC的返回值。

任务队列和消息队列:本质都是队列,所以就只举一个任务队列的例子。假设这个饭店在高峰期顾客很多,而厨师只有很少的几个,所以服务员们不得不把单子按下单顺序放在厨房的桌子上,供厨师们一个一个做,这一堆单子就是任务队列,厨师们每做完一个菜,就从桌子上的订单里再取出一个单子继续做菜。

角色分担如下图:

图 11:RabbitMQ 在 RPC 中角色

使用 RabbitMQ 的好处:

  • 同步变异步:可以使用线程池将同步变成异步,但是缺点是要自己实现线程池,并且强耦合。使用消息队列可以轻松将同步请求变成异步请求。
  • 低内聚高耦合:解耦,减少强依赖。
  • 流量削峰:通过消息队列设置请求最大值,超过阀值的抛弃或者转到错误界面。
  • 网络通信性能提高:TCP 的创建和销毁开销大,创建 3 次握手,销毁 4 次分手,高峰时成千上万条的链接会造成资源的巨大浪费,而且操作系统每秒处理 TCP 的数量也是有数量限制的,必定造成性能瓶颈。

RabbitMQ 采用信道通信,不采用 TCP 直接通信。一条线程一条信道,多条线程多条信道,公用一个 TCP 连接。

一条 TCP 连接可以容纳无限条信道(硬盘容量足够的话),不会造成性能瓶颈。

RabbitMQ 的三种类型的交换器

RabbitMQ 使用 Exchange(交换机)和 Queue(队列)来实现消息队列。

在 RabbitMQ 中一共有三种交换机类型,每一种交换机类型都有很鲜明的特征。

基于这三种交换机类型,OpenStack 完成两种 RPC 的调用方式。首先简单介绍三种交换机。

图 12:RabbitMQ 架构图

①广播式交换器类型(Fanout)

该类交换器不分析所接收到消息中的 Routing Key,默认将消息转发到所有与该交换器绑定的队列中去。

图 13:广播式交换机

②直接式交换器类型(Direct)

该类交换器需要精确匹配 Routing Key 与 Binding Key,如消息的 Routing Key = Cloud,那么该条消息只能被转发至 Binding Key = Cloud 的消息队列中去。

图 14:直接式交换机

③主题式交换器(Topic Exchange)

该类交换器通过消息的 Routing Key 与 Binding Key 的模式匹配,将消息转发至所有符合绑定规则的队列中。

Binding Key 支持通配符,其中“*”匹配一个词组,“#”匹配多个词组(包括零个)。

图 15:主题式交换机

注:以上四张图片来自博客园,如有侵权,请联系作者:https://www.cnblogs.com/dwlsxj/p/RabbitMQ.html。

当生产者发送消息 Routing Key=F.C.E 的时候,这时候只满足 Queue1,所以会被路由到 Queue 中。

如果 Routing Key=A.C.E 这时候会被同时路由到 Queue1 和 Queue2 中,如果 Routing Key=A.F.B 时,这里只会发送一条消息到 Queue2 中。

Nova 基于 RabbitMQ 实现两种 RPC 调用:

  • RPC.CALL(调用)
  • RPC.CAST(通知)

其中 RPC.CALL 基于请求与响应方式,RPC.CAST 只是提供单向请求,两种 RPC 调用方式在 Nova 中均有典型的应用场景。

RPC.CALL

RPC.CALL 是一种双向通信流程,即 RabbitMQ 接收消息生产者生成的系统请求消息,消息消费者经过处理之后将系统相应结果反馈给调用程序。

图 16:RPC.CALL 原理图

一个用户通过 Dashboard 创建一个虚拟机,界面经过消息封装后发送给 NOVA-API。

NOVA-API 作为消息生产者,将该消息以 RPC.CALL 方式通过 Topic 交换器转发至消息队列。

此时,Nova-Compute 作为消息消费者,接收该信息并通过底层虚拟化软件执行相应虚拟机的启动进程。

待用户虚拟机成功启动之后,Nova-Compute 作为消息生产者通过 Direct 交换器和响应的消息队列将虚拟机启动成功响应消息反馈给 Nova-API。

此时 Nova-API 作为消息消费者接收该消息并通知用户虚拟机启动成功。

RPC.CALL 工作原理如下图:

图 17:RPC.CALL 具体实现图

工作流程:

  • 客户端创建 Message 时指定 reply_to 队列名、correlation_id 标记调用者。
  • 通过队列,服务端收到消息。调用函数处理,然后返回。
  • 返回的队列是 reply_to 指定的队列,并携带 correlation_id。
  • 返回消息到达客户端,客户端根据 correlation_id 判断是哪一个函数的调用返回。

如果有多个线程同时进行远程方法调用,这时建立在 Client Server 之间的 Socket 连接上会有很多双方发送的消息传递,前后顺序也可能是随机的。

Server 处理完结果后,将结果消息发送给 Client,Client 收到很多消息,怎么知道哪个消息结果是原先哪个线程调用的?

Client 线程每次通过 Socket 调用一次远程接口前,生成一个唯一的 ID,即 Request ID(Request ID必需保证在一个 Socket 连接里面是唯一的),一般常常使用 AtomicLong 从 0 开始累计数字生成唯一 ID。

RPC.CAST

RPC.CAST 的远程调用流程与 RPC.CALL 类似,只是缺少了系统消息响应流程。

一个 Topic 消息生产者发送系统请求消息到 Topic 交换器,Topic 交换器根据消息的 Routing Key 将消息转发至共享消息队列。

与共享消息队列相连的所有 Topic 消费者接收该系统请求消息,并把它传递给响应的服务端进行处理。

其调用流程如图所示:

图 18:RPC.CAST 原理图

连接设计

RabbitMQ 实现的 RPC 对网络的一般设计思路:消费者是长连接,发送者是短连接。但可以自由控制长连接和短连接。

一般消费者是长连接,随时准备接收处理消息;而且涉及到 RabbitMQ Queues、Exchange 的 auto-deleted 等没特殊需求没必要做短连接。发送者可以使用短连接,不会长期占住端口号,节省端口资源。

Nova 中 RPC 代码设计:

简单对比 RPC 和 RESTful API

RESTful API 架构

REST 最大的几个特点为:资源、统一接口、URI 和无状态。

①资源

所谓”资源”,就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,就是一个具体的实在。

②统一接口

RESTful 架构风格规定,数据的元操作,即 CRUD(Create,Read,Update 和 Delete,即数据的增删查改)操作,分别对应于 HTTP 方法:GET 用来获取资源,POST 用来新建资源(也可以用于更新资源),PUT 用来更新资源,DELETE 用来删除资源,这样就统一了数据操作的接口,仅通过 HTTP 方法,就可以完成对数据的所有增删查改工作。

③URL

可以用一个 URI(统一资源定位符)指向资源,即每个 URI 都对应一个特定的资源。

要获取这个资源,访问它的 URI 就可以,因此 URI 就成了每一个资源的地址或识别符。

④无状态

所谓无状态的,即所有的资源,都可以通过 URI 定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变。有状态和无状态的区别,举个简单的例子说明一下。

如查询员工的工资,如果查询工资是需要登录系统,进入查询工资的页面,执行相关操作后,获取工资的多少,则这种情况是有状态的。

因为查询工资的每一步操作都依赖于前一步操作,只要前置操作不成功,后续操作就无法执行。

如果输入一个 URI 即可得到指定员工的工资,则这种情况是无状态的,因为获取工资不依赖于其他资源或状态。

且这种情况下,员工工资是一个资源,由一个 URI 与之对应,可以通过 HTTP 中的 GET 方法得到资源,这是典型的 RESTful 风格。

RPC 和 Restful API 对比

面对对象不同:

  • RPC 更侧重于动作。
  • REST 的主体是资源。

RESTful 是面向资源的设计架构,但在系统中有很多对象不能抽象成资源,比如登录,修改密码等而 RPC 可以通过动作去操作资源。所以在操作的全面性上 RPC 大于 RESTful。

传输效率:

  • RPC 效率更高。RPC,使用自定义的 TCP 协议,可以让请求报文体积更小,或者使用 HTTP2 协议,也可以很好的减少报文的体积,提高传输效率。

复杂度:

  • RPC 实现复杂,流程繁琐。
  • REST 调用及测试都很方便。

RPC 实现(参见第一节)需要实现编码,序列化,网络传输等。而 RESTful 不要关注这些,RESTful 实现更简单。

灵活性:

  • HTTP 相对更规范,更标准,更通用,无论哪种语言都支持 HTTP 协议。
  • RPC 可以实现跨语言调用,但整体灵活性不如 RESTful。

总结

RPC 主要用于公司内部的服务调用,性能消耗低,传输效率高,实现复杂。

HTTP 主要用于对外的异构环境,浏览器接口调用,App 接口调用,第三方接口调用等。

RPC 使用场景(大型的网站,内部子系统较多、接口非常多的情况下适合使用 RPC):

  • 长链接。不必每次通信都要像 HTTP 一样去 3 次握手,减少了网络开销。
  • 注册发布机制。RPC 框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。
  • 安全性,没有暴露资源操作。
  • 微服务支持。就是最近流行的服务化架构、服务化治理,RPC 框架是一个强力的支撑。

【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】

你知道2020年国外9大Java框架中有多少?

专注于Java领域优质技术,欢迎关注

作者:Patricia Neil

来看下外国人整理的 9 个顶级框架:

诞生于1995年的Java,目前已在134,861个网站上广泛使用,包括ESPN、SnapDeal等。在其24年的成长史中,Java已经证明了自己是用于自定义软件开发的顶级通用编程语言。

Java广泛应用于科学教育、金融、法律和政府等行业。在下面的饼图是Java语言在各个行业中的使用情况。

这种开源编程语言是面向对象的,其目的是给予应用程序开发人员编写一次代码就能够在任何地方运行(WORA)的自由。这能够让编译后的Java代码在每个支持Java的平台上都能运行。

最新版本的Java 13于2019年9月发布。根据TOIBE排行榜(基于排名最高的25个搜索引擎计算),Java位列第一。

以下是2019年11月和2018年11月的编程语言排名榜单:

Java始终排在第一位,这使它成为有史以来最享负盛誉的软件编程语言之一。及时的更新和新版本的发布使它成为一种充满活力的、有竞争力的编程语言。

但是,仅仅为你的下一个web应用程序开发项目选择这门顶级语言是不够的。在选择Java web框架时,你仍需要做出正确的选择。那么,你是否想知道如何为项目选择一个恰当的 Java框架呢?

实际上,这并不容易,而且需要深入了解为特定行业业务选择特定java框架进行软件开发的优缺点。

现在,让我们一起来详细研究一下2020年这9大顶级Java框架。

1 Spring

Spring排在第一位,是由于它能够开发以高性能著称的复杂web应用程序的出色能力。它能够使Java开发人员轻松地创建企业级应用程序。关注微信公众号:Java技术栈,在后台回复:spring,可以获取我整理的 N 篇最新 Spring 教程,都是干货。

Web应用程序开发人员可以担保Spring框架的能力。这也是Spring成为Java开发人员的最爱的原因。下面的数据进一步证明了这一点。以下是选择Java作为首选的三种编程语言之一的开发者们对Java框架的看法:

在开发人员的选择中,Spring MVC和Spring Boot远远领先于其他Java技术。对于开发人员来说,这里的一大优势是他们可以不受其他模块约束并专注于一个模块,因为 Spring利用了控制反转(IoC)。

这个框架的其他优点是:它提供了一个全面的配置模型,支持传统数据库和现代数据库,如NoSQL,并通过支持面向方面的编程实现了内聚开发。它提供了一些模块,如Spring MVC、Spring Core、Spring Boost、SpringTransaction等。

2 Hibernate

作为一个对象关系映射(ORM)数据库,Hibernate改变了我们以前查看数据库的方式。虽然它不是一个完整的全栈框架,但是它能够为多个数据库轻松转换数据。

它支持多个数据库的能力使得无论应用程序的大小或用户数量如何,都很容易进行扩展。此外,它速度快、功能强大、易于扩展、修改和配置。

3 Struts

该框架能够帮助自定义软件开发人员创建易于维护的企业级应用程序。这个框架的USP就是它的插件。它们是JAR包,这意味着它们是可移植的。

Hibernate插件和Spring 插件分别可以用于对象关系映射和依赖注入。使用此Java框架开发应用程序可以减少处理时间,因为它提供了组织良好的Java、JSP和Action类。

4 Play

像领英、三星、卫报、威瑞森等顶尖公司都在应用这个框架,但这只能说明它的可信赖度。该框架提供了速度、可伸缩性和性能。

它的用户界面非常简单,能够使移动应用程序开发人员快速上手。它主要用于开发需要统一内容创建的应用程序。

5 Google web Toolkit

这个框架用于客户端开发,类似Javascript。它是一个开源的Java框架,这意味着它是免费的。Google广泛使用这个框架,旗下的许多产品如AdSense、谷歌钱包、AdWords都是使用它编写的。

借助GWT代码,可以轻松地开发和调试Ajax应用程序。Java开发人员更喜欢这个框架来编写复杂的应用程序。它的一些特性包括书签、跨浏览器可移植性、历史记录和管理。

6 Grails

这个开源框架在EnterpriseJava Beans(EJB)中非常流行。它可用于为内容管理系统、Restful web服务和电子商务网站创建健壮的、可伸缩的应用程序。

它可以与Java Spring、Hibernate、quartz、EE容器和SiteMesh等其他Java技术相协调。它的一些优点包括:简单的GORM,灵活的配置文件,高级的插件系统,带有多个插件,简单的对象映射库,以及一个支持和响应社区。

7 Blade

任何自定义应用程序开发人员都可以在一天内快速理解这个框架。于2015年推出的Java Blade以简单和轻量级著称。这个框架最大的亮点是它能够快速创建web应用程序的能力。

它是一个全栈web开发框架,提供了一个简单而简洁的编码结构。Blade基于Java 8,它提供了RESTful风格的路由接口,同时支持webjar资源和插件扩展。

8 JavaServer Faces

这个java框架是由Oracle开发的,可用于创建企业应用程序、本机应用程序和web应用程序开发。它具有将表示层与应用程序代码轻松连接起来的优势。

JSF提供了一个用于表示和管理UI组件的API集。它具有清晰的体系结构,可以区分应用程序逻辑和表示形式。此外,JSF使用XML进行视图处理,而不是使用Java。

9 Vaadin

这是一个用于精简Java开发的优秀平台。你可以使用它来获得自定义的web开发服务。此框架的一大优点是能够保证服务器和浏览器之间的顺畅通信。

Vaadin提供了从Java虚拟机直接访问DOM的功能。在最新发布的版本中,它被分成了两部分。Vaadin Flow,一个允许服务器端通信和路由的轻量级框架。

小结

在阅读了所有顶级的Java框架之后,希望能够给你一个更清晰的认识。了解顶级框架都有哪些并不算什么困难,但是如何找到最佳匹配需求的框架才是一个充满挑战性的抉择!

因此,我总是建议大家咨询专业的Java开发人员,并与他们沟通所有的需求和目标。Java本身就是一种很有前途的编程语言。毫无疑问,选择正确的Java框架可以创造一个奇迹。

来自:https://towardsdatascience.com/9-top-java-frameworks-for-2020-1cc9d3c21f4c

谷歌推出了一项新的购物功能,将网站图片转化为购物商品

▶谷歌推出新购物功能,将网站图片变成可购物商品!

据外媒报道,Google日前宣布了一项新的购物搜索功能,将网站图片中的产品变成可购物商品,并引入新的商品过滤功能,新功能将在PC端和即将推出的iOS手机应用程序上推出。

(图片来源:Google搜索截图)

在即将推出的iPhone版谷歌搜索应用的更新中,谷歌将利用一个新的机器学习模型,通过设备上的处理来识别网站图片中的产品,使其立即成为“可购物商品”。它还将使消费者更容易从搜索结果中浏览服装和配饰,并查看当地商店的库存商品。

据悉,该新功能的推出将帮助谷歌扩大其在电子商务中的地位,并进一步支持该公司在在线视频领域占据主导地位。谷歌官方负责人曾在5月表示,人工智能软件的进步使这一功能的实现成为可能。Google Lens也将在电脑端的Chrome浏览器中出现,允许用户在带有Lens的网站上选择图像、视频和文本内容,并查看搜索结果。

除此之外,消费者可以更轻松地在移动设备上直接从搜索结果中浏览服装、鞋子和配饰。例如,当客户搜索“短款夹克”一词时,谷歌将会显示各种颜色和款式的夹克,以及其他相关信息,如当地商店、款式指南和视频。

客户可以按风格、种类和品牌等类别筛选他们的搜索结果,如果消费者找到了喜欢的东西,他们还可以进行打分和评论,并比较价格。这一新功能得到了Google的Shopping Graph的支持,这是一个包含了超过240亿个列表的产品、库存和商家的实时数据库。它声称这些新功能将帮助购物者“以更直观的方式找到他们正在寻找的东西”。

Prabhakar Raghavan表示:“你的自行车坏了,你需要关于如何修理的一些指导。提问式搜索模式会让你更容易找到视频中能够为你提供帮助的确切时刻。”

Google Lens自2017年以来一直存在,其取代了之前的Google Goggles,它能使用智能手机的摄像头,然后根据对现实世界中发现的物体的识别进行视觉搜索。这些图像搜索使用户能更多地了解他们的周围事物,甚至找到相同或类似的物品来购买,而无需寻找标签或条形码来扫描。现在,Google想帮助购物者可以更便捷地找到在照片中的商品以及购买地点,并最终将购物者引向Google Shopping。

值得一提的是,本月早些时候,谷歌宣布将在搜索和购物结果中添加新的发货和退货日期标签,卖家可以为买家提供具体的退货时间,并在该标签中添加自己的发货及可退货日期。

目前,在Google购物中使用免费或付费商品详情的零售商可以使用这些新功能,而在启用这一功能后,当卖家提供与运输和退货相关的特殊促销活动时,卖家可以注释免费送货、预定送达时间以及免费送货促销活动的日期。当搜索结果中返回产品列表时,也会显示对应标签。

地图资源不足?教你如何制作通用图片源

图源是什么

经常会听到XX图源这一说法,那么图源是什么呢?图源,并不是地图本身,而是地图的索引文件。具体来说,Web地图以瓦片金字塔形式存放在服务器上,数据量很大。在地图加载的时候,为了找到浏览区域对应的瓦片,就需要有一个索引地址,通过网页链接来找寻这个瓦片。图源就是这个对应的索引地址。简单地来说,图源就是瓦片的门牌号,信箱号,邮寄地址。有了这个地址(图源),我们就可以找到需要的瓦片,进而在软件内加载地图。

我们知道,图新地球电脑端(以下简称LSV)和手机端外业精灵app(各大手机应用市场可下载)是支持加载自定义地图的,支持WEB墨卡托和经纬直投两种投影格式。

LSV的图源,是LRC文件,实际上LSV的图源LRC文件,就是XML文件,只是后缀为LRC,因此我们可以用记事本等文本编辑软件编辑。

网上有丰富的地图资源,即可以通过此种方式接入图新地球软件和外业精灵app进行免费浏览、下载到本地使用。

LRC文件结构分析

要想自己制作一个LRC图源,首先需要先了解LRC的文件结构,知道哪些可以改,哪些不能改。进而按照固定的格式,制作LRC图源即可。

分析LRC文件,最好的方式是对LSV软件内自带的LRC文件进行分析。

首先在LSV主目录下找到内置的LRC文件:LocaSpaceViewerResourceLayer。

这里面都是不同归类的图源。分析LRC,最方便的以OSM为例。那么我们打开OSM文件夹:

这些都是LRC文件,选择其中任意一个,右键,打开方式:记事本。

这样我们就可以看到LRC文件内的原始内容。通过编辑这些内容,即可制作属于自己的特殊图源。当前还不明确每一行内容的含义,不过没事,接下来我们说明具体图源的代码的意义。

首先第一行:

<?xml version=”1.0″ encoding=”GB18030″?>

这里说明了XML文档的版本和编码,不用修改,也可以不知道这是啥。

接下来,从<DataDefine>到</DataDefine>是图源的主体。

<Version>0</Version>

<Name>img</Name>

Version标签内,说明了图源的版本;Name标签内,是图源的内部名称。这两条均可以不修改。

<GeoGridType>WebMercatorWGS84</GeoGridType>

GeoGridType标签对内部比较重要,说明了当前图源的投影格式,比如这里WebMercatorWGS84,表示原始在线地图为Web墨卡托,WGS84的图。

而天地图分省,多采用经纬直投,那么这里就需要填写:TianDiTuLatLon

<GeoGridType>TianDiTuLatLon</GeoGridType>

注:天地图分省版的LRC制作,将会在后期教程中更加详细地展开。

<SampleSize>256</SampleSize>

SampleSize标签对内填写的值,是地图瓦片的尺寸。常见地图瓦片是256*256,少量地图瓦片是512*512瓦片。这个要根据具体获取到的瓦片值来填写。

<FileExt>png</FileExt>

FileExt标签对内填写的是原始的瓦片格式,比较常见JPG、PNG类型。具体根据获取到的瓦片来填写。

<DataVersion></DataVersion>

<DataType>urlformat</DataType>

DataVersion和DataType是数据版本和数据类型,这两条可以不用管。

<TileRowDir>NorthToSouth</TileRowDir>

TileRowDir表示原始在线地图的瓦片组织形式。是从北到南编号,还是从南到北编号。多数都是从北到南编号,采用的谷歌编码原则。但是有些图,用的标准TMS切片,则是从南到北。

<LocalPath></LocalPath>本地瓦片路径,如果对已经下载好的本地瓦片,则可以用该标签调用。

<UrlParamOrder>Z,X,Y</UrlParamOrder>这个定义了下面标签中%d的顺序,Z是层级、X是行号、Y是列号。这里如果定义为Z,X,Y,则下面的URL中的%d,%d,%d分别对应ZXY。即这里控制了URL中%d的含义和顺序。

<NetPath>https://s0.outdooractive.com/osm/OSMSummer/%d/%d/%d.png</NetPath>

这个里面的内容表示瓦片的具体地址,也是图源最核心的一部分。%d对应的是ZXY,按UrlParamOrder标签对内的顺序控制。

接下来是Range标签对:

<Range>

<West>-160</West>

<East>160</East>

<South>-85</South>

<North>85</North>

<LevelBegin>1</LevelBegin>

<LevelEnd>18</LevelEnd>

</Range>

Range内部定义了这个图源的区域,最大最小层级。

West、East、South、North定义了图源的默认区域。如果制作一个全国范围的图源,就可以配置这里,配置后,双击图层,则只跳转到全国视角而不是全球。省级范围同理。

LevelBegin和LevelEnd控制了图源的最小和最大层级,一般在图源分析的时候,可以找到具体的值。

整体看主要修改的地方就三块:

LRC图源制作案例分享

在了解了图源内容具体控制什么后,就可以准备开始制作一个图源。这里以open Street Map地图为例:https://www.openstreetmap.org

先看图源要编辑的内容,下面代码中,要编辑修改的内容已经标红处理。

<?xml version=”1.0″ encoding=”GB18030″?>

<DataDefine>

<Version>0</Version>

<Name>img</Name>

<GeoGridType>WebMercatorWGS84</GeoGridType>

<SampleSize>256</SampleSize>

<FileExt>png</FileExt>

<DataVersion></DataVersion>

<DataType>urlformat</DataType>

<TileRowDir>NorthToSouth</TileRowDir>

<LocalPath></LocalPath>

<UrlParamOrder>Z,X,Y</UrlParamOrder>

<NetPath>https://s0.outdooractive.com/osm/OSMSummer/%d/%d/%d.png</NetPath>

<Range>

<West>-160</West>

<East>160</East>

<South>-85</South>

<North>85</North>

<LevelBegin>1</LevelBegin>

<LevelEnd>18</LevelEnd>

</Range>

</DataDefine>

我们打开OSM地图的网页:https://www.openstreetmap.org

按F12,打开开发人员工具。或者在菜单里,找到开发人员工具,点击NetWork

然后随意拖拽地图,可以看到开发人员工具已经抓取到了浏览器的后台传输信息。

找到任意一个瓦片,双击打开

这就是网页地图的基础,瓦片:

1是瓦片本身。

2是瓦片尺寸信息,对应图源内的<SampleSize>

3是瓦片的文件类型,对应图源的<FileExt>

4是图源URL,对应图源文件的<NetPath>

有这几个信息,基本就可以搞定图源文件了。

重点再来分析下图源URL:https://b.tile.openstreetmap.org/12/3424/1671.png

这里面12,是Z,就是层级。

3424是X,也就是行号,多数情况下,X比Y的值大。因为X的索引范围是±180°,Y的索引范围是±85°。

1671是Y,也就是列号。

由此可以确定三个变量即层级、行号、列号的顺序是:Z、X、Y,所以<UrlParamOrder>内应该填写:Z,X,Y

另外,<NetPath>内应该填写:https://b.tile.openstreetmap.org/%d/%d/%d.png

至此,一个图源基本就写好了。看看写好的图源:

<?xml version=”1.0″ encoding=”GB18030″?>

<DataDefine>

<Version>0</Version>

<Name>img</Name>

<GeoGridType>WebMercatorWGS84</GeoGridType>

<SampleSize>256</SampleSize>

<FileExt>png</FileExt>

<DataVersion></DataVersion>

<DataType>urlformat</DataType>

<TileRowDir>NorthToSouth</TileRowDir>

<LocalPath></LocalPath>

<UrlParamOrder>Z,X,Y</UrlParamOrder>

<NetPath>https://b.tile.openstreetmap.org/%d/%d/%d.png</NetPath>

<Range>

<West>-160</West>

<East>160</East>

<South>-85</South>

<North>85</North>

<LevelBegin>1</LevelBegin>

<LevelEnd>18</LevelEnd>

</Range>

</DataDefine>

将上述内容,复制到记事本中,另存为,格式选择所有格式,起名:OSM地图.lrc。

接下来,打开LSV主程序,加载在线地图,看看制作的成果:

打开后,效果如图所示:

放大看看:

如此,在线图源就算制作完毕,就能正常使用了。网上有丰富的地图资源,即可以通过此种方式接入图新地球进行浏览、下载到本地。