【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を持つレコードを取得しています。
1 | select Id, Name from Account where DISTANCE(Location__c, GEOLOCATION( 35.636 , 139.884 ), 'km' ) <= 10 |
エラーが出ました。
「<=」は使用できないんですね。
1 | [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 |
こちらは通りました。
1 | select Id, Name from Account where DISTANCE(Location__c, GEOLOCATION( 35.636 , 139.884 ), 'km' ) < 10 |
実際には、座標を変数で指定したいですよね。
こんな具合です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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のエラーが気になる方はこちらの方がいいかもしれませんね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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」を記述した際のエラーです。
1 | Save error: Unsupported type: common.api.soap.wsdl.Location used in expression: acc.Location__c |
調べてみると、座標をVisualforce上に表示するには経度・緯度を別で取得する必要があるようです。
上のリンクにもあるように、「Location__c」に対して「Location__longitude__s」「Location__latitude__s」と表示するようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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で地理位置情報を使用した"