Geokodierung
Eine Karte platziert eine Zeile auf ihrem Breiten- und Längengrad, was die meisten Zeilen nicht haben. Registrieren Sie die Adresse einer Tabelle mit AddGeocoding, und die Koordinaten ihrer Zeilen werden von den Konfigurationsnamen des Portals aus ihren Adressen ausgefüllt, sobald sie erstellt und aktualisiert werden.
Speicherung geokodierter Ergebnisse
Das Speichern von Koordinaten in Ihren Datensätzen bedeutet, die Ergebnisse eines Geocoders zu speichern, und die Bedingungen der Anbieter unterscheiden sich darin: Manche begrenzen, wie lange Ergebnisse gespeichert werden dürfen, andere verlangen Gebühren für gespeicherte Ergebnisse, und manche erlauben es, sie nur auf ihren eigenen Karten anzuzeigen. Power Portals Pro bietet nur diese Funktion. Sicherzustellen, dass Ihr Anbieter, Ihr Tarif und Ihre Nutzung der Ergebnisse den Bedingungen entsprechen, liegt in Ihrer Verantwortung.
Registrierung einer Adresse
Konten und Kontakte haben jeweils eine Abkürzung zu ihrer ersten Adresse: ihre Linien, Stadt, Landkreis, Bundesstaat oder Provinz, Postleitzahl und Land, nach address1_latitude und address1_longitude.
// Program.cs (the server)
builder.Services.AddAccountGeocoding();
builder.Services.AddContactGeocoding();
Jede andere Tabelle nennt ihre Spalten: die Straßenlinien, die Stadt, den Landkreis, den Bundesstaat oder die Provinz, die Postleitzahl und das Land, jeweils eine Text-, Wahl- oder Nachschlagspalte (der Geocoder liest das Label einer Wahl und den Namen einer Nachschlage), und die Zahlenspalten, in die ihre Koordinaten eingefügt werden.
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"));
Welche Namen eine Registrierung hat, wird beim Start des Portals gegen Dataverse überprüft: Eine Spalte, die die Tabelle nicht hat oder die falsche Art hat, stoppt sie mit einer Nachricht, die die Tabelle und die Spalte benennen. Zweimal registriert, ersetzt die zweite Registrierung der Tabelle die erste.
Was ein Rettungswurf bewirkt
- Ein Erstellen mit einer Adresse wird geokodiert. Ein Update wird nur geokodiert, wenn es die Adresse ändert: Ein Speicher, der die Adresse wieder wie zuvor sendet oder nur andere Spalten ändert, fragt niemanden.
- Ein Update enthält nur die Spalten, die es ändert, sodass die geokodierte Adresse jene Änderungen sind, die über die gespeicherte Adresse gelegt werden.
- Die Koordinaten werden in derselben Funktion veröffentlicht, außer ob der Benutzer diese Spalten setzen darf oder nicht: Geocoding läuft als App-Nutzer, sobald die Kontrollen bestanden sind (siehe Interceptors). Die gespeicherte Adresse wird auch als App für den Geocoder gelesen, nicht für den Benutzer. Eine Sitzung, die Dataverse selbst sichert (
DataverseSecurity), ist die Ausnahme: Sie wird als Benutzer an Dataverse gesendet, sodass die eigene Spaltensicherheit von Dataverse weiterhin für die Koordinaten gilt. - Ein Speicher, der die Koordinaten selbst einlegt, wie ein von Hand bewegter Pin, behält seinen eigenen.
- Ein Speicherstand wird für seine Koordinaten niemals abgelehnt. Eine Adresse, die nirgendwo gefunden wird oder die der Dienst standardmäßig nicht innerhalb
Geocoding:Timeoutvon zehn Sekunden anfragen kann, wird ohne Koordinaten gespeichert, ebenso wie eine leere Adresse, anstatt den Ort der vorherigen Adresse zu behalten. Eine Warnung wird protokolliert, ohne die Adresse.
Zeilen, die vor der Geokodierung gespeichert wurden, behalten die vorhandenen Koordinaten, bis sich ihre Adresse ändert.
Anbieter
Der Dienst wird in diesem PowerPortalsPro:Maps:Geocoding Abschnitt festgelegt, getrennt vom Anbieter, der die Karten zeichnet: Geocoding:Provider er nennt ihn, und der Anbieter der Karte wird verwendet, wenn dies nicht der Fall ist.
{
"PowerPortalsPro": {
"Maps": {
"Provider": "Google",
"Geocoding": {
"Provider": "AzureMaps",
"Timeout": "00:00:10"
},
"AzureMaps": { "ClientId": "..." }
}
}
}
- Azure Maps (
AzureMaps): wird als eigene Identität des Portals abgefordert, wie es seine Karten sind, sodass kein Schlüssel benötigt wird. SetzenAzureMaps:ClientId; die Azure Maps Data Reader-Rolle der Identität erlaubt die Suche. - Esri (
Esri): wird gebeten, seine Ergebnisse speichern zu lassen, wofür ArcGIS Gebühren erhebt. Sein Schlüssel, inGeocoding:ApiKey, benötigt das Geocodierungsprivileg und muss vom Server aus arbeiten, nicht nur von den Adressen deines Portals, wie es der Schlüssel einer Karte tut. - Google (
Google): ein SchlüsselGeocoding:ApiKeyzur Geocoding-API, der vom Server aus funktioniert; ein Kartenschlüssel, der auf die Adressen Ihres Portals beschränkt ist, wird abgelehnt. - OpenStreetMap (
OpenStreetMap): jeder Nominatim-Server, der von OpenStreetMap, sofernGeocoding:Urler nicht einen anderen nennt, und der Standard, wenn kein Anbieter genannt wird. OpenStreetMaps eigener Server wird höchstens einmal pro Sekunde gefragt, sodass Speicher sofort warten, und einer, der länger wartet, alsGeocoding:Timeoutohne Koordinaten gespeichert wird. Er möchte auch wissen, wer fragt: auf den Namen deines Portals undGeocoding:UserAgenteine Möglichkeit, dich zu kontaktieren. Seine Nutzungsrichtlinie entmutigt regelmäßige Geokodierung durch eine Anwendung, also nutze einen eigenen Server in der Produktion.
Sobald eine Adresse registriert ist, werden die Einstellungen überprüft, sobald das Portal startet: Ein Anbieter ohne Bedarf stoppt es, indem es mit einer Nachricht beginnt, die die Einstellung benennt.
Ein eigenes Geocoder
Registrieren Sie an IGeocoder , um einen anderen Dienst anzufragen. Es erhält die Adresse, wie seine Zeile sie hält, mit einer Einzeilenform von ToString(), und gibt die Koordinaten zurück, oder keine, wenn nichts übereinstimmt; Werfen speichert die Reihe ohne Koordinaten.
public class MyGeocoder(IHttpClientFactory httpClientFactory) : IGeocoder
{
public async Task<GeocodedPosition?> GeocodeAsync(GeocodingAddress address, CancellationToken cancellationToken)
{
// Fragen Sie Ihren Dienst nach den Koordinaten der 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>();
Koordinaten ohne Geokodierung
Eine Tabelle, deren Reihen ihre Koordinaten auf andere Weise erhalten, registriert nur die Spalten, in denen sie sich befinden, mit AddMapCoordinates, ebenso wie AddGeocoding für ihre eigene. Eine Abbildung mehrerer Tabellen ordnet dann die Reihen der Tabelle mit ForMaps() nur ein.
builder.Services.AddMapCoordinates("ppp_site", latitude: "ppp_latitude", longitude: "ppp_longitude");
// An den dafür registrierten Koordinaten platziert
builder.Services.AddMultiTableSource("ppp_site", t => t.ForMaps());