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

IGN API Géoportail Discussion :

Calcule de distance avec la fonction distanceTo()


Sujet :

IGN API Géoportail

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Calcule de distance avec la fonction distanceTo()
    Je suis en train de vérifier qu'avec l'API je suis capable de calculer la distance séparant 2 polygones.

    Pour mon test j'ai fait une grille de 9 polygones de 10*10.



    sur clique sur chaque polygone de périphérie, je compare sa distance avec celui du centre via la méthode distanceTo().

    Et là, j'ai des résultats étonnant que je n'explique pas.

    ceux situés an haut droit, haut gauche et bas gauche sont a 14 m de distance. Jusque là ça me semble correct. Par contre, celui situé en bas droite est à 22... ?? et les 4 autre sont tous indiqué comme a 0 m...

    Si je décale de 1m les quatre polygones qui me retourne 0 (pour qu'il ne soient plus dans l'alignement de celui du centre), là ils me renvoient la bonne distance. A n'y rien comprendre.

    Est-ce un bug ou une mauvaise utilisation de ma part (ce dont je ne doute pas) ?

    Merci de votre aide.

    Voici le code testable (juste ajouter la clef):

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>API Geoportail - votre carte personnelle</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    
      <link rel="stylesheet" type="text/css" href="http://api.ign.fr/geoportail/api/js/1.3.0/theme/default/style.css" id="__OpenLayersCss__">
      <link rel="stylesheet" type="text/css" href="http://api.ign.fr/geoportail/api/js/1.3.0/theme/default/google.css" id="__GoogleOpenLayersCss__">
      <link rel="stylesheet" type="text/css" href="http://api.ign.fr/geoportail/api/js/1.3.0/theme/default/framedCloud.css" id="__FramedCloudOpenLayersCss__">
      <link rel="stylesheet" type="text/css" href="http://api.ign.fr/geoportail/api/js/1.3.0/theme/geoportal/style.css" id="__GeoportalCss__">
    
    
      <style type="text/css"><!--/*--><![CDATA[/*><!--*/
        div#viewerDiv {
            width:800px;
            height:600px;
            background-color:white;
            background-image:url(http://api.ign.fr/geoportail/api/js/1.3/theme/geoportal/img/loading.gif);
            background-position:center center;
            background-repeat:no-repeat;
        }	
        /*]]>*/--></style>
      </head>
    
    
    <body>
       
    	<script type="text/javascript">
    	<!--//--><![CDATA[//><!--
    
    
    window.onload = function () {
    
      console.log("window.onload() debut");
      Geoportal.load(
        // div's ID:
        'viewerDiv',
        // API's keys:
        'xxxx',
        {// map's center :
    	  lon: -1.50668055,
    	  lat: 48.13038738,
        },
    	//zoom
        14,
        {// options
          layers:['ORTHOIMAGERY.ORTHOPHOTOS:WMSC', 'GEOGRAPHICALGRIDSYSTEMS.MAPS:WMSC','ADMINISTRATIVEUNITS.BOUNDARIES:WMSC'],
          layersOption:{
            'ORTHOIMAGERY.ORTHOPHOTOS:WMSC':{visibility:true,opacity:0.65},
            'ADMINISTRATIVEUNITS.BOUNDARIES:WMSC':{visibility:true,opacity:1},
            'GEOGRAPHICALGRIDSYSTEMS.MAPS:WMSC':{visibility:true,opacity:0.1}
          },
          overlays:{
          },
          onView: onView
        }
      );
      console.log("window.onload() fin");
    };
    
    var viewer = null;
    var map = null;
    var empriseLayer = null;
    var wkt = null;
    var controlSelect = null;
    var popup = null;
    var numPoly = 0;
    
    
    function onView() {
    
    	viewer = this.getViewer();
    	map  = viewer.getMap();
    
    	wkt = new OpenLayers.Format.WKT();
    	empriseLayer = new OpenLayers.Layer.Vector("Emprise Layer");
    	map.addLayer(empriseLayer);
    	
    	//Affichage des 9 emprises
    	addWkt(empriseLayer, 'POLYGON((172350 5424080,172360 5424080,172360 5424090,172350 5424090,172350 5424080))');
    	addWkt(empriseLayer, 'POLYGON((172350 5424100,172360 5424100,172360 5424110,172350 5424110,172350 5424100))');
    	addWkt(empriseLayer, 'POLYGON((172370 5424100,172380 5424100,172380 5424110,172370 5424110,172370 5424100))');
    	addWkt(empriseLayer, 'POLYGON((172370 5424080,172380 5424080,172380 5424090,172370 5424090,172370 5424080))');
    	addWkt(empriseLayer, 'POLYGON((172370 5424060,172380 5424060,172380 5424070,172370 5424070,172370 5424060))');
    	addWkt(empriseLayer, 'POLYGON((172350 5424060,172360 5424060,172360 5424070,172350 5424070,172350 5424060))');
    	addWkt(empriseLayer, 'POLYGON((172330 5424060,172340 5424060,172340 5424070,172330 5424070,172330 5424060))');
    	addWkt(empriseLayer, 'POLYGON((172330 5424080,172340 5424080,172340 5424090,172330 5424090,172330 5424080))');
    	addWkt(empriseLayer, 'POLYGON((172330 5424100,172340 5424100,172340 5424110,172330 5424110,172330 5424100))');
    	
    	// Centre et zoom sur l'ensemble des poly
    	centerOnAllPoly();
    	  
        controlSelect = new OpenLayers.Control.SelectFeature(empriseLayer,{title: "Information", onSelect: onFeatureSelect, onUnselect: onFeatureUnselect});
    	
    	var panel = new Geoportal.Control.Panel({div:OpenLayers.Util.getElement('zoom')});
    	panel.addControls(controlSelect);
    
    	map.addControl(panel);
    	
    	controlSelect.activate();
    
        function onFeatureSelect(feature) {
    		console.log("onFeatureSelect");
    		var featureReference = empriseLayer.features[0];
    		var geom1 = featureReference.geometry; // comparaison distance avec la premiere emprise
    		var geom2 = feature.geometry;
    		selectedFeature = feature;
    		var objDist = feature.geometry.distanceTo(featureReference.geometry, {details:true});
    		popup = new OpenLayers.Popup.FramedCloud("popup", 
                                         feature.geometry.getBounds().getCenterLonLat(),
                                         null,
                                         "<div style='font-size:.8em'>" + 
    									 "<br>Name : " + feature.data + 
    									 "<br>Area : " + geom2.getArea() + 
    									 "<br>WKT " + feature.data + " : " + wkt.write(feature) + 
    									 "<br>WKT " + featureReference.data + " : " + wkt.write(featureReference) + 
    									 "<br>Distance from " + featureReference.data + " : " + objDist.distance + ' (' + objDist.x0 + ' ' + objDist.y0 + '), (' + objDist.x1 + ' ' + objDist.y1 + ')' +
    									"</div>",
                                         null, true, onPopupClose);
    		feature.popup = popup;
    		map.addPopup(popup);
    	}
    		
    	function onFeatureUnselect(feature) {
    		console.log("onFeatureUnselect");
    		map.removePopup(feature.popup);
    		feature.popup.destroy();
    		feature.popup = null;
    	} 
    	
    	function onPopupClose(evt) {
    		console.log("onPopupClose");
    		controlSelect.unselect(selectedFeature);
    	}
    
    	function addWkt(layer, str) {
    		features = wkt.read(str);
    		if(features.constructor != Array) {
    		  features = [features];
    		}
    		var name=null;
    		for(var i=0; i<features.length; ++i) {
    			setPolyName(features[i]);
    		}
    		layer.addFeatures(features);
    	 }
    
    }
    		
    function setPolyName(feature) {
    	name = 'POLY ' + numPoly;
    	numPoly = numPoly + 1;
    	feature.data = name;
    }
    	
    function centerOnAllPoly() {
    	var geometries = new OpenLayers.Geometry.Collection();
    	var geom;
    	for (x in empriseLayer.features) {
    		geom = empriseLayer.features[x].geometry.clone();
    		geometries.addComponents(geom);
    	}
    	map.setCenter(geometries.getCentroid(true).getBounds().getCenterLonLat());
    	map.zoomToExtent(geometries.getBounds());
    }
    //--><!]]></script>
        <div id="viewerDiv"></div>
    	<script
        type="text/javascript"
        src="http://api.ign.fr/geoportail/api/js/1.3.0/GeoportalExtended.js">
    	<!-- -->
    	</script>
    </body>
    </html>

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 124
    Points : 1 764
    Points
    1 764

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Merci
    Merci mga_geo pour la mise à dispo de la page.

    Est-ce un bug d'OL ? Je semble être le seul à avoir ce comportement. (ou le seul à utiliser directement la fonction distanceTo et non l'outil de measure ?).

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 124
    Points : 1 764
    Points
    1 764
    Par défaut
    Je n'ai utilisé qu'entre des points et les calculs semblaient bon.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Il faut lire la documentation OpenLayers et surtout le code source ...

    La distance entre deux polygones est la plus petite des distances entre un point du polygone et un segment de l'autre ...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Certe
    C'est en effet ce que je teste. Mon exemple n'est pas clair ?
    Le polygone en bas a droite indique une distance de 22 alors que les 3 autres aux angles indiquent une distance de 14. S'achant qu'ils ont tous ete positionnes a egale distance de celui du centre, cette distance devrait être égale pour chacun des 4 polygones. non ?

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 124
    Points : 1 764
    Points
    1 764
    Par défaut
    Le calcul de la distance entre 2 segments peut être faux en OpenLayers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      wkt = new OpenLayers.Format.WKT();
      wkt1Feature = wkt.read("LINESTRING(0 0,0 10)");
      geom1 = wkt1Feature.geometry;
      wkt2Feature = wkt.read("LINESTRING(0 20,0 30)");
      geom2 = wkt2Feature.geometry;
      console.log("distance: %d %s#%s",geom1.distanceTo(geom2),geom1.toString(),geom2.toString());

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 124
    Points : 1 764
    Points
    1 764
    Par défaut Bug OpenLayers !
    Pour faire son calcul, OpenLayers détermine d'abord s'il existe une intersection entre les segments, ce calcul est fait par un appel à OpenLayers.Geometry.segmentsIntersect
    Et dans le cas de segments alignés, ce calcul répond oui!

    Une vérification avec la fonction OpenLayers.Geometry.LineString.intersects donne la bonne réponse.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/05/2013, 13h46
  2. Calcul de distance avec Google Map
    Par jouclar dans le forum Réseau/Web
    Réponses: 6
    Dernier message: 22/04/2010, 15h58
  3. Calculer une distance avec mappoint
    Par Amokrane dans le forum Framework .NET
    Réponses: 2
    Dernier message: 21/03/2008, 20h40
  4. Probleme avec une fonction de calcul d'un age
    Par dondano dans le forum Langage
    Réponses: 1
    Dernier message: 27/04/2007, 11h50
  5. Modifier un champs texte avec une fonction PHP (calcul TVA)
    Par Stella2809 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/11/2005, 00h55

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