快速搭建简单的LBS程序——地图服务
很多时候,我们的程序需要提供需要搭建基于位置的服务(LBS),本文这里简单的介绍一下其涉及的一些基本知识。
墨卡托投影
地图本身是一个三维图像,但在电脑上展示时,往往需要将其转换为二维的平面图形,需要通过投影的方式将三维空间中的点映射到二维空间中。地图投影需要建立地球表面点与投影平面点的一一对应关系。
我们经常使用的一种投影算法是墨卡托投影,大概做法就是先拿一个圆柱体使它的轴与地球自转轴重合,先把球面上的点投影到圆柱的侧面上,再把圆柱展开就得到长方形的地图了。


关于墨卡托投影可以更多信息可以参看以下这些文章:
墨卡托投影并不是唯一的投影算法,对这种投影算法感兴趣的朋友可以看下这篇文章:
http://desktop.arcgis.com/zh-cn/arcmap/10.3/guide-books/map-projections/list-of-supported-map-projections.htm
Web墨卡托投影
但是,目前各大地图服务商用得最多的是Web Mercator投影,它不是严格意义的墨卡托投影,这个伪墨卡托投影方法的大名是 Popular Visualization Pseudo Mercator,PVPM。它发明自Google,用近似墨卡托投影的方法将地球将椭球体近似为正球体做投影变换,可能比较容易被大众接受吧,在一些Web服务商中非常流行。
关于Web墨卡托,网上介绍的文章也比较多,这里就不详细介绍。
栅格地图瓦片
有了投影算法后,下一步就是根据投影算法将地图信息渲染到平面上。如果我们有电子点图的矢量数据和开发资源的话,可以自己编写渲染算法来实现这一过程。但如果只是想快速集成地图服务的话,可以使用各大互联网地图商提供的瓦片地图服务。
瓦片图服务的特点是:
- 具有唯一的瓦片等级(Level)和瓦片坐标编号(tileX, tileY)。
- 瓦片分辨率为256*256。
- 最小的地图等级是0,此时世界地图只由一张瓦片组成。
- 瓦片等级越高,组成世界地图的瓦片数越多,可以展示的地图越详细。
- 某一瓦片等级地图的瓦片是由低一级的各瓦片切割成的4个瓦片组成,形成了瓦片金字塔。
下面两张图比较直观的展示了这一过程。


由于瓦片图的索引为瓦片等级Leve和物品编号x,y来表示,地图服务商大多将其用一个Url来表示它。例如:
http://mt2.google.cn/vt/lyrs=m&hl=zh-CN&gl=cn&x=420&y=193&z=9
其中(x,y,z)分别是TileX,TileY和Level。大多数服务商主要都采用了这样的做法,如下是几个常用的示例:
- OpenStreetMap: http://a.tile.openstreetmap.org/9/420/193.png
其中,百度和腾讯的坐标系比较特殊,他们的Y轴是朝上的,腾讯的原点在左下角,而百度更为特殊一点原点在中间,如下图所示:

如果要使用这两中地图的朋友可以参看下如下文章:
矢量瓦片
随着技术的发展,矢量地图瓦片也逐渐流行起来,和栅格图相比,矢量图有如下优点:
- 极少占用服务器空间
- 可以实现有效的地图交互显示功能
- 可以形成丰富的配色,对于Cartographic
- 数据保密性强
- 灵活
和栅格图相比,矢量地图用起来更加复杂些,不过现在有的地图服务商也提供了矢量的瓦片数据,然后在用户端使用Canvas渲染成图片,如node-canvas实现百度地图个性化底图绘制。限于篇幅这里就不多介绍了。
基于目前的知识,实际上已经是可以写出一个有显示,漫游,放大缩小的基本功能的地图浏览器的。(百度和腾讯的tileindex取值需要注意一下,要进行一下转换)不过由于目前没有介绍坐标系的转换算法,只能进行基本的地图浏览,无法提供LBS功能,下一篇文章就将介绍一下屏幕坐标和经纬度的转换方法。
快速搭建简单的LBS程序——地图服务的更多相关文章
- 拿nodejs快速搭建简单Oauth认证和restful API server攻略
拿nodejs快速搭建简单Oauth认证和restful API server攻略:http://blog.csdn.net/zhaoweitco/article/details/21708955 最 ...
- 使用Django快速搭建简单的数据管理后台
使用Django快速搭建简单的数据管理后台 概述 需求描述: 数据表已建好,能可视化操作增删改查,避免直接操作数据库 简版的管理系统 环境 Windows 10 x64 Python 3.6.3 (A ...
- docker快速搭建几个常用的第三方服务
本次和大家分享的内容是使用docker快速搭建工作中常用的第三方的服务,对于有一些互联网背景的公司来说,以下几个服务都是很需要的:redis,rabbit,elasticsearch: 本篇涉及内容深 ...
- 使用Node.js快速搭建简单的静态文件服务器
做前端有时会采用一些复杂框架,在文件系统中直接打开页面(用file:///方式打开),往往会报跨域的错,类似于“XMLHttpRequest cannot load ...(文件名). Cross o ...
- 【应用篇】Activiti显示器(抽象)简单的应用程序和服务的颗粒结合(两)
Activiti简单的应用程序,业务颗粒与工作流程结合.让流程带动业务颗粒运行的过程.此次的监听我们应用抽象的监听来实现,也就是说全部的普通业务类均应用此抽象监听,而不须要每个类一个监听的来操作. 新 ...
- 用pytorch1.0快速搭建简单的神经网络
用pytorch1.0搭建简单的神经网络 import torch import torch.nn.functional as F # 包含激励函数 # 建立神经网络 # 先定义所有的层属性(__in ...
- [MFC]_在vs2019中使用MFC快速构建简单windows窗口程序
微软基础类库(英语: Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发 ...
- Django:快速搭建简单的Blog
一,创建项目 1, 为blog创建名为mysite的工程项目: django-admin.py startproject mysite 2, 项目结构如下: mysite ├── manage.py ...
- 利用 FC + OSS 快速搭建 Serverless 实时按需图像处理服务
作者:泽尘 简介 随着具有不同屏幕尺寸和分辨率设备的爆炸式增长,开发人员经常需要提供各种尺寸的图像,从而确保良好的用户体验.目前比较常见的做法是预先为一份图像存放多份具有不同尺寸的副本,在前端根据用户 ...
随机推荐
- 查找Python包的依赖包(语句)
Window 10家庭中文版,Python 3.6.4, 今天看完了urllib3的官文(官方文档),因为没有具体使用过,所以,仍然是一知半解,但是,突然想知道 urllib3以及前面学习过的requ ...
- python基础--json,pickle和shelve模块
一.JSON &pickle 用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 字符串必须是双引号,不能是单引号 pickle,用于python特有的类型 和 ...
- java基础34 泛型的使用
本文知识点(目录): 1.泛型的好处 2.泛型在集合中的常见应用(这里只用String类型举例) 3.在泛型中是不能使用基本数据类型,如果需要使用基本数据类型,那么就使用基本数据类型对应的 ...
- Eclipse 配置语言环境
一.打开https://www.eclipse.org/babel/downloads.php 选择一下版本的Bable(通天塔) 选择 解压 打开Eclipse 软件 选择Help->inst ...
- Linux学习笔记:ls和ll命令
list显示当前目录中的文件名字,不加参数时显示除隐藏文件外的所有文件及目录的名字. ll 等同于 ls -l-r 对目录反向排序(按字母)-t 以时间排序-u 以文件上次被访问的时间排序-x 按列输 ...
- GreenPlum学习笔记:create table创建表
二维表同样是GP中重要的存储数据对象,为了更好的支持数据仓库海量数据的访问,GP的表可以分成: 面向行存储的普通堆积表 面向列存储的AOT表(append only table) 当然AOT表也可以是 ...
- luogu P1126 机器人搬重物 题解
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...
- Asp.net MVC4 +EF6开发的个人网站源码和介绍(仅供新手学习)
本项目是我去年利用业余时间开发的,采用的是asp.net mvc 4 +EF6+三层架构,适合新手进行学习,高手就没有什么价值了,可以直接跳过. 源码和数据库下载(已上传到git):https://g ...
- sql结合通配符来自定义转义字符
1.使用 ESCAPE 关键字,定义转义符.在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符.例如,要搜索在任意位置包含字符串 5% 的字符串,请使用: WHER ...
- 【记录】url 中出现特殊字符该怎么办
url中出现特殊字符+ URL 中+号表示空格 %2B 空格 URL中的空格可以用+号或者编码 %20/ 分隔目录和子目录 %2F ? 分隔实际的URL和参数 %3F % 指定特殊字符 %25 # 表 ...