ジオコーディング
地図は緯度と経度に行を割り当てますが、ほとんどの行にはその位置がありません。テーブルのアドレスを AddGeocodingに登録すると、その行の座標は、ポータルの設定名によって作成・更新される際に埋められます。
ジオコード結果の保存
座標を記録に保存することはジオコーダーの結果を保存することであり、プロバイダーごとに条件が異なります。結果の保存期間を制限するもの、保存した結果に料金を課すもの、そして独自の地図にのみ表示できるものもあります。Power Portals Proはその機能のみを提供します。プロバイダー、プラン、結果の利用がその条件に準拠しているかを確認するのはあなたの責任です。
アドレスの登録
アカウントや連絡先はそれぞれ最初の住所でショートカットを使えます。住所、市、郡、州または州、郵便番号、国名、 address1_latitude と address1_longitudeに分かれます。
// Program.cs (the server)
builder.Services.AddAccountGeocoding();
builder.Services.AddContactGeocoding();
他のテーブルは列名を付けます:通りの線、市、郡、州または州、郵便番号、国、それぞれテキスト、選択、検索列(ジオコーダーは選択のラベルと検索名を読みます)、そしてその座標が入る列の数です。
builder.Services.AddGeocoding("ppp_site", address => address
.Street("ppp_street1", "ppp_street2")
.City("ppp_city")
.StateOrProvince("ppp_state")
.PostalCode("ppp_postalcode")
.Country("ppp_countryid")
.Coordinates(latitude: "ppp_latitude", longitude: "ppp_longitude"));
登録名はポータル開始時にDataverseと照合されます:テーブルにない列や誤った種類の列が、テーブルと列の名前を記載するメッセージで停止します。2回登録されると、2回目の登録が最初の登録に代わります。
セーブがすること
- アドレス付きのクリエイトはジオコードされます。更新は住所が変わった場合にのみジオコードされます。つまり、アドレスを元通りに送信したり、他の列だけを変えるセーブは誰にも質問しません。
- 更新は変更した列のみを含みますので、ジオコードされるアドレスは保存されたアドレスの上にその変更が重ねられたものです。
- 座標はユーザーが設定できるかどうかにかかわらず同じセーブで送信されます。ジオコーディングはユーザーのチェックに合格した後、アプリユーザーとして実行されます( インターセプター参照)。保存されたアドレスもジオコーダーにとってアプリとして読み取られ、ユーザーとしては読み取れません。Dataverse自身が保護する(
DataverseSecurity)セッションは例外で、ユーザーとしてDataverseに送信されるため、Dataverse独自のカラムセキュリティは座標に適用されます。 - 座標自体を設定するセーブデータ(例えば手で動かしたピンなど)は、その座標を保持します。
- 座標の保存は拒否されません。どこにも見つからないアドレスや、サービスが
Geocoding:Timeout(デフォルトで10秒)に尋ねられないアドレスは座標なしで保存され、空のアドレスも同様で、アドレスの前の位置は保持されません。警告はアドレスなしで記録されます。
ジオコーディング登録前に保存された行は、アドレスが変わるまでその座標を保持します。
提供者
サービスは PowerPortalsPro:Maps:Geocoding セクションで設定されており、地図を作成するプロバイダーとは別に設定されています。 Geocoding:Provider が名前を付け、地図の提供者が名前を付けない場合はそのプロバイダーが使われます。
{
"PowerPortalsPro": {
"Maps": {
"Provider": "Google",
"Geocoding": {
"Provider": "AzureMaps",
"Timeout": "00:00:10"
},
"AzureMaps": { "ClientId": "..." }
}
}
}
- Azure Maps(
AzureMaps):ポータル自身のIDとして尋ねられます。マップのコードなのでキーは不要です。設定AzureMaps:ClientId;IDのAzure Maps Data Readerロールで検索可能です。 - Esri (
Esri):結果の保存を依頼され、ArcGISが料金を請求します。Geocoding:ApiKey、そのキーはジオコーディング権限を必要とし、マップのキーのようにポータルのアドレスだけでなくサーバーから作業しなければなりません。 - Google (
Google):サーバーから動作するGeocoding APIとGeocoding:ApiKeyキーです。ポータルのアドレスに限定された地図キーは拒否されます。 - OpenStreetMap (
OpenStreetMap):任意のNominatimサーバー、OpenStreetMap自身のサーバーで、Geocoding:Urlが他に指定しない限り、プロバイダーが指定されていない場合はデフォルトサーバーです。OpenStreetMapのサーバーは最大1秒に1回リクエストされるため、セーブはすぐに順番を待ち、Geocoding:Timeoutより長く待つサーバーは座標なしで保存されます。また、誰が質問しているのかも知りたいので、Geocoding:UserAgentをポータル名と連絡手段に設定してください。使用ポリシーではアプリケーションによる定期的なジオコーディングは推奨されていないため、本番環境では自社サーバーを使いましょう。
アドレスが登録されると、ポータル開始時に設定を確認します。必要なものを持たないプロバイダーは、設定名を記載するメッセージで停止します。
あなた自身のジオコーダー
別のサービスに問い合わせるために IGeocoder を登録します。その行がアドレスを持つアドレスを、 ToString()からの1行形式で与えられ、座標を返すか、一致しない場合は座標を返しません。スローは座標なしで行を保存します。
public class MyGeocoder(IHttpClientFactory httpClientFactory) : IGeocoder
{
public async Task<GeocodedPosition?> GeocodeAsync(GeocodingAddress address, CancellationToken cancellationToken)
{
// 住所の座標をサービスに尋ねてください
var client = httpClientFactory.CreateClient();
var match = await client.GetFromJsonAsync<Match?>(
$"https://geocoder.contoso.com/find?q={Uri.EscapeDataString(address.ToString())}", cancellationToken);
return match is null ? null : new GeocodedPosition(match.Latitude, match.Longitude);
}
private sealed record Match(double Latitude, double Longitude);
}
builder.Services.AddSingleton<IGeocoder, MyGeocoder>();
ジオコーディングなしの座標
座標を別の方法で行に割り当てたテーブルは、AddGeocoding自身と同様に、AddMapCoordinates列のみを登録します。複数のテーブルのマップは、テーブルの行をForMaps()のみで配置します。
builder.Services.AddMapCoordinates("ppp_site", latitude: "ppp_latitude", longitude: "ppp_longitude");
// 登録された座標に配置された
builder.Services.AddMultiTableSource("ppp_site", t => t.ForMaps());