U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

Adres geocodering

0000002953     -      08-09-2021

Met Mercator kunt u een adres eenvoudig omzetten in GPS-coördinaten (lengte- en breedtegraad). Om dit te doen, moet u zich echter abonneren op een externe service. We bieden integratie met deze leveranciers :

  • Google Maps 
  • Bing Maps
  • Here

De Mercator API in MercatorTunnel.dll bevat deze methoden :

Zoom
public static double[] GeoCoderGoogle(string key, string info, out string error)
public static double[] GeoCoderBing(string info, out string error)
public static double[] GeoCoderBing(string key, string info, out string error)
public static double[] GeoCoderHere(string key, string info, out string error)

Ze sturen een tabel met twee dubbele waarden terug: de eerste is de breedtegraad, de tweede komt overeen met de lengtegraad. Als er een fout is opgetreden, retourneren deze methoden null en wordt het foutbericht in de variabele error geplaatst.

Voor Google of Bing moet de key parameter bevatten: "key=AIzaXyX7xzZXX0C0Xxx0XXXfXXI0XXxXex123sX", aangepast volgens de API-sleutel verkregen in de Google- of Bing-portal. De eerste handtekening van de GeoCoderBing-methode kan alleen worden gebruikt als de optie  is voltooid met de waarde van de sleutel (zonder "key ="). 

Voor Here moet de sleutelparameter "apiKey=XxXz1xXXyyyZZZ12abcdefgh_1234567890azertyuio" bevatten, aangepast volgens de API-parameters die zijn verkregen in de Here-portal.

De parameter "info" moet elke samenvoeging van informatie bevatten die relevant wordt geacht om een zo nauwkeurig mogelijke geolocatie mogelijk te maken: naam, straat, postcode, stad, land, ...

De onderstaande code toont een klant customizer die automatisch de GPS-coördinaten van een klanten fiche bijwerkt, voor elke nieuwe record of als één van de elementen van het adres is gewijzigd. Dit voorbeeld is geldig voor een map waarin we deze kolommen zouden hebben toegevoegd om respectievelijk de lengte- en breedtegraad op te slaan.

alter table CLI add C_LAT float not null default 0 
alter table CLI add C_LONG float not null default 0
Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
using System.Windows.Forms;

// <CompileWithRoslyn />

namespace SigCli
{
    public class Customizer : MercatorUi.ICustomizers.IFormValidateCustomizer
    {
        public bool FormValidateCustomize(Form form)
        {
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)form;
            if (string.IsNullOrWhiteSpace(sigForm.CliRecord.C_ID) // nouvelle fiche
                || !sigForm.DataSourceRow["c_adresse"].Equals(sigForm.DataSourceRow["c_adresse", DataRowVersion.Original])
                || !sigForm.DataSourceRow["c_codep"].Equals(sigForm.DataSourceRow["c_codep", DataRowVersion.Original])
                || !sigForm.DataSourceRow["c_ville"].Equals(sigForm.DataSourceRow["c_ville", DataRowVersion.Original])
                )
            {
                MercatorUi.Wait.WaitStatic.WaitWindow("Ophalen GPS positie...");
                var latLng = Api.GeoCoderHere("apiKey=XxXz1xXXyyyZZZ12abcdefgh_1234567890azertyuio", sigForm.CliRecord.C_ADRESSE + " " + sigForm.CliRecord.C_CODEP + " " + sigForm.CliRecord.C_VILLE, out string error);
                MercatorUi.Wait.WaitStatic.WaitClear();
                if (latLng == null)
                {
                    MercatorUi.Dialogs.Stop("Ophalen GPS positite : " + error);
                    return false;
                }
                else
                {
                    sigForm.CliRecord.C_LAT = latLng[0];
                    sigForm.CliRecord.C_LONG = latLng[1];
                    return true;
                }
            }
            return true;
        }
    }
}

Mercator biedt ook de mogelijkheid om deze functionaliteiten op de SQL-server te hebben. Dit kan erg handig zijn voor het initialiseren van gegevens uit een bestaande tabel. Om dit te hebben, moet u de standaard CLR-functies van Mercator activeren. Dit biedt deze SQL-functies "tabel" die alleen in .net-versie bestaan :

  • dbo.GEO_CODER_GOOGLE (@key nvarchar(max), @info nvarchar(max))
  • dbo.GEO_CODER_BING (@key nvarchar(max), @info nvarchar(max))
  • dbo.GEO_CODER_HERE (@key nvarchar(max), @info nvarchar(max))

De parameters moeten identiek zijn aan de aanwijzingen eerder op deze pagina. Deze tabelfunctie retourneert altijd één en slechts één record en 3 kolommen :

  • breedte
  • lengte
  • fout

De eerste twee zijn niet-null en de fout is null. In geval van een fout is alleen de fout niet-nul en bevat deze fout.

Om één enkel adres te verkrijgen:

select * from dbo.GEO_CODER_GOOGLE('key=AIzaXyX7xzZXX0C0Xxx0XXXfXXI0XXxXex123sX','Route d''Andenne, 37 5310 Eghezée')

Om de coördinaten te verkrijgen die overeenkomen met verschillende bestanden in de tabel CLI:

select c_id,c_adresse+c_codep+c_ville,latitude,longitude 
from CLI cross apply dbo.GEO_CODER_GOOGLE('key=AIzaXyX7xzZXX0C0Xxx0XXXfXXI0XXxXex123sX',c_adresse+c_codep+c_ville)

Om de records in de CLI-tabel bij te werken :

update CLI set c_lat=g.latitude,c_long=g.longitude
from CLI cross apply dbo.GEO_CODER_GOOGLE('key=AIzaXyX7xzZXX0C0Xxx0XXXfXXI0XXxXex123sX',c_adresse+c_codep+c_ville) g
where (g.latitude is not null) and (c_lat=0)

Belangrijke opmerkingen over deze verzoeken :

  • Het toepassen van deze vragen op een groot aantal registraties kan het quotum waarop u zich bij uw leverancier hebt ingeschreven, zeer snel opgebruiken.
  • Voor elk record vraagt de geocoderings-SQL-functie om een webservice. Het is daarom normaal dat dit "traag" is. Bovendien is het normaal dat bij een partij met een relatief grote omvang foutieve retouren worden gemaakt (lengte- en breedtegraad bij nul). De fout wordt veroorzaakt door mogelijke time-outs of verbindingslimieten. Het zal daarom nodig zijn om
    • de update te splitsen in een aantal records van bescheiden omvang.
    • dezelfde update meerdere keren uit te voeren, zodat de foutieve records eindelijk een waarde kunnen verkrijgen.
  • Gezien het bovenstaande wordt het ten zeerste afgeraden deze functies in een trigger te gebruiken.