for iOS開發(fā)指南(12):在iOS 中使用地理定位
在開始這篇教程之前,你應(yīng)該預(yù)先閱讀并按下面的這篇教程實(shí)際操作過:
這篇教程講述了定位你的iOS 的基本步驟(使用經(jīng)緯度),并使用 (反向地址編碼)來轉(zhuǎn)換成可以閱讀的地址,如下圖所示:
設(shè)計(jì)用戶界面
這個(gè)示例程序使用兩個(gè)主要的組件設(shè)計(jì)而成:一個(gè)(在左邊)和一個(gè)。
在中,設(shè)置Align屬性為來保留UI的整個(gè)左邊為它所用。然后在上創(chuàng)建下面這些子控件:
一個(gè)顯示標(biāo)題為“ Demo”的組件
一個(gè)開關(guān)控件來選擇開啟/關(guān)閉
在你創(chuàng)建完這些組件之后,選擇所有的項(xiàng)目,然后在屬性中選擇為l。這允許來同時(shí)顯示一個(gè)Label和詳細(xì)信息文本。
位置傳感器
位置傳感器由組件封裝。
觸發(fā)一個(gè)事件,當(dāng)檢測(cè)到移動(dòng)時(shí)。你可以使用屬性來調(diào)整的靈敏度。如果你設(shè)置為“10”,當(dāng)你移動(dòng)了“10”米時(shí),就會(huì)觸發(fā)事件。
從組件獲取位置信息(經(jīng)緯度)
首先,組件需要激活才能使用。可以基于你的輸入來開啟/關(guān)閉,例如使用一個(gè)組件,或其他應(yīng)用程序事件。
這里有一段代碼,它根據(jù)組件值的更改來控制:
procedure TForm44.Switch1Switch(Sender: TObject);
begin
LocationSensor1.Active := Switch1.IsChecked;
end;
就像之前提到過的,當(dāng)你移動(dòng)iOS 時(shí)就會(huì)觸發(fā)一個(gè)事件。你可以在這個(gè)事件處理過程中使用它的參數(shù)來顯示當(dāng)前的位置,方法如下:
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;
通過組件使用 Maps來顯示當(dāng)前的位置
之前在“iOS教程:在iOS應(yīng)用程序中使用組件”這篇教程中講到過的,組件封裝了iOS的。
你可以從組件來調(diào)用 Maps,使用如下URL參數(shù):
(-value),(- value)&=embed
因此你可以添加這個(gè)URL到你之前創(chuàng)建的事件處理過程中,如下:
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;
使用反向地理編碼
是一個(gè)封裝了地理編碼(或反向地理編碼)服務(wù)的對(duì)象。
地理編碼是翻譯地理數(shù)據(jù)的過程,例如地址和郵編,轉(zhuǎn)換成地理坐標(biāo)。反向地理編碼是將地地理坐標(biāo)轉(zhuǎn)換成地理數(shù)據(jù)的過程,例如地址:
在我們這個(gè)例子中,我們使用將我們的位置(以經(jīng)緯度的形式)“反向地理編碼”成可讀的地址信息。
這里是使用的基本操作步驟:
1. 創(chuàng)建一個(gè)的實(shí)例。
2.定義一個(gè)事件,以便你之后能夠接收到這個(gè)事件。
3.設(shè)置數(shù)據(jù)來執(zhí)行“反向地址編碼”。
4.訪問網(wǎng)絡(luò)上的服務(wù)來處理地址信息。
5. 觸發(fā)一個(gè)事件。
6.你的iOS應(yīng)用通過事件的參數(shù)來接收地址信息,然后更新用戶界面。
因?yàn)椴皇且粋€(gè)組件(它只是一個(gè)類),你需要通過你的代碼來定義這些步驟(你不能拖放一個(gè)組件ios 地理位置反編碼,也不能通過 來賦一個(gè)事件處理過程)。
首先,在窗體的聲明區(qū)域定義一個(gè)新的成員“:”。你也可以照著下面這段代碼來定義一個(gè)“nt過程”。
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;
當(dāng)你定義了這2行代碼,將光標(biāo)定位到t,然后按Ctrl+Shift+C,這會(huì)在你的代碼中創(chuàng)建如下過程(之后你會(huì)使用到的):
procedure TForm44.OnGeocodeReverseEvent(const Address: TCivicAddress);
begin
end;
現(xiàn)在你可以創(chuàng)建一個(gè)的實(shí)例,并使用下列代碼來初始數(shù)據(jù)。
.提供了實(shí)際實(shí)現(xiàn)服務(wù)的類類型,“..”調(diào)用指定類類型的構(gòu)造方法,然后保存到成員。你也需要指定一個(gè)事件處理過程,它在完成反向地理編碼時(shí)觸發(fā)。將t(你之前那一步剛剛定義的)賦給.。
最后ios 地理位置反編碼,如果你成功創(chuàng)建了一個(gè)的實(shí)例,并且沒有運(yùn)行,使用地址信息調(diào)用.。當(dāng)接收到數(shù)據(jù)之后,nt事件就觸發(fā)了。
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;

在組件中顯示一個(gè)可讀的地址
之前提到過的,在反向地理編碼完成之后,一個(gè)t會(huì)觸發(fā)。
接下來,將地址參數(shù)中的屬性賦給在中的字段:
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;
翻譯的不好,請(qǐng)大家賤諒!
歡迎加入 For FMX 技術(shù)支持QQ群