
LBS应用开发研究
2015年11月11日
目 录
第一章 LBS概述 1
1.1 LBS的基本概念 1
1.2 LBS系统的主要构成 1
1.3 LBS的现有模式 1
1.3.1休闲娱乐模式 1
1.3.2生活服务模式 2
1.3.3社交模式 3
1.3.4商业型模式 3
第二章 利用Visual Studio创建Windows应用窗体应用程序调用查看百度地图 4
2.1模块的设计 4
2.2开发设计过程详解 5
第三章 基于Bing Maps开发LBS App 14
3.1 Bing Maps介绍 14
3.2 Windows 8中获取当前位置 15
第四章 在Windows store app中使用百度地图 19
第五章 Android 百度地图开发 26
第一章 LBS概述
1.1 LBS的基本概念
基于位置的服务(Location Based Service,LBS),它是通过电信移动运营商的无线电通讯网络(如GSM网、CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息(地理坐标,或大地坐标),在GIS(Geographic Information System,地理信息系统)平台的支持下,为用户提供相应服务的一种增值业务。
它包括两层含义:首先是确定移动设备或用户所在的地理位置;其次是提供与位置相关的各类信息服务。意指与定位相关的各类服务系统,简称"定位服务",另外一种叫法为MPS-Mobile Position Services, 也称为"移动定位服务"系统。如找到手机用户的当前地理位置,然后在武汉市8494平方公里范围内寻找手机用户当前位置处1公里范围内的宾馆、影院、图书馆、加油站等的名称和地址。所以说LBS就是要借助互联网或无线网络,在固定用户或移动用户之间,完成定位和服务两大功能。
1.2 LBS系统的主要构成
总体上看LBS由移动通信网络和计算机网络结合而成,两个网络之间通过网关实现交互。移动终端通过移动通信网络发出请求,经过网关传递给LBS服务平台;服务平台根据用户请求和用户当前位置进行处理。并将结果通过网关返回给用户。
其中移动终端可以是移动电话、个人数字助理(Personal Digital Assistant, PDA)、手持计算机(Pocket PC),也可以是通过Internet通讯的台式计算机(desktop PC)。服务平台主要包括WEB服务器(Web Server)、定位服务器(Location Server)和LDAP(Lightweight Directory Access Protocol)服务器。
1.3 LBS的现有模式
1.3.1休闲娱乐模式
(1)签到(Check-In)模式: 主要是以Foursquare为主,还有一些国外同类服务还有Gowalla、Whrrl等,而国内则有:嘀咕、玩转四方、街旁、开开、多乐趣、在哪等几十家。
该模式的基本特点如下:
1) 用户需要主动签到(Check-In)以记录自己所在的位置
2) 通过积分、勋章以及领主等荣誉激励用户 Check-In,满足用户的虚荣感
3) 通过与商家合作,对获得的特定积分或勋章的用户提供优惠或折扣的奖励,同时也是对商家品牌的营销
4) 通过绑定用户的其它社会化工具,以同步分享用户的地理位置信息
5) 通过鼓励用户对地点(商店、餐厅等)进行评价以产生优质内容
该模式的最大挑战在于要培养用户每到一个地点就会签到(Check-In)的习惯。而它的商业模式也是比较明显,可以很好地为商户或品牌进行各种形式的营销与推广。而国内比较活跃的街旁网现阶段则更多地与各种音乐会、展览等文艺活动合作,慢慢向年轻人群推广与渗透,积累用户。
(2) 大富翁游戏模式: 国外的代表是Mytown,国内则是16Fun。主旨是游戏人生,可以让用户利用手机购买现实地理位置里的虚拟房产与道具,并进行消费与互动等将现实和虚拟真正进行融合的一种模式。这种模式的特点是更具趣味性,可玩性与互动性更强,比Check-In模式更具粘性,但是由于需要对现实中的房产等地点进行虚拟化设计,开发成本较高,并且由于地域性过强导致覆盖速度不可能很快。在商业模式方面,除了借鉴Check-In模式的联合商家营销外,还可提供增值服务,以及类似第二人生(Second Life)的植入广告等。
1.3.2生活服务模式
(1)周边生活服务的搜索: 以点评网或者生活信息类网站与地理位置服务结合的模式,代表 大众点评网、的“折扣王”等。主要体验在于工具性的实用特质,问题在于信息量的积累和覆盖面需要比较广泛。
(2)与旅游的结合: 旅游具有明显的移动特性和地理属性,LBS和旅游的结合是十分切合的。分享攻略和心得体现了一定的社交性质,代表是游玩网。
(3)会员卡与票务模式: 实现一卡制,捆绑多种会员卡的信息,同时电子化的会员卡能记录消费习惯和信息,充分的使用户感受到简捷的形式和大量的优惠信息聚合。代表是国内的“Mokard(M卡)”、还有票务类型的Eventbee。这些移动互联网化的应用正在慢慢渗透到生活服务的方方面面,使我们的生活更加便利与时尚。
1.3.3社交模式
(1)地点交友,即时通讯:不同的用户因为在同一时间处于同一地理位置构建用户关键,代表是兜兜友。
(2)以地理位置为基础的小型社区: 地理位置为基础的小型社区,代表是“区区小事”
1.3.4商业型模式
(1)LBS+团购 :两者都有地域性特征,但是团购又有其差异性,如何结合?美国的GroupTabs给我们带来了新的想象: GroupTabs的用户到一些本地的签约商家,比如一间酒吧,到达后使用GroupTabs的手机应用进行Check In。当Check In的数量到达一定数量后,所有进行过Check In的用户就可以得到一定的折扣或优惠。
(2)优惠信息推送服务 :Getyowza就为用户提供了基于地理位置的优惠信息推送服务,Getyowza的盈利模式是通过和线下商家的合作来实现利益的分成。
(3)店内模式 : ShopKick将用户吸引到指定的商场里,完成指定的行为后便赠送其可兑换成商品或礼券的虚拟点数。
第二章 利用Visual Studio创建Windows应用窗体应用程序调用查看百度地图
2.1模块的设计
LBS无线定位平台模块构成:
(1)定位网络终端设别提供商
PC和GPS在定位中有着重要的角色,通过电脑的GPS 定位功能可以搜索用户需要的地址信息以及所需地附近的一些服务信息。
(2)移动运营商
整个过程中,移动网络是必不可少的,没有无线网络的信息传递,定位信息不可能及时获取。
(3)地图数据的获取
LBS云是百度地图针对LBS开发者推出的平台级服务,结合已有的地图API和SDK服务,通过开放服务端存储和计算能力,提供海量位置数据存储、检索、展示一体化解决方案。在此次设计中就是通过百度地图开放平台来获取地址的经纬度,以及在搜索地的附近车流量情况。
2.2开发设计过程详解
通过使用Visual Studio建立一个新项目。我们使用的软件版本是Visual Studio 2015,如图2.1所示。
图2.1 Visual Studio 2015新建项目界面
我们的目标是在应用窗口程序中设计搜索界面,然后在程序中将部分地点的经纬度输入,并且调用HTML文件,其中,HTML文件内包含Map实例,车流量信息,定位标记以及定位时屏幕的大小缩放等信息。我们的工程目录结构如图2.2所示。
图2.2 工程目录结构
在程序中,写入查询地址的经纬度信息,地图显示中,将交管局发布的流量信息,以图标形式标注在地图上。根据拥塞程度分成三级,其中红色代表“拥挤”、橙色代表“缓行”、绿色代表“畅通”。而且这个信息还能每隔几分钟自动更新一次,换句话说,我们只要打开网页便能随时获取到最新的路况信息,根本无需用户参与。
Form1.cs的程序如下:
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace BAIDUMap
{
public partial class Form1 : Form
{
double x;
double y;
AutoSizeFormClass asc = new AutoSizeFormClass();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
asc.controllInitializeSize(this);
try
{
webBrowser1.Url = new Uri(Path.Combine(Application.StartupPath, "baidum.html"));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "异常", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "奥山世纪广场")
{
x = 114.368724;
y = 30.622801;
}
else if (textBox1.Text == "沃尔玛(奥山世纪城店)")
{
x = 114.368574;
y = 30.6227623;
}
else if (textBox1.Text == "仟吉西饼")
{
x = 114.379748;
y = 30.634151;
}
else if (textBox1.Text == "武钢宾馆")
{
x = 114.37392;
y = 30.626375;
}
else if (textBox1.Text == "武商众园广场")
{
x = 114.384313;
y = 30.632419;
}
else if (textBox1.Text == "武汉科技大学")
{
x = 114.37746;
y = 30.628216;
}
webBrowser1.Document.InvokeScript("setLocation", new object[] { x, y });
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Document.InvokeScript("setLocation", new object[] { 114.37746, 30.628216 });
}
private void Form1_SizeChanged(object sender, EventArgs e)
{
asc.controlAutoSize(this);
}
}
}
Form1.Designer.cs的程序如下:
namespace BAIDUMap
{
partial class Form1
{
/// /// 必需的设计器变量。 ///
private System.ComponentModel.IContainer components = null;
/// /// 清理所有正在使用的资源。 ///
/// 如果应释放托管资源,为 true;否则为 false。
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容。 ///
private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.button1 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.webBrowser1 = new System.Windows.Forms.WebBrowser();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Font = new System.Drawing.Font("宋体", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.textBox1.ForeColor = System.Drawing.Color.Black;
this.textBox1.Location = new System.Drawing.Point(84, 1);
this.textBox1.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(188, 30);
this.textBox1.TabIndex = 1;
this.textBox1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// button1
//
this.button1.Font = new System.Drawing.Font("宋体", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.button1.Location = new System.Drawing.Point(308, -1);
this.button1.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(86, 30);
this.button1.TabIndex = 2;
this.button1.Text = "查 询";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("宋体", 15F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))));
this.label1.Location = new System.Drawing.Point(14, 9);
this.label1.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(72, 20);
this.label1.TabIndex = 3;
this.label1.Text = "地点:";
//
// webBrowser1
//
this.webBrowser1.Location = new System.Drawing.Point(2, 34);
this.webBrowser1.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
this.webBrowser1.MinimumSize = new System.Drawing.Size(33, 33);
this.webBrowser1.Name = "webBrowser1";
this.webBrowser1.Size = new System.Drawing.Size(910, 504);
this.webBrowser1.TabIndex = 4;
this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(913, 517);
this.Controls.Add(this.webBrowser1);
this.Controls.Add(this.label1);
this.Controls.Add(this.button1);
this.Controls.Add(this.textBox1);
this.Font = new System.Drawing.Font("宋体", 15F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.ForeColor = System.Drawing.Color.Blue;
this.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
this.Name = "Form1";
this.Text = "定位系统";
this.Load += new System.EventHandler(this.Form1_Load);
this.SizeChanged += new System.EventHandler(this.Form1_SizeChanged);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.WebBrowser webBrowser1;
}
}
除此之外,还编写了一个窗口大小适应的程序。
点击调试,启动生成生成项目,就成功了!
如图2.3所示。
图2.3 应用程序界面
第三章 基于Bing Maps开发LBS App
3.1 Bing Maps介绍
Bing Maps for Windows Store apps为Windows Store应用程序提供了地图方面很好的用户体验,开发者可以使用Bing Maps地图控件为Windows Store应用程序加入最新的路线图、鸟瞰图和低角度高清晰图像。
表2.1 Bing Maps API
Bing Maps
| AJAX控件7.0版 | Bing Maps AJAX控件7.0版是最新版本的Bing Maps Javascript API,将AJAX地图控件与Bing Maps REST服务和Bing空间数据服务相结合,并使用最新的图像和定位功能来创建功能强大的Web站点和移动应用。请参见Bing Maps AJAX控件7.0版交互式SDK。 |
| Windows Store应用程序的Bing Maps | Windows Store应用程序的Bing Maps控件为Windows Store应用程序集成了最新的路线图、鸟瞰图以及低角度高分辨率图像。 |
| Bing Maps REST Services | Bing Maps REST服务使用REST URL来执行下述任务:创建地图图钉、地理编码地址、检索图像元数据或者计算路径。 |
| Bing空间数据服务 | Bing空间数据服务使用REST URL进行地理编码以及解码大量空间数据集合并创建查询数据源,数据源包含一个用户定义的实体类型,其中包含了空间数据集。你可以创建一组商店的数据源,然后在其中查找附近商店的位置。 |
| Maps WPF控件 | Bing Maps WPF控件SDK让开发者将Bing地图整合到富Windows Presentation Foundation(WPF)应用程序中,使用“软件+服务”的方式,您的使用Bing云计算架构的WPF应用程序可以使用Bing Maps WPF控件获取最新的Bing地图图像,该控件同时也支持Microsoft Surface的触摸界面,可以创建丰富的触摸功能的应用程序。要开始使用Bing Maps WPF控件,请下载Bing Maps Windows Presentation Foundation控件SDK。 |
执行程序,地图控件就会出现。同Windows Phone中的地图控件一样,Windows Store应用程序中的地图控件也可以通过设置各种参数对其进行更加精细化的设置。
3.2 Windows 8中获取当前位置
(1)打开 Microsoft Visual Studio 2012
打开 Visual Studio 2012。
(2)创建一个新项目
创建新项目,从“Visual C#”>“Windows 应用商店”项目类型中选择一个“应用程序”。
(3)在应用中插入 C# 代码
打开项目的 MainPage.xaml.cs 文件并将现有的代码替换为下面的代码。
using System;
using System.Collection.Generic;
using System.Linq;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.UI.DirectUI;
using Windows.UI.DirectUI.Controls;
using Windows.UI.DirectUI.Data;
using Windows.Devices.Geolocation;
namespace Application1
{
partial class MainPage
{
Geolocator geo = null;
public MainPage()
{
InitializeComponent();
}
private async void button1_Click(object sender, RoutedEventArgs e)
{
if (geo == null)
{
geo = new Geolocator();
}
Geoposition pos = await geo.GetGeopositionAsync();
textblockLatitude.Text = "Latitude: " + pos.Coordinate.Latitude.ToString();
textblockLongitude.Text = "Longitude: " + pos.Coordinate.Longitude.ToString();
textblockAccuracy.Text = "Accuracy: " + pos.Coordinate.Accuracy.ToString();
}
}
}
(4)在应用中插入XAML代码
打开名为 MainPage.xaml 的文件,然后将下面的 XML 复制到此文件中(替换原来的内容)。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="1366"> (5)生成应用 选择“生成”>“生成解决方案”以生成项目。 (6)测试应用 1) 在“调试”菜单上,单击“开始调试”测试该解决方案。 2) 首次运行该示例时,你会收到一个提示,询问是否可以让应用使用你的位置数据。选择“允许”选项。 3) 单击“获取位置”按钮获取当前的位置。 注意 如果位置数据未显示,则检查以下内容: 确保已启用对位置的访问权限,方法是在解决方案资源管理器中打开 package.appxmanifest 并在“功能”选项卡中选中“位置”。 如果管理员已禁用定位服务,则你的应用将无法访问用户的位置。在桌面控制面板中,打开“更改位置设置”并检查是否已选中“打开 Windows 位置平台”。 前面的示例说明,只需编写少量代码即可在应用中集成地理位置功能。 应用会在 button1_Click 方法中发出获取地理位置信息的异步请求。这通过下面一行实现: Geoposition pos = await geo.GetGeopositionAsync(); 后面几行将捕获新的地理位置数据: textblockLatitude.Text = "Latitude: " + pos.Coordinate.Latitude.ToString(); textblockLongitude.Text = "Longitude: " + pos.Coordinate.Longitude.ToString(); textblockAccuracy.Text = "Accuracy: " + pos.Coordinate.Accuracy.ToString(); 以下新值将写入项目 XAML 中的三个 TextBlock 中。 获取到用户当前位置之后,LBS服务就可以为用户提供相应的服务了。 第四章 在Windows store app中使用百度地图 目前提供Windows store app API接口的地图只有两个,自带的Bing地图和高德地图。Bing地图对国外的支持很好,可是对国内的支持就不那么给力了,如果是要写一个针对国内的应用,这是显然不行的。而高德地图虽然对国内支持的很好,他的API却一直没有更新,以至于现在已经通不过WACK(Windows app certificate kit)测试了,作为一个需要能够提交到app store的应用,这条路也走不通。所以要想在Windows store app项目中使用地图,就只有另辟蹊径了。百度地图的接口还是做的比较好的,地图数据也足够丰富,那么就选定它了。 由于目前百度地图还没有针对Windows Store App的SDK,于是我就想到使用WebView控件,结合百度地图JavaScript API来使用地图。在Window Store App中,我们可以使用WebView控件在应用程序内加载地图。同时调用百度地图的JavaScript API完成与地图的互操作。 首先介绍一下开发环境: 操作系统: Windows 8.1 RTM 开发工具: Microsoft Visual Studio 2013(RC) API: 百度地图JavaScript API 接下来是具体步骤: 1.创建百度账户,并申请Key 第一步当然是获得Baidu地图的开发许可。从百度网站可知,Baidu地图API免费对外开放,对于非商业应用可以直接使用,对于商业应用需要得到Baidu的协议许可。自v1.5版本起,需先申请密钥才可使用,接口(除发送短信功能外)无使用次数。你可以通过登录http://developer.baidu.com/map/jshome.htm, 按照提示申请开发者密钥,当然,我们首先需要有一个百度账号,注册为开发者账号,然后再创建密钥。 2.创建Window store应用,并在应用中加载百度地图 第二步就是创建你的Windows store 应用,然后在您的应用中加入WebView控件: