Mapa

Map plota linhas do Dataverse a partir de uma visualização ou consulta em sua latitude e longitude, ao lado de marcadores, linhas, áreas e círculos próprios. Um componente, o mesmo em Blazor e React, desenhado pelo provedor que você escolher: Azure Maps, Esri, Google, OpenStreetMap ou qualquer estilo MapLibre.

Escritórios, uma rota e áreas

Doze escritórios como marcadores, uma rota, uma zona de entrega e uma região de vendas. Marcadores próximos uns dos outros se agrupam em agrupamentos, que dão zoom quando clicados. Clique em um escritório para seu popup, aqui o conteúdo da própria página; a rota e as áreas não abrem nenhuma, pois a página responde aos seus cliques, e a linha abaixo do mapa mostra o que ouviu.

Exemplo de reação Exemplo de Blazor React TypeScript Razor
Carregando o mapa...

Último clique: Nada ainda

Contas e contatos do Dataverse

As contas ativas, coloridas pelo tipo de relacionamento, ou com a troca de contatos, são lidas por uma consulta FetchXML com as permissões do visitante e colocadas em sua latitude e longitude. Clique em uma para ver seu pop-up: as outras colunas da consulta sob o nome da linha, que abre sua página. A caixa sobre o mapa encontra um endereço com o provedor do portal e o fixa.

Exemplo de reação Exemplo de Blazor React TypeScript Razor
  • Cliente
  • Investidor
  • Parceiro
  • Perspectiva
  • Revendedor
  • Fornecedor
Carregando o mapa...

Último clique: Nada ainda
Endereço encontrado: Procure um na caixa sobre o mapa

Provedores

A configuração do portal nomeia seu provedor e mantém as chaves de cada provedor, na PowerPortalsPro:Maps seção, então um mapa precisa não nomear nenhum e nenhuma página contém uma chave. Marcadores, clusters, popups e cliques funcionam da mesma forma em todos os provedores:

  • Azure Maps: nenhuma chave, pois o portal faz login com sua própria identidade (abaixo). Sua atribuição é mostrada conforme seus termos pedem.
  • Esri: uma chave API do ArcGIS em Esri:ApiKey, e qualquer estilo de mapa-base do ArcGIS no lugar das ruas.
  • Google: uma chave de API JavaScript do Maps em Google:ApiKey, e um ID de mapa para um mapa estilizado no Google Cloud.
  • OpenStreetMap: sem chave, e o provedor quando não está configurado, para desenvolvimento e uso leve. A política de tiles do OpenStreetMap exclui uso intenso; indique seu próprio servidor de tiles para OpenStreetMap:TileUrl produção.
  • MapLibre: qualquer URL de tile estilo ou raster em MapLibre:StyleUrl ou MapLibre:TileUrl, como MapTiler, OpenFreeMap, Stadia ou seu próprio servidor.

As chaves da Esri e do Google chegam ao navegador do visualizador, que as envia para o provedor, como todos os mapas da web. Restringa cada uma aos endereços do seu portal no console do provedor.

Uma página nomeia um provedor apenas para usar outro que não o portal, e diz apenas como ele se apresenta: um estilo, um ID de mapa, uma visão das bordas disputadas. O que ela deixa sem definir vem da configuração. Em um tema escuro, o mapa muda para o estilo escuro do provedor; UsePortalTheme desliga isso.

React Blazor

Azure Maps sem chave

Um mapa do Azure Maps faz login com tokens Entra que o portal emite para sua própria identidade, aquela que ele se conecta ao Dataverse, então nenhuma chave do Azure Maps é necessária ou chega ao navegador. Dê a essa identidade o papel de Leitor de Dados do Azure Maps na conta Azure Maps e nada mais, e defina AzureMaps:ClientId para o id do cliente na página de Autenticação da conta.

Todo visualizador mantém o token enquanto ele está em execução, então ele só pode fazer o que esse papel permite; limite as origens permitidas da conta aos endereços do seu portal também. O mapa pede um novo token antes de expirar. Uma página pede uma vez, e um espectador pode receber 120 tokens por minuto, a menos que PowerPortalsPro:Maps:RateLimit diga o contrário; visitantes que não estão logados são contados pelo endereço, que todos os responsáveis pela conexão de um escritório compartilham.

Linhas do Dataverse

Dê uma visualização ou uma consulta FetchXML, e cada linha com latitude e longitude se torna um marcador nomeado pelo nome principal da tabela. As linhas são lidas com as permissões do usuário, assim como as de uma grade, e ao clicar em uma mostra as colunas da visualização.

React Blazor

Linhas sem ambas as coordenadas são deixadas de fora da consulta. O mapa indica 1.000 linhas, a menos que MaxRows diga o contrário (no máximo 5.000) e anota no mapa quando há mais.

Linhas sem coordenadas podem tê-las preenchidas a partir de seus endereços à medida que são salvas: veja Geocodificação.

Várias mesas

Com MultiTable (Reagir: multiTable), o mapa mostra as linhas de cada tabela que o servidor registra para mapas com ForMaps, cada tabela em sua própria cor com uma legenda. O registro nomeia as colunas que contêm a latitude e longitude de uma linha, que são sempre lidas. DefaultTables escolhe as tabelas mostradas inicialmente e Tables as que pode mostrar; Regarding reduz para as linhas ao redor de um registro.

Uma tabela cujas coordenadas são registradas com AddMapCoordinates, ou preenchidas por AddGeocoding, é registrada para mapas com apenas com ForMaps() : veja Geocodificação.

React Blazor

Uma barra de ferramentas sobre o mapa escolhe a visualização: cada tabela, ou uma visualização de várias tabelas registradas com AddMultiTableView e ForMaps(). ViewIds (Reagir: viewIds) oferece apenas as visualizações registradas que ela nomeia, em sua ordem, e DefaultViewId (defaultViewId) aquela em que ela se abre. Seu menu de Filtro alterna com as tabelas e edita os filtros de cada tabela. Com AllowSavedViews (Reagir: allowSavedViews), um usuário logado pode salvar o que o mapa mostra como uma visualização própria: veja Visualizações Salvas.

Encontrando registros próximos a um local

Com AllowNearSearch (Reagir: allowNearSearch), um mapa de várias tabelas possui um botão Perto em sua barra de ferramentas. Ele encontra um lugar — um endereço, com a busca do fornecedor do mapa, ou a localização do visitante, que o navegador pede para compartilhar — e o mapa então mostra apenas as linhas dentro da distância escolhida, as primeiras mais próximas em cada tabela: o círculo é desenhado, o mapa ajustado a ele, e o pop-up de cada linha mostra a distância. NearDistances (nearDistances) define as distâncias oferecidas, 1, 5, 10, 25, 50 e 100, a menos que esteja definida, NearDistance (nearDistance) a que começa, 25 a menos que definida, e NearDistanceUnit (nearDistanceUnit) se começa em milhas, o padrão ou quilômetros; o visitante pode trocar. Veja na demonstração Proximidade.

React Blazor

Cada tabela é lida pelas coordenadas registradas, com as permissões do visitante: o servidor lê o quadrado ao redor do círculo, mantém as linhas dentro da distância em relação ao chão e retorna a mais próxima. Uma busca perto de um local mantém no máximo 500 linhas, a mais próxima, e a legenda do mapa diz quando havia mais; NearSearchOptions.MaximumMatches aumenta ou diminui isso, até 5.000. Um visitante que pode não ler as coordenadas de uma tabela não encontra nenhuma de suas linhas.

Popups e cliques

Clicar em um item, marcador ou linha, área ou círculo, aparece OnItemClick com o item, seus dados e onde foi clicado, e então abre um pop-up sobre ele. O popup é um cartão Fluent com seu próprio conteúdo: um template no Blazor, uma função de renderização no React. Um clique no próprio mapa aumenta OnMapClick com sua posição.

React Blazor

Para responder a um clique do seu próprio jeito, abra a página de um registro, por exemplo, ou selecione uma região, chame PreventDefault() ao clicar (preventDefault() no React) e o mapa não abre nenhum pop-up para isso. ShowPopups Configure para falso desliga os pop-ups para cada item.

React Blazor

O cabeçalho popup de uma linha faz um link para a página do seu registro, aquela registrada para sua tabela com AddRecordPage (veja Páginas de Registro), em um mapa de uma tabela ou várias. RecordUrl a vincula para outro lugar: uma URL com {0} no lugar do id da linha e {1} do de sua tabela. ShowRecordLinks (React: showRecordLinks) definido como falso desativa os links. Um item dos seus próprios links para Urlseu . No React, onNavigate segue o link com seu roteador.

Marcadores em um lugar, como os contatos em um endereço, nunca se separam ao dar zoom, então o grupo deles os lista em vez disso.

Cores por coluna

ColorColumn colorir o marcador de cada linha pela sua opção em uma coluna de escolha, status, motivo de status ou sim/não: a cor que a opção tem no Dataverse, ou uma das paletas do Fluent quando não houver, com uma legenda das opções no mapa. Linhas sem valor são cinzas. Para qualquer outra regra, RecordColorSelector no Blazor e uma função para recordColor no React dão a cada linha sua própria cor.

React Blazor

Busca por endereço

ShowAddressSearch coloca uma caixa de busca sobre o canto do mapa. Ele encontra endereços e lugares com o próprio provedor do portal, coloca os lugares em visualização primeiro e fixa o escolhido; OnAddressSelected entrega a página o local, e nulo quando a busca é limpa. AddressSearchCountries mantém em alguns países e GoToAddressAsync (goToAddress na referência do React) faz buscas a partir do código.

React Blazor

Azure Maps, Esri e Google sugerem locais como tipos de visitantes. A chave do Google precisa habilitar a API Lugares (Nova), e a chave da Esri seu privilégio de geocodificação. Os mapas OpenStreetMap e MapLibre pesquisam no Nominatim do OpenStreetMap, cuja política de uso permite apenas para uso leve e nunca quando alguém digita, então eles pesquisam quando pressionam Enter; nomeie seu próprio servidor Nominatim em OpenStreetMap:GeocoderUrl ou MapLibre:GeocoderUrl para mais informações.

Address(address no React ) mostra um endereço sem uma caixa de busca: o mapa o encontra com a mesma busca depois de desenhado, e novamente sempre que muda, fixa e dá zoom até ele. Um spinner mostra enquanto ele procura, e uma mensagem quando não é encontrado. É o pinoAddressDisplayValue do mapa que abre para um endereço sem coordenadas.

React Blazor

Impressão

ShowPrintButton (showPrintButton no React ) adiciona um botão Imprimir — na barra de ferramentas de um MultiTable mapa, ou no canto superior direito do mapa — que imprime o mapa conforme mostra, com seus pins, sua legenda, o popup aberto nele e a atribuição do provedor. PrintTitle é o título acima dele, e PrintEntries lista registros abaixo, cada um ao lado do rótulo do seu pin. O marcador Label é desenhado em seu pin no lugar do ponto: dá um número para as paradas e a impressão é uma folha de rota. PrintAsync() (print() na referência React) imprime a partir de um botão próprio da página, e OnPrintChanged (onPrintChange) diz quando o mapa pode ser impresso e se pode ser salvo como imagem, para que esse botão siga o local.

React Blazor

Azure Maps, Esri, OpenStreetMap e mapas MapLibre são impressos como uma imagem do mapa, então a página ao redor do mapa fica de fora e o mapa não se move; o mesmo botão também salva essa imagem como um arquivo PNG (SaveImageAsync, ou saveImage()). Um popup aberto é desenhado na imagem com seu título e campos, ou nos marcadores que ela lista; um que mostra o conteúdo da própria página (PopupTemplate, ou renderPopup) é desenhado com o título do item. Um mapa do Google não pode ser copiado para uma imagem, então ele é impresso como está na página, popup e tudo, o restante da página fica fora da impressão e não oferece imagem para salvar. Um provedor seu próprio é impresso como imagem quando sua superfície implementa capture.

As próprias funcionalidades do provedor

NativeOptions são passadas para o próprio mapa do provedor conforme é feito, sobre o próprio mapa. Isso ativa o Street View para o Google, por exemplo, ou permite que um mapa do MapLibre faça zoom apenas com a roda de rolagem (cooperativeGestures: false); por padrão, ele precisa de Ctrl, assim como o do Google em uma página que rola, para que a página role além dela. O objeto mapa do provedor também está disponível para seu próprio JavaScript: GetNativeMapAsync no Blazor, native na referência React.

React Blazor

Seu próprio provedor

Um provedor desenha o mapa base e as formas, coloca elementos e reporta cliques e movimentos. Todo o resto é do mapa. Registre um com seu nome e depois dê um nome nas configurações do provedor do mapa.

No Blazor, use CustomMapProvider com o nome que você registrou no JavaScript da sua página.

Configuração React

O MapLibre, que desenha todos os provedores menos o Google, carrega um script worker a partir de um arquivo próprio. Instale maplibre-gl ao lado @powerportalspro/react-mapsde , e diga onde seu bundler colocou o worker uma vez, antes de desenhar um mapa. Blazor não precisa de configuração.

React Blazor

Map Classe

Parâmetros

Nome
Tipo
Padrão
Descrição
Addressstring?
AddressSearchCountriesIReadOnlyList<string>?
AllowFilteringbool
False
AllowNearSearchbool
False
AllowSavedViewsbool
False
CenterMapPosition?
Clusterbool
True
ColorColumnstring?
DefaultTablesIEnumerable<string>?
DefaultViewIdGuid?
FetchXmlstring?
FiltersIReadOnlyList<QueryFilter>?
FitItemIdsIReadOnlyList<string>?
Heightstring
400px
ItemsIReadOnlyList<MapItem>?
LatitudeColumnstring
address1_latitude
LongitudeColumnstring
address1_longitude
MapStyleMapStyle
Road
MaxRowsint
1000
MultiTablebool
False
NativeOptionsIReadOnlyDictionary<string, Object>?
NearDistancedouble?
NearDistancesIReadOnlyList<double>?
NearDistanceUnitDistanceUnit
Miles
PopupTemplateRenderFragment<MapItem>?
PrintEntriesIReadOnlyList<MapPrintEntry>?
PrintEntriesProviderFunc<IReadOnlyList<MapPrintEntry>>?
PrintTitlestring?
ProviderMapProvider?
RecordColorstring?
RecordColorSelectorFunc<TableRecord, string>?
RecordUrlstring?
RecordUrlSelectorFunc<TableRecord, string>?
RegardingTableRecordReference?
SavedViewsKeystring?
ShowAddressSearchbool
False
ShowLegendbool
True
ShowPopupsbool
True
ShowPrintButtonbool
False
ShowRecordLinksbool
True
SignInUrlstring
Account/Login
TablesIEnumerable<string>?
Titlestring?
TitleColumnstring?
UsePortalThemebool
True
ViewIdGuid?
ViewIdsIEnumerable<Guid>?
Widthstring
100%
Zoomdouble?
Nome: Address
Tipo: string?
Nome: AddressSearchCountries
Tipo: IReadOnlyList<string>?
Nome: AllowFiltering
Tipo: bool
Padrão: False
Nome: AllowNearSearch
Tipo: bool
Padrão: False
Nome: AllowSavedViews
Tipo: bool
Padrão: False
Nome: Center
Tipo: MapPosition?
Nome: Cluster
Tipo: bool
Padrão: True
Nome: ColorColumn
Tipo: string?
Nome: DefaultTables
Tipo: IEnumerable<string>?
Nome: DefaultViewId
Tipo: Guid?
Nome: FetchXml
Tipo: string?
Nome: Filters
Tipo: IReadOnlyList<QueryFilter>?
Nome: FitItemIds
Tipo: IReadOnlyList<string>?
Nome: Height
Tipo: string
Padrão: 400px
Nome: Items
Tipo: IReadOnlyList<MapItem>?
Nome: LatitudeColumn
Tipo: string
Padrão: address1_latitude
Nome: LongitudeColumn
Tipo: string
Padrão: address1_longitude
Nome: MapStyle
Tipo: MapStyle
Padrão: Road
Nome: MaxRows
Tipo: int
Padrão: 1000
Nome: MultiTable
Tipo: bool
Padrão: False
Nome: NativeOptions
Tipo: IReadOnlyDictionary<string, Object>?
Nome: NearDistance
Tipo: double?
Nome: NearDistances
Tipo: IReadOnlyList<double>?
Nome: NearDistanceUnit
Tipo: DistanceUnit
Padrão: Miles
Nome: PopupTemplate
Tipo: RenderFragment<MapItem>?
Nome: PrintEntries
Tipo: IReadOnlyList<MapPrintEntry>?
Nome: PrintEntriesProvider
Tipo: Func<IReadOnlyList<MapPrintEntry>>?
Nome: PrintTitle
Tipo: string?
Nome: Provider
Tipo: MapProvider?
Nome: RecordColor
Tipo: string?
Nome: RecordColorSelector
Tipo: Func<TableRecord, string>?
Nome: RecordUrl
Tipo: string?
Nome: RecordUrlSelector
Tipo: Func<TableRecord, string>?
Nome: Regarding
Tipo: TableRecordReference?
Nome: SavedViewsKey
Tipo: string?
Nome: ShowAddressSearch
Tipo: bool
Padrão: False
Nome: ShowLegend
Tipo: bool
Padrão: True
Nome: ShowPopups
Tipo: bool
Padrão: True
Nome: ShowPrintButton
Tipo: bool
Padrão: False
Nome: ShowRecordLinks
Tipo: bool
Padrão: True
Nome: SignInUrl
Tipo: string
Padrão: Account/Login
Nome: Tables
Tipo: IEnumerable<string>?
Nome: Title
Tipo: string?
Nome: TitleColumn
Tipo: string?
Nome: UsePortalTheme
Tipo: bool
Padrão: True
Nome: ViewId
Tipo: Guid?
Nome: ViewIds
Tipo: IEnumerable<Guid>?
Nome: Width
Tipo: string
Padrão: 100%
Nome: Zoom
Tipo: double?

Eventos

Nome
Tipo
Descrição
OnAddressSelectedEventCallback<MapPlace>
OnErrorEventCallback<string>
OnItemClickEventCallback<MapItemClickEventArgs>
OnMapClickEventCallback<MapClickEventArgs>
OnPrintChangedEventCallback<MapPrintState>
OnViewChangedEventCallback<MapView>
Nome: OnAddressSelected
Tipo: EventCallback<MapPlace>
Nome: OnError
Tipo: EventCallback<string>
Nome: OnItemClick
Tipo: EventCallback<MapItemClickEventArgs>
Nome: OnMapClick
Tipo: EventCallback<MapClickEventArgs>
Nome: OnPrintChanged
Tipo: EventCallback<MapPrintState>
Nome: OnViewChanged
Tipo: EventCallback<MapView>

Métodos

Nome
Parâmetros
Tipo
Descrição
ClearAddressAsyncTask
ClosePopupAsyncTask
FitToItemsAsyncIEnumerable<string> ids
Task
GetMapSettingsAsyncstring provider
Task<MapSettingsResponse>
GetNativeMapAsyncTask<IJSObjectReference>
GetViewAsyncTask<MapView>
GoToAddressAsyncstring text
Task<MapPlace>
NotifyAddressSelectedAsyncMapPlace place
Task
NotifyAddressStatusAsyncstring status
Task
NotifyClusterClickAsyncstring[] ids
MapPosition position
Task
NotifyErrorAsyncstring kind
string message
Task
NotifyItemClickAsyncstring id
MapPosition position
Task
NotifyMapClickAsyncMapPosition position
Task
NotifyViewChangedAsyncMapView view
Task
OpenPopupAsyncstring id
Task
PrintAsyncTask
SaveImageAsyncstring fileName
Task<bool>
SetCameraAsyncMapCamera camera
bool animate
Task
Nome: ClearAddressAsync
Tipo: Task
Nome: ClosePopupAsync
Tipo: Task
Nome: FitToItemsAsync
Parâmetros: IEnumerable<string> ids
Tipo: Task
Nome: GetMapSettingsAsync
Parâmetros: string provider
Tipo: Task<MapSettingsResponse>
Nome: GetNativeMapAsync
Tipo: Task<IJSObjectReference>
Nome: GetViewAsync
Tipo: Task<MapView>
Nome: GoToAddressAsync
Parâmetros: string text
Tipo: Task<MapPlace>
Nome: NotifyAddressSelectedAsync
Parâmetros: MapPlace place
Tipo: Task
Nome: NotifyAddressStatusAsync
Parâmetros: string status
Tipo: Task
Nome: NotifyClusterClickAsync
Parâmetros: string[] ids
MapPosition position
Tipo: Task
Nome: NotifyErrorAsync
Parâmetros: string kind
string message
Tipo: Task
Nome: NotifyItemClickAsync
Parâmetros: string id
MapPosition position
Tipo: Task
Nome: NotifyMapClickAsync
Parâmetros: MapPosition position
Tipo: Task
Nome: NotifyViewChangedAsync
Parâmetros: MapView view
Tipo: Task
Nome: OpenPopupAsync
Parâmetros: string id
Tipo: Task
Nome: PrintAsync
Tipo: Task
Nome: SaveImageAsync
Parâmetros: string fileName
Tipo: Task<bool>
Nome: SetCameraAsync
Parâmetros: MapCamera camera
bool animate
Tipo: Task