【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で地理位置情報を使用した"