Geocodificação
Um mapa coloca uma linha em sua latitude e longitude, que a maioria das linhas não possui. Registre o endereço de uma tabela com AddGeocoding, e as coordenadas das linhas são preenchidas a partir de seus endereços à medida que são criadas e atualizadas, pelo serviço de geocodificação, os nomes de configuração do portal.
Armazenando resultados geocodificados
Salvar coordenadas nos seus registros é armazenar os resultados de um geocodificador, e os termos dos provedores diferem nisso: alguns limitam quanto tempo os resultados podem ser mantidos, outros cobram pelos resultados armazenados, e outros permitem que sejam exibidos apenas em seus próprios mapas. O Power Portals Pro oferece apenas essa capacidade. Garantir que seu provedor, seu plano e seu uso dos resultados cumpram seus termos é sua responsabilidade.
Registro de um endereço
Contas e contatos têm um atalho cada um, para seu primeiro endereço: suas linhas, cidade, condado, estado ou província, código postal e país, para address1_latitude e address1_longitude.
// Program.cs (the server)
builder.Services.AddAccountGeocoding();
builder.Services.AddContactGeocoding();
Qualquer outra tabela nomeia suas colunas: as linhas da rua, a cidade, o condado, o estado ou província, o código postal e o país, cada uma uma coluna de texto, escolha ou consulta (o geocodificador lê o nome de uma escolha e o nome da consulta), e as colunas numéricas em que suas coordenadas vão aparecer.
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"));
O nome de um registro é verificado no Dataverse quando o portal começa: uma coluna que a tabela não tem, ou do tipo errado, impede que ele comece com uma mensagem nomeando a tabela e a coluna. Registrado duas vezes, o segundo registro de uma tabela substitui o primeiro.
O que uma defesa faz
- Uma criação com um endereço é geocodificada. Uma atualização é geocodificada apenas quando altera o endereço: um save que envia o endereço novamente como estava, ou que altera apenas outras colunas, não pergunta a ninguém.
- Uma atualização carrega apenas as colunas que altera, então o endereço geocodificado são as alterações sobrepostas ao endereço armazenado.
- As coordenadas são enviadas na mesma salvação, independentemente de o usuário definir essas colunas ou não: a geocodificação roda como o usuário do app, depois que as verificações do usuário foram passadas (veja Interceptores). O endereço armazenado também é lido como o app, para o geocodificador, não para o usuário. Uma sessão que o próprio Dataverse garante (
DataverseSecurity) é a exceção: ela é enviada para o Dataverse como seu usuário, então a segurança da própria coluna do Dataverse ainda se aplica às coordenadas. - Um save que define as coordenadas por conta própria, como um pino movido manualmente, mantém o seu.
- Um save nunca é recusado para suas coordenadas. Um endereço encontrado em lugar nenhum, ou um que o serviço não pode ser consultado em até
Geocoding:Timeoutdez segundos por padrão), é salvo sem coordenadas, assim como um esvaziado, em vez de manter o endereço antes dele. Um aviso é registrado, sem o endereço.
Linhas salvas antes do registro da geocodificação mantêm as coordenadas que têm até que o endereço mude.
Provedores
O serviço é definido na PowerPortalsPro:Maps:Geocoding seção, exceto pelo provedor que desenha os mapas: Geocoding:Provider nomeia, e o provedor do mapa é usado quando não o faz.
{
"PowerPortalsPro": {
"Maps": {
"Provider": "Google",
"Geocoding": {
"Provider": "AzureMaps",
"Timeout": "00:00:10"
},
"AzureMaps": { "ClientId": "..." }
}
}
}
- Azure Maps (
AzureMaps): perguntado como a identidade do portal, assim como seus mapas, então não é necessário nenhum sinal. DefinaAzureMaps:ClientId; o papel Azure Maps Data Reader da identidade permite que ela pesquise. - Esri (
Esri): pediu para armazenar seus resultados, o que o ArcGIS cobra. Sua chave, emGeocoding:ApiKey, precisa do privilégio de geocodificação e deve funcionar a partir do servidor, não apenas dos endereços do seu portal como a chave de um mapa. - Google (
Google): um botão de entradaGeocoding:ApiKeycom a API de Geocodificação que funciona a partir do servidor; a chave de um mapa, restrita aos endereços do seu portal, é recusada. - OpenStreetMap (
OpenStreetMap): qualquer servidor Nominatim, o próprio do OpenStreetMap, a menos queGeocoding:Urlnomeie outro, e o padrão quando nada nomeia um provedor. O servidor próprio do OpenStreetMap é solicitado no máximo uma vez por segundo, então os salvos esperam sua vez e um que espera mais do queGeocoding:Timeouto salvo sem coordenadas. Também quer saber quem está perguntando: definaGeocoding:UserAgento nome do seu portal e uma forma de contatá-lo. Sua política de uso desencoraja a geocodificação regular por parte de um aplicativo, então use um servidor próprio em produção.
Uma vez que um endereço é registrado, as configurações são verificadas quando o portal inicia: um provedor sem o que precisa impede que ele comece com uma mensagem nomeando a configuração.
Um geocodificador próprio
Registre-se e IGeocoder para solicitar outro serviço. Ele recebe o endereço conforme sua linha o guarda, com uma forma de linha de ToString(), e retorna as coordenadas, ou nenhuma quando nada coincide; lançar o jogo salva a linha sem coordenadas.
public class MyGeocoder(IHttpClientFactory httpClientFactory) : IGeocoder
{
public async Task<GeocodedPosition?> GeocodeAsync(GeocodingAddress address, CancellationToken cancellationToken)
{
// Peça ao seu serviço as coordenadas do endereço
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>();
Coordenadas sem geocodificação
Uma tabela cujas linhas obtêm suas coordenadas de outra forma registra apenas as colunas em que estão, com AddMapCoordinates, assim como AddGeocoding para a sua própria. Um mapa de várias tabelas então coloca as linhas da tabela com ForMaps() sozinha.
builder.Services.AddMapCoordinates("ppp_site", latitude: "ppp_latitude", longitude: "ppp_longitude");
// Colocado nas coordenadas registradas para ele
builder.Services.AddMultiTableSource("ppp_site", t => t.ForMaps());