【Salesforce】Visualforceで地理位置情報を使用した

【Salesforce】Visualforceで地理位置情報を使用した

Visualforce上で位置情報を使用して画面に表示する機会がありました。

まだ扱ったことがなかったため、使用方法を調べてみました。

位置情報を扱うためには経度・緯度が必要になりますが、カスタム項目に「地理位置情報」というものがありますね。

1つの項目で経度・緯度を保持できるようです。
https://help.salesforce.com/apex/HTViewHelpDoc?id=custom_field_geolocate_overview.htm&language=en

取引先に「地理位置情報」項目を「Location__c」という名前で作成しました。

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です