Géocodage
Une carte place une ligne à sa latitude et longitude, ce que la plupart des lignes n’ont pas. Enregistrez l’adresse d’une table avec AddGeocoding, et les coordonnées de ses lignes sont remplies à partir de leurs adresses au fur et à mesure qu’elles sont créées et mises à jour, par le service de géocodage les noms de configuration du portail.
Stockage des résultats géocodés
Sauvegarder les coordonnées sur vos enregistrements revient à stocker les résultats d’un géocodeur, et les conditions des fournisseurs diffèrent à ce sujet : certains limitent la durée de conservation des résultats, d’autres facturent les résultats stockés, et d’autres encore ne permettent qu’ils soient affichés uniquement sur leurs propres cartes. Power Portals Pro ne fournit que cette fonctionnalité. Veiller à ce que votre fournisseur, votre forfait et votre utilisation des résultats respectent ses conditions est votre responsabilité.
Enregistrement d’une adresse
Les comptes et contacts ont chacun un raccourci pour leur première adresse : ses lignes, ville, comté, État ou province, code postal et pays, vers address1_latitude et address1_longitude.
// Program.cs (the server)
builder.Services.AddAccountGeocoding();
builder.Services.AddContactGeocoding();
Tout autre tableau nomme ses colonnes : les lignes de la rue, la ville, le comté, l’État ou la province, le code postal et le pays, chacun une colonne de texte, de choix ou de recherche (le géocodeur lit l’étiquette d’un choix et le nom d’une requête), ainsi que les colonnes de chiffres dans lesquelles se trouvent ses coordonnées.
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"));
Ce qu’un enregistrement nomme est vérifié contre Dataverse au début du portail : une colonne que la table n’a pas, ou du mauvais type, l’empêche de commencer par un message nommant la table et la colonne. Enregistrée deux fois, la deuxième inscription d’une table remplace la première.
Ce qu’un arrêt fait
- Une création avec une adresse est géocodée. Une mise à jour n’est géocodée que lorsqu’elle change l’adresse : une sauvegarde qui renvoie l’adresse telle qu’elle était, ou ne modifie que d’autres colonnes, ne demande à personne.
- Une mise à jour ne porte que les colonnes qu’elle modifie, donc l’adresse géocodée correspond à ces changements posés sur l’adresse stockée.
- Les coordonnées s’affichent dans la même sauvegarde, que l’utilisateur puisse ou non définir ces colonnes : le géocodage s’exécute en tant qu’utilisateur de l’application, une fois les vérifications de l’utilisateur passées ( voir Intercepteurs). L’adresse stockée est également lue comme l’application, pour le géocodeur, pas pour l’utilisateur. Une session que Dataverse sécurise lui-même (
DataverseSecurity) fait exception : elle est envoyée à Dataverse en tant qu’utilisateur, donc la sécurité de la colonne propre à Dataverse s’applique toujours aux coordonnées. - Une sauvegarde qui définit elle-même les coordonnées, comme une épingle déplacée à la main, conserve la sienne.
- Une sauvegarde n’est jamais refusée pour ses coordonnées. Une adresse trouvée nulle part, ou une adresse dont le service ne peut pas être sollicité dans
Geocoding:Timeoutles dix secondes par défaut, est sauvegardée sans coordonnées, tout comme une coordonnée vide, au lieu de conserver la place de l’adresse avant. Un avertissement est enregistré, sans l’adresse.
Les lignes sauvegardées avant l’enregistrement du géocodage conservent les coordonnées qu’elles ont jusqu’à ce que leur adresse change.
Fournisseurs
Le service est défini dans la PowerPortalsPro:Maps:Geocoding section, à l’exception du fournisseur qui dessine les cartes : Geocoding:Provider il les nomme, et le fournisseur de la carte est utilisé lorsqu’il ne le fait pas.
{
"PowerPortalsPro": {
"Maps": {
"Provider": "Google",
"Geocoding": {
"Provider": "AzureMaps",
"Timeout": "00:00:10"
},
"AzureMaps": { "ClientId": "..." }
}
}
}
- Azure Maps (
AzureMaps) : demandé comme l’identité propre du portail, comme ses cartes, donc aucune clé n’est nécessaire. DéfinirAzureMaps:ClientId; le rôle Azure Maps Data Reader de l’identité lui permet de rechercher. - Esri (
Esri) : a demandé de stocker ses résultats, ce qu’ArcGIS facture. Sa clé, dansGeocoding:ApiKey, nécessite le privilège de géocodage et doit fonctionner depuis le serveur, pas seulement depuis les adresses de votre portail comme le fait la clé d’une carte. - Google (
Google) : une clé d’entréeGeocoding:ApiKeyavec l’API de géocodage qui fonctionne depuis le serveur ; une clé de carte, limitée aux adresses de votre portail, est refusée. - OpenStreetMap (
OpenStreetMap) : n’importe quel serveur Nominatim, celui d’OpenStreetMap sauf siGeocoding:Urlun autre n’en nomme, et par défaut quand rien ne nomme un fournisseur. Le serveur d’OpenStreetMap est sollicité au maximum une fois par seconde, donc les sauvegardes attendent immédiatement leur tour, et celles qui attendent plus longtemps queGeocoding:Timeoutcelles enregistrées sans coordonnées. Il veut aussi savoir qui demande : définirGeocoding:UserAgentle nom de votre portail et un moyen de vous contacter. Sa politique d’utilisation décourage le géocodage régulier par une application, donc utilisez votre propre serveur en production.
Une fois une adresse enregistrée, les paramètres sont vérifiés au démarrage du portail : un fournisseur sans ce dont il a besoin l’empêche de commencer par un message nommant le paramètre.
Un géocodeur à toi
Enregistrer et IGeocoder demander un autre service. Il reçoit l’adresse telle que sa ligne la contient, avec une forme à une ligne de ToString(), et retourne les coordonnées, ou aucune lorsque rien ne correspond ; lancer sauvegarde la ligne sans coordonnées.
public class MyGeocoder(IHttpClientFactory httpClientFactory) : IGeocoder
{
public async Task<GeocodedPosition?> GeocodeAsync(GeocodingAddress address, CancellationToken cancellationToken)
{
// Demandez à votre service les coordonnées de l’adresse
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>();
Coordonnées sans géocodage
Une table dont les lignes obtiennent leurs coordonnées d’une autre manière ne registre que les colonnes dans lesquelles elles se trouvent, avec AddMapCoordinates, tout comme AddGeocoding pour la sienne. Une carte de plusieurs tables place alors les lignes de la table avec ForMaps() seules.
builder.Services.AddMapCoordinates("ppp_site", latitude: "ppp_latitude", longitude: "ppp_longitude");
// Placé aux coordonnées enregistrées pour elle
builder.Services.AddMultiTableSource("ppp_site", t => t.ForMaps());