IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Extensions PostgreSQL Discussion :

[postgis] Différence de résultats entre calculs méthode Haversine et fonction ST_distance [9.5]


Sujet :

Extensions PostgreSQL

  1. #1
    Membre à l'essai Avatar de Anne-LaureLbl
    Femme Profil pro
    Porteuse de projet
    Inscrit en
    Février 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Porteuse de projet
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Février 2017
    Messages : 13
    Points : 13
    Points
    13
    Par défaut [postgis] Différence de résultats entre calculs méthode Haversine et fonction ST_distance
    Bonjour,
    Ceci est mon premier message et j'espère que quelqu'un voudra bien me donner un début de réponse ? J'obtiens de grosses différences de résultats entre la méthode de calcul ST_Distance dans PostGis et la méthode classique Haversine. J'ai sûrement dû faire une erreur, mais où ?

    Soit une table t_zon dans pgsql 9.6 (et pas 9.5 mais le préfixe 9.6 n'était pas disponible) avec extension postGIS avec des colonnes zon_id INT, zon_label TEXT, zon_latitude INT, zon_longitude INT, zon_geo geography(point).
    On insère deux valeurs (49, 'France', 48.86, 2.35, 'point(48.867 2.35)') et (262, 'Mauritius', -20.2833, 57.55, 'point(-20.2833 57.55)').
    Jusque ici tout va bien. Le problème, c'est lors de la recherche de la distance réelle, voici ce que j'obtiens :

    1) Haversin
    -- > résultat 9 413,520 Km

    2) fonction ST_Distance
    -- > résultat 8 554,608 Km, soit 900Km de différence !!

    Voici le code effectué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    CREATE EXTENSION postGIS;
    CREATE EXTENSION citext;
     
    CREATE SCHEMA S_ZON; 	-- > schema geographic zones				
     
     CREATE DOMAIN S_ZON.D_LATITUDE DOUBLE PRECISION					-- latitude coordinates
    	CHECK (VALUE BETWEEN -90 AND 90);				
     CREATE DOMAIN S_ZON.D_LONGITUDE DOUBLE PRECISION					-- longitude coordinates
    	CHECK (VALUE BETWEEN -180 AND 180);				
     CREATE DOMAIN S_ZON.D_ZOOM SMALLINT					-- zoom level display
    	CHECK (VALUE BETWEEN 0 AND 23);						
     
    CREATE SCHEMA S_REF;	-- > schema reference		
     
    CREATE DOMAIN S_REF.D_NAME as CITEXT					-- max 64 insensitive alphanumeric
    	CHECK (length(value) <= 64);		
     
    CREATE TABLE S_ZON.T_ZON			-- > geographical zones in schema geographic destinations		
    (   ZON_ID				INT 	PRIMARY KEY,							
    ZON_label			S_REF.D_NAME		not null,					-- destination name
     ZON_latitude		S_ZON.D_LATITUDE	not null,			-- latitude coordinates
     ZON_longitude		S_ZON.D_LONGITUDE	not null,		-- longitude coordinates
    	ZON_geo				geography(point)								-- postGIS type
     );
     
    insert into S_ZON.T_ZON values (49, 'France', 48.86, 2.35, 'point(48.867 2.35)’), (262, 'Mauritius', -20.2833, 57.55, 'point(-20.2833 57.55));
     
    /*POURQUOI LES RESULTATS SONT DIFFERENTS ??*/
    -- 1) results 9 413,520 Km
    SELECT zon_id, typ_id, zon_label, zon_latitude, zon_longitude,
         111.045* DEGREES(ACOS(COS(RADIANS(latpoint))
                    * COS(RADIANS(z.zon_latitude))
                    * COS(RADIANS(longpoint) - RADIANS(z.zon_longitude))
                    + SIN(RADIANS(latpoint))
                    * SIN(RADIANS(z.zon_latitude)))) AS distance_in_km
    FROM s_zon.t_zon AS z
    JOIN (
        SELECT  48.86  AS latpoint,  2.35 AS longpoint
      ) AS p ON 1=1
    WHERE Z.zon_id = 262 ;
     
     
    -- 2) results 8 554,608 Km
    SELECT (ST_Distance(toZ.zon_geo,fromZ.zon_geo)) / 1000,
      ToZ.zon_label::text || ' - ' || fromZ.zon_label::text as distance_label_km
    FROM s_zon.t_zon AS toZ CROSS JOIN s_zon.t_zon AS fromZ              
    WHERE  toZ.zon_ID = 262 and fromZ.zon_ID = 49;
     
    -- 3) results 8 554,608 Km
    select st_distance( st_geographyfromtext ('POINT(48.867 2.35)'),
                       st_geographyfromtext ('point(-20.2833 57.55)'))/1000;
     
    -- 4) results 8 554,608 Km
    select st_distance( geometry ('0101000020E6100000AE47E17A146E4840CDCCCCCCCCCC0240'),
                       geometry ('0101000020E6100000F1F44A59864834C06666666666C64C40'))/1000;
    Merci de votre aide !

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    C'est parfaitement normal... En effet vous avez inversé dans la saisie les coordonnées LATITUDE/LONGITUDE du mode geography :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    insert into T_ZON values (49, 'France', 48.86, 2.35, 'point(2.35 48.867)'), 
                             (262, 'Mauritius', -20.2833, 57.55, 'point(57.55 -20.2833)');
    Et tout ira mieux !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Ha au fait, joli avatar et bienvenue !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre à l'essai Avatar de Anne-LaureLbl
    Femme Profil pro
    Porteuse de projet
    Inscrit en
    Février 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Porteuse de projet
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Février 2017
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup !!

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Attention, le calcul avec la formule d'Haversine ne prend pas en compte l’aplatissement de la terre aux pôles. Il en résulte une approximation de la navigation orthodromique d'environ 0,5%.
    Le calcul de PG est donc bien plus précis car il prend en compte l'imperfection de notre globe, à condition d'avoir utiliser le bon SRID !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre à l'essai Avatar de Anne-LaureLbl
    Femme Profil pro
    Porteuse de projet
    Inscrit en
    Février 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Porteuse de projet
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Février 2017
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Merci SqlPro, tout fonctionne bien comme cela, la distance affichée est de 9 406,769 Km

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select st_distance( st_geographyfromtext ('POINT(2.35 48.867)'),
                        st_geographyfromtext ('point(57.55 -20.2833)'))/1000;

    J'ai réintégré toute ma base en indiquant (Long, Lat) au lieu de (Lat, Long) pour le ST_Geography et je pense que ça va rouler.
    Merci pour tout !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/07/2010, 10h27
  2. [AC-2000] Différence de résultat entre acpreview et Print d'un état
    Par riri2938 dans le forum IHM
    Réponses: 0
    Dernier message: 20/02/2010, 15h50
  3. [Débutant] Différences de résultats entre MATLAB 6.5 et 7.8
    Par Caps59 dans le forum MATLAB
    Réponses: 21
    Dernier message: 16/03/2009, 15h04
  4. Différence de résultat entre MATLAB et Scilab
    Par ABN84 dans le forum MATLAB
    Réponses: 1
    Dernier message: 10/05/2008, 22h53
  5. Différence de résultats entre requêtes SQL et Criteria
    Par titoudemtl dans le forum Hibernate
    Réponses: 3
    Dernier message: 07/08/2006, 09h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo