最終クリック日: まだ何もありません
Map Viewやクエリから、緯度と経度のDataverse行をプロットし、自分のマーカー、線、面積、円の隣に配置します。BlazorやReactと同じコンポーネントを選んだプロバイダー(Azure Maps、Esri、Google、OpenStreetMap、または任意のMapLibreスタイル)によって作成されます。
12のオフィスがマーカーとして、ルート、配送ゾーン、販売地域として配置されています。近接したマーカーはクラスターに集まり、クリックするとズームインします。オフィスをクリックするとポップアップが表示され、こちらはページ自身のコンテンツです。ルートやエリアは開かれていません。ページはクリックに応じて応答し、地図の下の線が聞いた内容を示しています。
最終クリック日: まだ何もありません
アクティブなアカウントは、関係タイプで色付けされたか、スイッチで連絡先を表示し、訪問者の権限を持つFetchXMLクエリで読み取り、その経度と緯度に配置されます。クリックするとポップアップが表示されます。行名の下にあるクエリの他の列で、ページが開きます。地図上のボックスはポータルの提供者アドレスを見つけてピン留めします。
最終クリック日: まだ何もありません
住所が見つかりました: 地図上のボックスで探してみてください
ポータルの設定ではプロバイダー名と各プロバイダーのキーが PowerPortalsPro:Maps セクションに記載されているため、マップにはキー名が記載されず、どのページにもキーが入っていません。マーカー、クラスタ、ポップアップ、クリックはすべてのプロバイダーで同じように動作します:
Esri:ApiKeyのArcGIS APIキー、そして道路の代わりに任意のArcGISベースマップスタイルを使います。Google:ApiKeyのMaps JavaScript APIキーと、Google Cloudでスタイリングされた地図の地図IDです。OpenStreetMap:TileUrl で自分のタイルサーバーに名前を付けてください。MapLibre:StyleUrl または MapLibre:TileUrlのMapLibreスタイルやラスタタイルURL。// appsettings.json; keep the keys with the portal's other secrets
{
"PowerPortalsPro": {
"Maps": {
"Provider": "AzureMaps",
"AzureMaps": { "ClientId": "the Azure Maps account's client id" },
"Esri": { "ApiKey": "an ArcGIS API key" },
"Google": { "ApiKey": "a Maps JavaScript API key", "MapId": "a map id" }
}
}
}
EsriとGoogleのキーはビューワーのブラウザに届き、すべてのウェブマップと同様にプロバイダーに送信されます。それぞれをプロバイダーのコンソール内のポータルアドレスに制限してください。
ページはプロバイダーの名前を付けるだけでポータル以外のものを使い、見た目だけを表示します:スタイル、地図ID、争われている境界のビューなどです。設定されていないのは設定上の問題です。ダークテーマではマップがプロバイダーのダークスタイルに切り替わります。 UsePortalTheme それをオフにします。
<Map items={items} />
<Map provider={{ name: 'google', mapId: 'a map id' }} items={items} />
<Map provider={{ name: 'esri', styleName: 'arcgis/navigation' }} items={items} />
<Map provider={{ name: 'mapLibre', styleUrl: 'https://tiles.openfreemap.org/styles/liberty' }} items={items} /><Map Items="items" />
<Map Provider="@(new GoogleMapProvider { MapId = "a map id" })" Items="items" />
<Map Provider="@(new EsriMapProvider { StyleName = "arcgis/navigation" })" Items="items" />
<Map Provider="@(new MapLibreMapProvider { StyleUrl = "https://tiles.openfreemap.org/styles/liberty" })" Items="items" />Azure MapsマップはEntraトークンでサインインし、ポータルはDataverseに接続する独自のIDに割り当てられるため、Azure Mapsキーは不要でブラウザに届く必要もありません。そのIDはAzure Mapsアカウントの Azure Maps Data Reader の役割を与え、それ以上のものは設定せず、 AzureMaps:ClientId アカウントの認証ページでクライアントIDに設定してください。
すべてのビューアはトークンを保持しているため、その役割で許可される範囲のみを実行できます。アカウントの許可された発信元もポータルのアドレスに限定してください。マップは新しいトークンの有効期限前に要求します。ページが一度だけリクエストすると、1人のビューアに1 PowerPortalsPro:Maps:RateLimit 分間に120トークンが渡されることがあります。サインインしていない訪問者は住所でカウントされ、そのアドレスは同じオフィスの接続先の全員が共有します。
ビューやFetchXMLクエリを付与すると、緯度と経度を持つ各行はテーブルのプライマリ名で名付けられたマーカーになります。行はグリッドと同様にユーザーの許可で読み込まれ、クリックするとそのビューの列が表示されます。
<Map
viewId={activeAccountsViewId}
latitudeColumn="address1_latitude"
longitudeColumn="address1_longitude"
recordColor="var(--colorPaletteRedBackground3)"
/><Map ViewId="activeAccountsViewId"
LatitudeColumn="address1_latitude"
LongitudeColumn="address1_longitude"
RecordColor="var(--colorPaletteRedBackground3)" />両方の座標でない行はクエリから除外されます。地図は特に指定 MaxRows がない限り1,000行(最大5,000行)を読み取り、それ以上の場合は地図にメモを残します。
座標のない行は、保存した際にアドレスから埋めることができます:ジ オコーディングを参照してください。
MultiTable(React: multiTable)では、マップはサーバーがForMapsでマッピングするすべてのテーブルの行を示し、各テーブルはそれぞれの色で凡例付きを示します。レジストレーションは行の緯度と経度を持つ列の名前を付け、これらは常に読み込まれます。DefaultTables最初に表示されるテーブルを選択し、表示可能なものをTablesします。Regardingレコードに関する行に絞り込みます。
// Program.cs
builder.Services.AddMultiTableSource("account", t => t
.Columns("address1_city")
.ForMaps(latitude: "address1_latitude", longitude: "address1_longitude"));
builder.Services.AddMultiTableSource("contact", t => t
.ForMaps(latitude: "address1_latitude", longitude: "address1_longitude"));
座標が AddMapCoordinatesで登録されるか、 AddGeocodingで埋められたテーブルは、 ForMaps() のみで地図が登録されます:ジ オコーディングを参照してください。
<Map multiTable defaultTables={['account']} allowSavedViews /><Map MultiTable="true" DefaultTables="@(["account"])" AllowSavedViews="true" />マップ上のツールバーがビューを選択します:すべてのテーブル、または AddMultiTableView と ForMaps()に登録された複数のテーブルのビューです。 ViewIds (React: viewIds)は、名前を付けた登録ビューのみを順番で提供し、開く時のビューを DefaultViewId (defaultViewId)提供します。フィルターメニューではテーブルのオン・オフを切り替え、各テーブルのフィルターを編集します。 AllowSavedViews (React: allowSavedViews)では、サインインしたユーザーはマップに表示されるものを自分のビューとして保存できます: 詳細は「保存済みビュー」を参照してください。
AllowNearSearch(React: allowNearSearch)では、複数のテーブルの地図にツールバーに「近づき」ボタンがあります。場所(地図提供者の検索で住所、ブラウザが共有を求める訪問者の位置)を見つけ、地図は選んだ距離内の行のみを表示します。すべてのテーブルで一番近い順に。円が描かれ、地図がそれに適合し、各行のポップアップで距離が表示されます。NearDistances(nearDistances)は提供される距離を設定します。設定がなければ1、5、10、25、50、100、NearDistance(nearDistance)は開始地点、25は設定がなければ、NearDistanceUnit(nearDistanceUnit)はマイル、デフォルト、またはキロメートルで始まる。訪問者は切り替え可能です。Nearby デモでご覧いただけます。
<Map
multiTable
allowNearSearch
nearDistances={[10, 25, 50, 100]}
nearDistance={25}
nearDistanceUnit={DistanceUnits.Kilometers}
/><Map MultiTable="true"
AllowNearSearch="true"
NearDistances="@([10, 25, 50, 100])"
NearDistance="25"
NearDistanceUnit="DistanceUnit.Kilometers" />各テーブルは登録座標で読み取り、訪問者の許可を得て、サーバーは円の周りのマスを読み取り、行を地面からの距離で保持し、最も近い行を返します。場所の近くで検索すると最大500行、つまり最も近い行が保持され、地図の凡例はそれ以上があったと示します。 NearSearchOptions.MaximumMatches はそれを増減し、最大5,000行まで調整します。テーブルの座標を読まない訪問者は、その列を一つも見つけられません。
// Program.cs
builder.Services.Configure<NearSearchOptions>(options => options.MaximumMatches = 1_000);
アイテム、マーカー、線、エリア、円をクリックすると、アイテム、そのデータ、クリックされた場所が OnItemClick 上がり、その上にポップアップが表示されます。ポップアップはFluentカードで、Blazorではテンプレート、Reactではレンダリング関数など、あなた自身のコンテンツが表示されます。マップ自体をクリックすると、その位置が OnMapClick 上がります。
<Map
items={items}
onItemClick={({ item, position }) => select(item)}
onMapClick={({ position }) => addStop(position)}
renderPopup={(item) => (
<>
<strong>{item.title}</strong>
<Button onClick={() => open(item)}>Open</Button>
</>
)}
/><Map Items="items" OnItemClick="OnItemClicked" OnMapClick="OnMapClicked">
<PopupTemplate>
<strong>@context.Title</strong>
<FluentButton OnClick="@(() => Open(context))">Open</FluentButton>
</PopupTemplate>
</Map>クリックに答えるには、自分で行うように、レコードのページを開くか、地域を選択し、クリックで PreventDefault() (ReactでpreventDefault() )と呼びますが、マップはポップアップを表示しません。 ShowPopups falseに設定すると、すべてのアイテムでポップアップがオフになります。
<Map
viewId={accountsViewId}
onItemClick={(event) => {
// A row's marker opens its record's page; anything else its popup.
const row = event.item.data as MapRecord | undefined;
if (row?.record) {
event.preventDefault();
navigate(`/accounts/${row.record.id}`);
}
}}
/><Map ViewId="accountsViewId" OnItemClick="OnItemClicked" />
@code {
// A row's marker opens its record's page; anything else its popup.
private void OnItemClicked(MapItemClickEventArgs args)
{
if (args.Item.Record is { } record)
{
args.PreventDefault();
Navigation.NavigateTo($"accounts/{record.Id}");
}
}
}行のポップアップ見出しは、そのテーブルのページ( AddRecordPage で登録されたページ(記録 ページ参照)にリンクします。これは1つまたは複数のテーブルのマップ上で。 RecordUrl 、行のIDの代わりに {0} 、テーブルのURLを {1} します。 ShowRecordLinks (React: showRecordLinks)をfalseに設定するとリンクが無効になります。自分のアイテムがその Urlにリンクします。Reactでは、 onNavigate ルーターでリンクをたどります。
ある場所にあるマーカー、例えばある住所の連絡先はズームしてもバラされず、そのクラスタがそれらを一覧にします。
ColorColumn 各行のマーカーは、選択肢、ステータス、ステータス理由、またはイエス/ノーの列で色を付けます。例えば、Dataverseのオプションの色、またはFluentのパレットの色がない場合、マップ上のオプションの凡庸な表示付きです。値のない行はグレーです。その他のルールについては、Blazorの RecordColorSelector とReactの recordColor 関数で各行に独自の色を与えます。
<Map viewId={accountsViewId} colorColumn="customertypecode" recordUrl="/accounts/{0}" />
<Map viewId={accountsViewId} recordColor={(record) => (isKeyAccount(record) ? 'var(--colorPaletteRedBackground3)' : undefined)} /><Map ViewId="accountsViewId" ColorColumn="customertypecode" RecordUrl="accounts/{0}" />
<Map ViewId="accountsViewId" RecordColorSelector="@(record => IsKeyAccount(record) ? "var(--colorPaletteRedBackground3)" : null)" />ShowAddressSearch 地図の隅に検索ボックスを配置します。ポータルの提供者で先に表示される場所と住所を特定し、選択したものをピン留めします。 OnAddressSelected ページに場所を渡し、検索がクリアされると無効化します。 AddressSearchCountries 一部の国に保存し、 GoToAddressAsync (Reactの参照goToAddress )コードから検索します。
<Map
viewId={accountsViewId}
showAddressSearch
addressSearchCountries={['US', 'CA']}
onAddressSelected={(place) => setNear(place?.position ?? null)}
/><Map ViewId="accountsViewId"
ShowAddressSearch="true"
AddressSearchCountries="@(["US", "CA"])"
OnAddressSelected="@(place => _near = place?.Position)" />Azure Maps、Esri、Googleは訪問者タイプとして場所を提案します。GoogleのキーはPlaces API(New)を有効にする必要があり、Esriのキーはジオコーディング権限を持っています。OpenStreetMapとMapLibreのマップはOpenStreetMapのNominatimを検索しますが、使用ポリシーでは軽度の使用のみが許可されており、誰かがタイプする際には決して使えません。Enterキーを押すと検索します。 OpenStreetMap:GeocoderUrl または MapLibre:GeocoderUrl で自分のNominatimサーバー名を付けてください。
Address (Reactのaddress )は検索ボックスのない1つのアドレスを表示します。地図は描画された後、同じ検索でそれを見つけ、変更された際に再びピン留めしてズームします。スピナーは探している間に表示し、見つからないときはメッセージを表示します。座標のないアドレスに対して AddressDisplayValueの地図ピン が開くものです。
<Map address="1 Microsoft Way, Redmond, WA 98052" height="300px" /><Map Address="1 Microsoft Way, Redmond, WA 98052" Height="300px" />ShowPrintButton (ReactでshowPrintButton )は、 MultiTable マップのツールバー、または地図右上隅に「印刷」ボタンを追加し、地図のピン、凡例、ポップアップ、プロバイダーの帰属を表示します。 PrintTitle はその上の見出しで、 PrintEntries はピンのラベルの隣に記録をリストアップします。マーカーの Label は点の代わりにピンに描かれ、停留所に番号を付けるとルートシートとして読み取られます。 PrintAsync() (React参照のprint() )はページ固有のボタンから印刷され、 OnPrintChanged (onPrintChange)は地図をいつ印刷できるか、画像として保存できるかどうかを指示し、そのボタンが続くようにします。
const stops: MapMarker[] = [{ kind: 'marker', id: '1', label: '1', title: 'Contoso', position: { latitude: 47.61, longitude: -122.33 } }];
<Map
ref={mapRef}
items={stops}
showPrintButton
printTitle="Tuesday's visits"
printEntries={stops.map((stop) => ({ label: stop.label, title: stop.title ?? '' }))}
/>
// The same from a button of the page's own.
mapRef.current?.print();<Map @ref="_map"
Items="stops"
ShowPrintButton="true"
PrintTitle="Tuesday's visits"
PrintEntries="@stops.Select(stop => new MapPrintEntry(stop.Title!, stop.Label)).ToList()" />
@code {
// A marker's Label is drawn on its pin, and beside it in the printed list.
private List<MapMarker> stops = [new() { Id = "1", Label = "1", Title = "Contoso", Position = new(47.61, -122.33) }];
private Map? _map;
// The same from a button of the page's own.
private Task PrintAsync() => _map!.PrintAsync();
}Azure Maps、Esri、OpenStreetMap、MapLibreの各マップは地図の画像として印刷されるため、地図の周囲のページは省かれ、地図は動きません。同じボタンでその画像はPNGファイル(SaveImageAsyncまたは saveImage())として保存されます。画像にはタイトルとフィールド、または表示されたマーカー付きのポップアップが表示されます。ページ固有の内容(PopupTemplateや renderPopup)を示すポップアップは、そのアイテムのタイトルとともに描かれます。Googleマップは画像にコピーできないため、ポップアップを含めてそのまま印刷され、残りのページは印刷から除外され、保存する画像はありません。自分のプロバイダーは、その表面が captureを実装すると画像として印刷されます。
NativeOptions 地図作成時にプロバイダー自身の地図に渡されます。例えばGoogleのストリートビューをオンにしたり、MapLibreの地図をスクロールホイールだけでズームしたりできます(cooperativeGestures: false);デフォルトではCtrlが必要です。GoogleのスクロールページではCtrlキーなので、ページはスクロールして通り過ぎます。プロバイダーの地図オブジェクトはあなたのJavaScriptでも利用可能です。Blazorの GetNativeMapAsync 、React参照のReact native 。
<Map provider={{ name: 'google' }} nativeOptions={{ streetViewControl: true }} /><Map Provider="@(new GoogleMapProvider())"
NativeOptions="@(new Dictionary<string, object?> { ["streetViewControl"] = true })" />プロバイダーはベースマップを描き、形状を描き、要素を配置し、クリックや移動を報告します。その他はすべてマップのものです。名前で登録し、そのマップの設定で名前を付けます。
import { registerMapProvider, type MapSurface } from '@powerportalspro/react-maps';
registerMapProvider({
name: 'arcgis-sdk',
async create(context): Promise<MapSurface> {
// Draw into context.container with your library; report clicks and moves through
// context.events; return the surface: camera, projection, overlays and shapes.
},
});
Blazorでは、ページ上のJavaScriptに登録した名前で CustomMapProvider を使います。
Google以外のすべてのプロバイダーを描画するMapLibreは、独自のファイルからワーカースクリプトを読み込みます。 maplibre-gl を @powerportalspro/react-maps隣にインストールし、地図を描く前に一度だけバンドラーがワーカーをどこに置いたかを伝えてください。Blazorはセットアップは不要です。
// main.tsx, with Vite
import { setMapLibreWorkerUrl } from '@powerportalspro/react-maps';
import workerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url';
setMapLibreWorkerUrl(workerUrl);
名称 | 種類 | デフォルト | 概要 |
|---|---|---|---|
Address | string? | ||
AddressSearchCountries | IReadOnlyList<string>? | ||
AllowFiltering | bool | False | |
AllowNearSearch | bool | False | |
AllowSavedViews | bool | False | |
Center | MapPosition? | ||
Cluster | bool | True | |
ColorColumn | string? | ||
DefaultTables | IEnumerable<string>? | ||
DefaultViewId | Guid? | ||
FetchXml | string? | ||
Filters | IReadOnlyList<QueryFilter>? | ||
FitItemIds | IReadOnlyList<string>? | ||
Height | string | 400px | |
Items | IReadOnlyList<MapItem>? | ||
LatitudeColumn | string | address1_latitude | |
LongitudeColumn | string | address1_longitude | |
MapStyle | MapStyle | Road | |
MaxRows | int | 1000 | |
MultiTable | bool | False | |
NativeOptions | IReadOnlyDictionary<string, Object>? | ||
NearDistance | double? | ||
NearDistances | IReadOnlyList<double>? | ||
NearDistanceUnit | DistanceUnit | Miles | |
PopupTemplate | RenderFragment<MapItem>? | ||
PrintEntries | IReadOnlyList<MapPrintEntry>? | ||
PrintEntriesProvider | Func<IReadOnlyList<MapPrintEntry>>? | ||
PrintTitle | string? | ||
Provider | MapProvider? | ||
RecordColor | string? | ||
RecordColorSelector | Func<TableRecord, string>? | ||
RecordUrl | string? | ||
RecordUrlSelector | Func<TableRecord, string>? | ||
Regarding | TableRecordReference? | ||
SavedViewsKey | string? | ||
ShowAddressSearch | bool | False | |
ShowLegend | bool | True | |
ShowPopups | bool | True | |
ShowPrintButton | bool | False | |
ShowRecordLinks | bool | True | |
SignInUrl | string | Account/Login | |
Tables | IEnumerable<string>? | ||
Title | string? | ||
TitleColumn | string? | ||
UsePortalTheme | bool | True | |
ViewId | Guid? | ||
ViewIds | IEnumerable<Guid>? | ||
Width | string | 100% | |
Zoom | double? |
AddressAddressSearchCountriesAllowFilteringAllowNearSearchAllowSavedViewsCenterClusterColorColumnDefaultTablesDefaultViewIdFetchXmlFiltersFitItemIdsHeightItemsLatitudeColumnLongitudeColumnMapStyleMaxRowsMultiTableNativeOptionsNearDistanceNearDistancesNearDistanceUnitPopupTemplatePrintEntriesPrintEntriesProviderPrintTitleProviderRecordColorRecordColorSelectorRecordUrlRecordUrlSelectorRegardingSavedViewsKeyShowAddressSearchShowLegendShowPopupsShowPrintButtonShowRecordLinksSignInUrlTablesTitleTitleColumnUsePortalThemeViewIdViewIdsWidthZoom名称 | 種類 | 概要 |
|---|---|---|
OnAddressSelected | EventCallback<MapPlace> | |
OnError | EventCallback<string> | |
OnItemClick | EventCallback<MapItemClickEventArgs> | |
OnMapClick | EventCallback<MapClickEventArgs> | |
OnPrintChanged | EventCallback<MapPrintState> | |
OnViewChanged | EventCallback<MapView> |
OnAddressSelectedOnErrorOnItemClickOnMapClickOnPrintChangedOnViewChanged名称 | パラメータ | 種類 | 概要 |
|---|---|---|---|
ClearAddressAsync | Task | ||
ClosePopupAsync | Task | ||
FitToItemsAsync | IEnumerable<string> ids | Task | |
GetMapSettingsAsync | string provider | Task<MapSettingsResponse> | |
GetNativeMapAsync | Task<IJSObjectReference> | ||
GetViewAsync | Task<MapView> | ||
GoToAddressAsync | string text | Task<MapPlace> | |
NotifyAddressSelectedAsync | MapPlace place | Task | |
NotifyAddressStatusAsync | string status | Task | |
NotifyClusterClickAsync | string[] ids MapPosition position | Task | |
NotifyErrorAsync | string kind string message | Task | |
NotifyItemClickAsync | string id MapPosition position | Task | |
NotifyMapClickAsync | MapPosition position | Task | |
NotifyViewChangedAsync | MapView view | Task | |
OpenPopupAsync | string id | Task | |
PrintAsync | Task | ||
SaveImageAsync | string fileName | Task<bool> | |
SetCameraAsync | MapCamera camera bool animate | Task |
ClearAddressAsyncClosePopupAsyncFitToItemsAsyncGetMapSettingsAsyncGetNativeMapAsyncGetViewAsyncGoToAddressAsyncNotifyAddressSelectedAsyncNotifyAddressStatusAsyncNotifyClusterClickAsyncNotifyErrorAsyncNotifyItemClickAsyncNotifyMapClickAsyncNotifyViewChangedAsyncOpenPopupAsyncPrintAsyncSaveImageAsyncSetCameraAsync