Delphi for iOS开发指南(12):在iOS Device中使用地理定位

Delphi for iOS开发指南(12):在iOS Device中使用地理定位

 


在开始这篇教程之前,你应该预先阅读并按下面的这篇教程实际操作过:

  • iOS开发指南(9)::在iOS应用程序中使用ListBox来显示TableView
  • iOS开发指南(7)::在iOS应用程序中使用WebBrowser
  • iOS开发指南(10)::在iOS应用程序中使用Layout来适应不同的窗体大小和窗体排列方向

这篇教程讲述了定位你的iOS Device的基本步骤(使用经纬度),并使用Reverse Geocoding(反向地址编码)来转换成可以阅读的地址,如下图所示:

 

 

 

 

 

 

设计用户界面

 


这个示例程序使用两个主要的组件设计而成:一个TListBox(在左边)和一个TWebBrowser。


在ListBox中,设置Align属性为alLeft来保留UI的整个左边为它所用。然后在ListBox上创建下面这些子控件:

  • 一个TListBoxHeader控件,它有下列两个子控件:

                 一个显示标题为“Location Demo”的TLabel组件
                 一个开关控件来选择开启/关闭TLocationSensor

  • 一个文本为“Your Location”的TListBoxGroupHeader
            一个TListBoxItem,它的Name为“ListBoxItemLatitude”,Text为“Latitude”
            一个TListBoxItem,它的Name为“ListBoxItemLongitude”,Text为“Longitude”
            一个TListBoxGroupHeader,Text为“Current Address”
            一个TListBoxItem,Name为“ListBoxItemAdminArea”,Text为“AdminArea”
            一个TListBoxItem,Name为“ListBoxItemCountryCode”,Text为“CountryCode”
            一个TListBoxItem,Name为“ListBoxItemCountryName”,Text为“CountryName”
            一个TListBoxItem,Name为“ListBoxItemFeatureName”,Text为“FeatureName”
            一个TListBoxItem,Name为“ListBoxItemLocality”,Text为“Locality”
            一个TListBoxItem,Name为“ListBoxItemPostalCode”,Text为“PostalCode”
            一个TListBoxItem,Name为“ListBoxItemSubAdminArea”,Text为“SubAdminArea”
            一个TListBoxItem,Name为“ListBoxItemSubLocality”,Text为“SubLoality”
            一个TListBoxItem,Name为“ListBoxItemSubThoroughfare”,Text为“SubThoroughfare”
            一个TListBoxItem,Name为“ListBoxItemThoroughfare”,Text为“Thoroughfare”
            一个TWebBrowser组件(WebBrowser1)来显示网页(Google Maps)。设置Align属性为alClient。

 

 

在你创建完这些组件之后,选择所有的TListBoxItem项目,然后在StyleLookup属性中选择为listboxitemleftdetail。这允许TListBoxItem来同时显示一个Label和详细信息文本。

 

 

 


 

 

 

 

 

 

 


位置传感器

 


位置传感器由TLocationSensor组件封装。

 

 

TLocationSensor触发一个OnLocationChanged事件,当Device检测到移动时。你可以使用Distance属性来调整TLocationSensor的灵敏度。如果你设置Distance为“10”,当你移动了“10”米时,TLocationSensor就会触发OnLocationChanged事件。

 

 

 

 

 

 

 


从LocationSensor组件获取位置信息(经纬度)

 


首先,TLocationSensor组件需要激活才能使用。可以基于你的输入来开启/关闭TLocationSensor,例如使用一个TSwitch组件,或其他应用程序事件。

 


这里有一段代码,它根据TSwitch组件值的更改来控制TLocationSensor:

 


 

procedure TForm44.Switch1Switch(Sender: TObject);

begin

  LocationSensor1.Active := Switch1.IsChecked;

end;


 

 


就像之前提到过的,当你移动iOS Device时TLocationSensor就会触发一个OnLocationChanged事件。你可以在这个事件处理过程中使用它的参数来显示当前的位置,方法如下:

 


 

procedure TForm44.LocationSensor1LocationChanged(Sender: TObject;

  const OldLocation, NewLocation: TLocationCoord2D);

begin

  // Show current location

  ListBoxItemLatitude.ItemData.Detail  := NewLocation.Latitude.ToString;

  ListBoxItemLongitude.ItemData.Detail := NewLocation.Longitude.ToString;

end;


 

 

 

 

 

 

 

 

 

 


 

通过TWebBrowser组件使用Google Maps来显示当前的位置

 


之前在“iOS教程:在iOS应用程序中使用TWebBrowser组件”这篇教程中讲到过的,TWebBrowser组件封装了iOS的WebBrowser。

 


你可以从TWebBrowser组件来调用Google Maps,使用如下URL参数:

 

https://maps.google.com/maps?q=(Latitude-value),(Longitude- value)&output=embed 


 

 


因此你可以添加这个URL到你之前创建的OnLocationChanged事件处理过程中,如下:

 

procedure TForm44.LocationSensor1LocationChanged(Sender: TObject;

  const OldLocation, NewLocation: TLocationCoord2D);

var

  URLString: String;

begin

  // code for previous step goes here

 

  // Show Map using Google Maps

  URLString := Format(

    'https://maps.google.com/maps?q=%s,%s&output=embed',

      [NewLocation.Latitude.ToString, NewLocation.Longitude.ToString]);

  WebBrowser1.Navigate(URLString);

end;


 

 

 

 

 

 

 

 

使用反向地理编码

 


TGeocoder是一个封装了地理编码(或反向地理编码)服务的对象。

 


地理编码是翻译地理数据的过程,例如地址和邮编,转换成地理坐标。反向地理编码是将地地理坐标转换成地理数据的过程,例如地址:

 


在我们这个例子中,我们使用TGeocoder将我们的位置(以经纬度的形式)“反向地理编码”成可读的地址信息。

 

 

 

这里是使用TGeocoder的基本操作步骤:

 

1. 创建一个TGeocoder的实例。
2.定义一个OnGeocodeReverse事件,以便你之后能够接收到这个事件。
3.设置数据来执行“反向地址编码”。
4.TGeocoder访问网络上的服务来处理地址信息。
5. TGeocoder触发一个OnGeocodeReverse事件。
6.你的iOS应用通过OnGeocodeReverse事件的参数来接收地址信息,然后更新用户界面。

 


因为TGeocoder不是一个组件(它只是一个类),你需要通过你的代码来定义这些步骤(你不能拖放一个组件,也不能通过Object Inspector来赋一个事件处理过程)。

 


首先,在窗体的Private声明区域定义一个新的成员“FGeocoder:TGeocoder”。你也可以照着下面这段代码来定义一个“OnGeocoderReverseEvent过程”。

 

 

 
type

  TForm44 = class(TForm)

    // IDE defines visible (or non-visual) components here automatically

  private

    { Private declarations }

    FGeocoder: TGeocoder;

    procedure OnGeocodeReverseEvent(const Address: TCivicAddress);

  public

    { Public declarations }

  end;

 

 


当你定义了这2行代码,将光标定位到OnGeocodeReverseEvent,然后按Ctrl+Shift+C,这会在你的代码中创建如下过程(之后你会使用到的):

 

procedure TForm44.OnGeocodeReverseEvent(const Address: TCivicAddress);

begin

 

end;


 

 

 


现在你可以创建一个TGeocoder的实例,并使用下列代码来初始数据。

 


TGeocoder.Current提供了实际实现Geocoding服务的类类型,“TGeocoder.Current.Create”调用指定类类型的构造方法,然后保存到FGeocoder成员。你也需要指定一个事件处理过程,它在TGeocoder完成反向地理编码时触发。将OnGeocodeReverseEvent(你之前那一步刚刚定义的)赋给FGeocoder.OnGeocodeReverse。

 


最后,如果你成功创建了一个TGeocoder的实例,并且TGeocoder没有运行,使用地址信息调用TGeocoder.GeocodeReverse。当TGeocoder接收到数据之后,OnGeocoderReverseEvent事件就触发了。

 

procedure TForm44.LocationSensor1LocationChanged(Sender: TObject;

  const OldLocation, NewLocation: TLocationCoord2D);

begin

  // code for previous steps goes here

 

  // Setup an instance of TGeocoder

  if not Assigned(FGeocoder) then

  begin

    if Assigned(TGeocoder.Current) then

      FGeocoder := TGeocoder.Current.Create;

    if Assigned(FGeocoder) then

      FGeocoder.OnGeocodeReverse := OnGeocodeReverseEvent;

  end;

 

  // Translate location to address

  if Assigned(FGeocoder) and not FGeocoder.Geocoding then

    FGeocoder.GeocodeReverse(NewLocation);

end;


 

 

 

 

 

在ListBox组件中显示一个可读的地址

 


之前提到过的,在反向地理编码完成之后,一个OnGeocodeReverseEvent会触发。

 


接下来,将TCivicAddress地址参数中的属性赋给在ListBox中的字段:

 


 

procedure TForm44.OnGeocodeReverseEvent(const Address: TCivicAddress);

begin

  ListBoxItemAdminArea.ItemData.Detail       := Address.AdminArea;

  ListBoxItemCountryCode.ItemData.Detail     := Address.CountryCode;

  ListBoxItemCountryName.ItemData.Detail     := Address.CountryName;

  ListBoxItemFeatureName.ItemData.Detail     := Address.FeatureName;

  ListBoxItemLocality.ItemData.Detail        := Address.Locality;

  ListBoxItemPostalCode.ItemData.Detail      := Address.PostalCode;

  ListBoxItemSubAdminArea.ItemData.Detail    := Address.SubAdminArea;

  ListBoxItemSubLocality.ItemData.Detail     := Address.SubLocality;

  ListBoxItemSubThoroughfare.ItemData.Detail := Address.SubThoroughfare;

  ListBoxItemThoroughfare.ItemData.Detail    := Address.Thoroughfare;

end;


 

 

 

 

 

 


 

 翻译的不好,请大家贱谅!

欢迎加入OrangeUI For FMX 技术支持QQ群10900297

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Delphi XE2 正式版的破解程序,有效哦。 Delphi XE2 官方完整 delphicbuilder_xe2_win_dl.iso下载地址: http://altd.embarcadero.com/download/radstudio/xe2/delphicbuilder_xe2_win_dl.iso 文件大小: 2.33G MD5: de8b9f897e2ad678643b64898470b707 Delphi Prism XE2 - ISO 1.28G http://altd.embarcadero.com/download/prism/xe2/prism_xe2_win.iso RadPHP XE2 - ISO 343M http://altd.embarcadero.com/download/radphp/xe2/radphp_xe2_win.iso 建议大家用迅雷下载 ************************************** 英巴卡迪诺发布新版RAD Studio XE2开发工具套件 日前,英巴卡迪诺宣布发布新版RAD Studio XE2软件开发工具套件,新版包含了10多年来最深入全面的特性升级。RAD Studio XE2包含了新版本的Delphi、C++Builder、Prism和RadPHP。主要特性包括完整的Delphi 64位Windows支持,通过全新的FireMonkey富商业应用平台支持Mac OSX和iOS,以及通过RadPHP XE2支持安卓web和移动应用开发。 对Delphi XE2和C++Builder XE2来说,一个极其重要的新特性就是FireMonkey,业界第一款用于创建商业软件的原生的能全面利用到CPU和GPU计算能力的富应用平台。使用 FireMonkey,Delphi和C++Builder开发人员能开发出视觉绚丽的高清和3D应用程序,并与后台的企业级数据库如Oracle、微软 SQL Server、IBM DB2、Sybase和其他数据库互联互通。FireMonkey应用以原生方式运行在Windows PC和Mac上,可以完全利用到现代GPU的处理能力,以不可置信的细节处理能力和优异的性能表现展现数据和用户界面。FireMonkey还可以使 Delphi XE2用户为移动(iOS)设备创建原生的高清和3D应用程序。 Delphi和C++Builder为应用开发提供原生开发方式,而RadPHP XE2则支持web开发和移动设备应用的开发使用RadPHP XE2,开发人员可以轻松为移动智能电话和平板电脑创建支持触碰和UI优化的web应用。开发人员可以部署他们的移动Web应用为原生移动应用到苹果公司的iOS应用商店和安卓的应用市场。在他们的移动Web应用,可以直接访问移动设备的硬件,如相机、GPS和重力感应器。 其他新增特性包括: Delphi XE2 和C++Builder XE2 Delphi XE2包括完整的Windows 64位对FireMonkey、编译器、调试器、RTL 和VCL的支持; dbExpress具有新的对InterBase XE, FireBird 2.5, SQL Anywhere 12 和ODBC的连接能力; 新的DataSnap移动连接器,带有原生的平台组件和示例以创建从移动客户端到Delphi DataSnap服务器的连接,支持安卓(Java), iOS (Objective C), 黑莓(Java) 和Windows Phone 7 (C#); 新增和更新的扩展工具,包括FastReport,用于快速设计和生成报表;Documentation Insight,用于Delphi的源代码文档工具; TeeChart、IBX、InstallAware、IP*Works、Aqtime、FinalBuilder、IntraWeb和Indy 的64位版本。 TeeChart、Indy和FinalBuilder还支持Mac平台; C++Builder XE2还包含了新的代码审计和QA度量工具; LiveBindings使用户能连接任意类型的信息到任意的FireMonkey用户界面和图形对象上。用户可以绑定实时数据到标准的用户界面控件、高清或3D图形元素上,以创建可视化任意类型数据的崭新方式; RadPHP: 集成式为移动优化的Web开发; 部署应用到Web, iOS, 或安卓; 扩展的Zend框架组件集; Embarcadero Prism: 来自RemObjects的全新的.NET Oxygene编译器; 匿名接口实现; FastReport.net
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值