【Salesforce】Visualforceで地理位置情報を使用した
Visualforce上で位置情報を使用して画面に表示する機会がありました。
まだ扱ったことがなかったため、使用方法を調べてみました。
位置情報を扱うためには経度・緯度が必要になりますが、カスタム項目に「地理位置情報」というものがありますね。
1つの項目で経度・緯度を保持できるようです。
https://help.salesforce.com/apex/HTViewHelpDoc?id=custom_field_geolocate_overview.htm&language=en
取引先に「地理位置情報」項目を「Location__c」という名前で作成しました。

便利なもので、SOQLで座標と範囲を指定することで範囲内のレコードを取得できるそうです。
開発者コンソールのクエリエディタで舞浜駅(35.636,139.884)から10㎞以内のLocation__cを持つレコードを取得しています。
select Id, Name from Account where DISTANCE(Location__c, GEOLOCATION(35.636, 139.884), 'km') <= 10
エラーが出ました。
「<=」は使用できないんですね。
[object Object]: Name from Account where DISTANCE(Location__c, GEOLOCATION(35.636 ERROR at Row:1:Column:45 The DISTANCE function only supports the operators > and
こちらは通りました。
select Id, Name from Account where DISTANCE(Location__c, GEOLOCATION(35.636, 139.884), 'km') < 10
実際には、座標を変数で指定したいですよね。
こんな具合です。
private List<Account> selectAccountList(Decimal distance, Decimal longitude, Decimal latitude){
List<Account> selectedList;
selectedList = [select
Id,
Name,
Location__c
from
Account
where
DISTANCE(Location__c, GEOLOCATION(:latitude, :longitude), 'km') < :distance];
return selectedList;
}
私のEclipseだとエラーが出ましたが、ブラウザで保存することができました。
Eclipseのエラーが気になる方はこちらの方がいいかもしれませんね。
private List<Account> selectAccountList(Decimal distance, Decimal longitude, Decimal latitude){
List<Account> selectedList;
String query = '';
String whereDistance;
// where句を作成する
whereDistance = ' DISTANCE(Location__c, GEOLOCATION(' + String.valueOf(latitude) + ',' + String.valueOf(longitude) + '), \'km\') < ' + String.valueOf(distance);
// SOQLを作成する
query += ' select ';
query += ' Id, ';
query += ' Name, ';
query += ' Location__c ';
query += ' from ';
query += ' Account ';
query += ' where ';
query += whereDistance;
selectedList = Database.query(query);
return selectedList;
}
これでVisualforce上にLocation__cを表示できるかと思いきや、そんなことはありませんでした。
Visualforceに「Location__c」を記述した際のエラーです。
Save error: Unsupported type: common.api.soap.wsdl.Location used in expression: acc.Location__c
調べてみると、座標をVisualforce上に表示するには経度・緯度を別で取得する必要があるようです。
上のリンクにもあるように、「Location__c」に対して「Location__longitude__s」「Location__latitude__s」と表示するようです。
private List<Account> selectAccountList(Decimal distance, Decimal longitude, Decimal latitude){
List<Account> selectedList;
String query = '';
String whereDistance;
// where句を作成する
whereDistance = ' DISTANCE(Location__c, GEOLOCATION(' + String.valueOf(latitude) + ',' + String.valueOf(longitude) + '), \'km\') < ' + String.valueOf(distance);
// SOQLを作成する
query += ' select ';
query += ' Id, ';
query += ' Name, ';
query += ' BillingAddress, ';
query += ' Location__c, ';
query += ' Location__latitude__s ';
query += ' Location__longitude__s, ';
query += ' from ';
query += ' Account ';
query += ' where ';
query += whereDistance;
selectedList = Database.query(query);
return selectedList;
}
これでエラーなく表示することができました。
次はGoogle Maps Apiについて調べなければいけませんね。
One Response to "【Salesforce】Visualforceで地理位置情報を使用した"