Geocodificación
Un mapa coloca una fila en su latitud y longitud, que la mayoría de las filas no tienen. Registra la dirección de una tabla con AddGeocoding, y las coordenadas de sus filas se completan a partir de sus direcciones a medida que se crean y actualizan, por el servicio de geocodificación, los nombres de configuración del portal.
Almacenamiento de resultados geocodificados
Guardar coordenadas en tus registros es almacenar los resultados de un geocodificador, y los términos de los proveedores difieren en eso: algunos limitan cuánto tiempo pueden mantenerse los resultados, otros cobran por los resultados almacenados y otros permiten que solo se muestren en sus propios mapas. Power Portals Pro proporciona solo esta capacidad. Asegurarte de que tu proveedor, tu plan y tu uso de los resultados cumplen con sus términos es tu responsabilidad.
Registro de una dirección
Las cuentas y contactos tienen un atajo cada uno, para su primera dirección: sus líneas, ciudad, condado, estado o provincia, código postal y país, hacia address1_latitude y address1_longitude.
// Program.cs (the server)
builder.Services.AddAccountGeocoding();
builder.Services.AddContactGeocoding();
Cualquier otra tabla nombra sus columnas: las líneas de la calle, la ciudad, el condado, el estado o provincia, el código postal y el país, cada uno una columna de texto, elección o consulta (el geocodificador lee la etiqueta de una opción y el nombre de la consulta), y las columnas numéricas en las que aparecen sus coordenadas.
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"));
Lo que un registro nombra se comprueba en Dataverse al inicio del portal: una columna que la tabla no tiene, o de tipo incorrecto, impide que comience con un mensaje que nombra la tabla y la columna. Registrado dos veces, el segundo registro de una tabla reemplaza al primero.
Lo que hace una parada
- Una creación con una dirección está geocodificada. Una actualización solo se geocodifica cuando cambia la dirección: una partida guardada que envía la dirección tal y como estaba, o que solo cambia otras columnas, no pregunta a nadie.
- Una actualización solo lleva las columnas que cambia, por lo que la dirección geocodificada son esos cambios que se superponen sobre la dirección almacenada.
- Las coordenadas se envían en la misma partida guardada, independientemente de si el usuario puede establecer esas columnas: la geocodificación se ejecuta como el usuario de la app, una vez superadas las comprobaciones del usuario ( véase Interceptors). La dirección almacenada también se lee como la app, para el geocodificador, no para el usuario. Una sesión que Dataverse asegura (
DataverseSecurity) es la excepción: se envía a Dataverse como su usuario, por lo que la seguridad de columna propia de Dataverse sigue aplicándose a las coordenadas. - Una partida guardada que establece las coordenadas por sí misma, como un pin movido a mano, mantiene la suya propia.
- Nunca se niega a guardar sus coordenadas. Una dirección que no se encuentra en ningún sitio, o una sobre la que no se puede consultar el servicio en un
Geocoding:Timeoutplazo de diez segundos por defecto, se guarda sin coordenadas, al igual que una vacía, en lugar de mantener la ubicación de la dirección delante. Se registra una advertencia, sin la dirección.
Las filas guardadas antes de que se registrara la geocodificación mantienen las coordenadas que tienen hasta que cambie su dirección.
Proveedores
El servicio se establece en la PowerPortalsPro:Maps:Geocoding sección, aparte del proveedor que dibuja los mapas: Geocoding:Provider lo nombra y se usa el proveedor del mapa cuando no lo hace.
{
"PowerPortalsPro": {
"Maps": {
"Provider": "Google",
"Geocoding": {
"Provider": "AzureMaps",
"Timeout": "00:00:10"
},
"AzureMaps": { "ClientId": "..." }
}
}
}
- Azure Maps (
AzureMaps): solicitado como la identidad propia del portal, como son sus mapas, por lo que no se necesita clave. EstablecerAzureMaps:ClientId; el rol de Azure Maps Data Reader de la identidad le permite buscar. - Esri (
Esri): pidió que se almacenen sus resultados, por lo que ArcGIS cobra. Su clave, enGeocoding:ApiKey, necesita el privilegio de geocodificación y debe funcionar desde el servidor, no solo desde las direcciones de tu portal como lo hace la clave de un mapa. - Google (
Google): una claveGeocoding:ApiKeycon la API de Geocodificación que funciona desde el servidor; la clave de un mapa, restringida a las direcciones de tu portal, es rechazada. - OpenStreetMap (
OpenStreetMap): cualquier servidor Nominatim, el propio de OpenStreetMap a menos queGeocoding:Urlnombre otro, y el predeterminado cuando nada nombra a un proveedor. El servidor propio de OpenStreetMap se pide como máximo una vez por segundo, así que los guardados esperan a la vez su turno y uno que espera más tiempo delGeocoding:Timeoutque se guarda sin coordenadas. También quiere saber quién pregunta: configuraGeocoding:UserAgentel nombre de tu portal y una forma de contactarte. Su política de uso desaconseja la geocodificación regular por parte de una aplicación, así que usa un servidor propio en producción.
Una vez registrada una dirección, se comprueban los ajustes al iniciar el portal: un proveedor sin lo que necesita impide que empiece con un mensaje que nombra la configuración.
Un geocodificador propio
Registrar y IGeocoder para pedir otro servicio. Se le da la dirección como la contiene su fila, con una forma de una línea de ToString(), y devuelve las coordenadas, o ninguna cuando nada coincide; lanzar guarda la fila sin coordenadas.
public class MyGeocoder(IHttpClientFactory httpClientFactory) : IGeocoder
{
public async Task<GeocodedPosition?> GeocodeAsync(GeocodingAddress address, CancellationToken cancellationToken)
{
// Pide a tu servicio las coordenadas de la dirección
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 sin geocodificación
Una tabla cuyas filas obtienen sus coordenadas de otra manera registra solo las columnas en las que están, con AddMapCoordinates, al igual que AddGeocoding la suya propia. Un mapa de varias tablas coloca entonces las filas de la tabla con ForMaps() solo.
builder.Services.AddMapCoordinates("ppp_site", latitude: "ppp_latitude", longitude: "ppp_longitude");
// Colocado en las coordenadas registradas para él
builder.Services.AddMultiTableSource("ppp_site", t => t.ForMaps());