banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Sat 17 May 2008 21:28

mga_sig
Participant occasionnel
Date d'inscription: 17 May 2008
Messages: 12

[OpenLayers]: échelle des latitudes

Pour vérifier le bon fonctionnement de mes scripts, j'affiche une page ( http://atlasnw.free.fr/googlemaps/ol.ht … n_1216.kml )
avec une couche Google Satellite puis j'ajoute une couche kml ( fichier http://atlasnw.free.fr/gml/ign_1216.kml ).

Ce fichier contient les points "rgf" de la carte orange 1216 de l'IGN.
Je constate que l'échelle des latitudes est compressée:
- les marqueurs du nord de la carte se retrouvent moins nord,
- idem pour ceux du sud.
Et ce, même en changeant de zoom.

Par contre, le popup est bien positionné !
La partie du code concerné:

Code:

  map = new OpenLayers.Map('map', {
                    controls: [
                        new OpenLayers.Control.PanZoomBar(),
                        new OpenLayers.Control.MousePosition(),
                        new OpenLayers.Control.ScaleLine(),
                        new OpenLayers.Control.MouseToolbar(),
                        new OpenLayers.Control.LayerSwitcher({'ascending':false})
                      ],
  });
  
  var gphy = new OpenLayers.Layer.Google(
                "Google Physical",
                {type: G_PHYSICAL_MAP}
            );
  var gmap = new OpenLayers.Layer.Google(
                "Google Streets" // the default
            );
  var ghyb = new OpenLayers.Layer.Google(
                "Google Hybrid",
                {type: G_HYBRID_MAP}
            );
  var gsat = new OpenLayers.Layer.Google(
                "Google Satellite",
                {type: G_SATELLITE_MAP}
            );
  map.addLayers([ghyb]);
  var gml = new OpenLayers.Layer.GML("KML", url, 
    {
      format: OpenLayers.Format.KML, 
      formatOptions: {
        extractStyles: true, 
        extractAttributes: true
        }
    }
  );
  
  map.addLayer(gml);
  selectControl = new OpenLayers.Control.SelectFeature(map.layers[1],
                {onSelect: onFeatureSelect, onUnselect: onFeatureUnselect});
  map.addControl(selectControl);
  selectControl.activate();
  map.setCenter(new OpenLayers.LonLat(Lon,Lat), Zoom);

J'ai donc une erreur, mais je ne trouve pas ...
Merci de votre aide

J'effectue mes tests sous Windows XP/Firefox 2.0.14

Hors ligne

 

#2 Sat 17 May 2008 22:00

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: [OpenLayers]: échelle des latitudes

Bonjour,

Regarde cette documentation : http://wiki.gloobe.org/openlayers:start … rte_google

En particulier :

Google utilise une projection déformée qui implique que les autres couches ne sont pas toujours bien superposée. Google utilise une projection Mercator en assumant que la terre est sphérique (ce qui est incorrect). Il s'ensuit que pour un zoom important un décalage entre le fond cartographique de Google et vos données.


Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#3 Sat 17 May 2008 22:28

mga_sig
Participant occasionnel
Date d'inscription: 17 May 2008
Messages: 12

Re: [OpenLayers]: échelle des latitudes

Bonsoir,

Merci de cette prompte réponse!
J'effectue ce test justement pour vérifier les conséquences de la projection "Google".
Il me semble que les tuiles "Google" conservent leur proportion, et lorsque je demande l'affichage d'un carré ( au sens UTM ), j'obtiens un rectangle ( petit côté: latitude ) avec OpenLayers et bien un carré avec Google Maps.

Et ce qui me surprend le plus est la différence de comportement entre marqueur et popup ( ces derniers sont bien positionnés )

A+
Marc

Hors ligne

 

#4 Sat 17 May 2008 23:21

mga_sig
Participant occasionnel
Date d'inscription: 17 May 2008
Messages: 12

Re: [OpenLayers]: échelle des latitudes

Sur cette page http://atlasnw.free.fr/googlemaps/ol.ht … n_1218.kml , j'ai juxtaposé une version GoogleMaps et une version OpenLayers.
Les marqueurs pour Melesse ( NW de la carte ) sont décalés vers le bas pour OL.
[img]http://atlasnw.free.fr/googlemaps/gm_ol.png[/img]

Hors ligne

 

#5 Sat 17 May 2008 23:55

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: [OpenLayers]: échelle des latitudes

Marc,

Je répète qu'il faut que tu regardes la doc, Google Map utilise une "projection" qui leur ait propre, généralement ce genre de décalage est dû à cela. Je ne sais pas comment Google map gère cela de son côté mais à priori il le gère correctement. Pour OL, tu dois définir une projection sphericalMercator et "reprojeté" ton kml avec gdal-ogr, ou bien reprojeter ton kml à l'aide de la fonction adéquat d'OL (conf site d'OL car je ne sais pas comment il faut faire).

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#6 Sun 18 May 2008 00:21

erilem
Participant occasionnel
Date d'inscription: 8 Mar 2007
Messages: 26

Re: [OpenLayers]: échelle des latitudes

Absolument non testé :

Code:

  var proj_900913 = new OpenLayers.Projection("EPSG:900913");
  var proj_4326 = new OpenLayers.Projection("EPSG:4326");
  map = new OpenLayers.Map('map', {
                    projection: proj_900913,
                    displayProjection: proj_4326,
                    units: "m",
                    maxResolution: 156543.0339,
                    maxExtent: new OpenLayers.Bounds(-20037508, -20037508,  20037508, 20037508.34)
                    controls: [
                        new OpenLayers.Control.PanZoomBar(),
                        new OpenLayers.Control.MousePosition(),
                        new OpenLayers.Control.ScaleLine(),
                        new OpenLayers.Control.MouseToolbar(),
                        new OpenLayers.Control.LayerSwitcher({'ascending':false})
                      ],
  });
  
  var gphy = new OpenLayers.Layer.Google(
                "Google Physical",
                {type: G_PHYSICAL_MAP, sphericalMercator: true}
            );
  var gmap = new OpenLayers.Layer.Google(
                "Google Streets", // the default
                {sphericalMercator: true}
            );
  var ghyb = new OpenLayers.Layer.Google(
                "Google Hybrid",
                {type: G_HYBRID_MAP, sphericalMercator: true}
            );
  var gsat = new OpenLayers.Layer.Google(
                "Google Satellite",
                {type: G_SATELLITE_MAP, sphericalMercator: true}
            );
  map.addLayers([ghyb]);
  var gml = new OpenLayers.Layer.GML("KML", url, {
      format: OpenLayers.Format.KML, 
      formatOptions: {
          extractStyles: true, 
          extractAttributes: true,
          externalProjection: proj_4326,
          internalProjection: proj_900913
      }
  });
  
  map.addLayer(gml);
  selectControl = new OpenLayers.Control.SelectFeature(map.layers[1],
                {onSelect: onFeatureSelect, onUnselect: onFeatureUnselect});
  map.addControl(selectControl);
  selectControl.activate();
  map.setCenter(new OpenLayers.LonLat(Lon,Lat), Zoom);

Hors ligne

 

#7 Sun 18 May 2008 18:02

mga_sig
Participant occasionnel
Date d'inscription: 17 May 2008
Messages: 12

Re: [OpenLayers]: échelle des latitudes

J'ai testé la proposition de erilem.
L'ajout de

Code:

  var gml = new OpenLayers.Layer.GML("KML", url, {
      format: OpenLayers.Format.KML, 
      formatOptions: {
          extractStyles: true, 
          extractAttributes: true,
          externalProjection: proj_4326,
          internalProjection: proj_900913
      }

ne permet plus l'affichage de la couche kml. Et je n'ai pas d'erreurs dans Firebug.

La position de la souris donnée par OpenLayers.Control.MousePosition est exacte.

Lors d'un déplacement vertical de l'image, les marqueurs ne restent pas au-dessus de la même position.

Hors ligne

 

#8 Wed 21 May 2008 06:44

erilem
Participant occasionnel
Date d'inscription: 8 Mar 2007
Messages: 26

Re: [OpenLayers]: échelle des latitudes

mga_sig a écrit:

J'ai testé la proposition de erilem.
L'ajout de

Code:

  var gml = new OpenLayers.Layer.GML("KML", url, {
      format: OpenLayers.Format.KML, 
      formatOptions: {
          extractStyles: true, 
          extractAttributes: true,
          externalProjection: proj_4326,
          internalProjection: proj_900913
      }

ne permet plus l'affichage de la couche kml. Et je n'ai pas d'erreurs dans Firebug.

La position de la souris donnée par OpenLayers.Control.MousePosition est exacte.

Lors d'un déplacement vertical de l'image, les marqueurs ne restent pas au-dessus de la même position.


Quelle version d'OL est utilisée ?

Avec la 2.6 ou le trunk, essayer :

Code:

var gml = new OpenLayers.Layer.GML("KML", url, {
      projection: proj_4326,
      format: OpenLayers.Format.KML, 
      formatOptions: {
          extractStyles: true, 
          extractAttributes: true
      }
}

Bonne chance,

--
Eric

Hors ligne

 

#9 Wed 21 May 2008 15:24

mga_sig
Participant occasionnel
Date d'inscription: 17 May 2008
Messages: 12

Re: [OpenLayers]: échelle des latitudes

Je suis en version 2.6 <script src="http://www.openlayers.org/api/OpenLayers.js"></script>

J'ai fait quelques modifications de code pour pouvoir afficher:
- une couche KML:  http://atlasnw.free.fr/googlemaps/ol.ht … &l=kml
- une couche Markers: http://atlasnw.free.fr/googlemaps/ol.ht … ;l=markers
- une couche Features: http://atlasnw.free.fr/googlemaps/ol.ht … l=features
Et sur la couche KML, les marqueurs ne sont toujours pas bien placés, et c'est ok sur les autres!
L'icône de la couche Features n'est pas la bonne ...

Code:

  var proj_4326 = new OpenLayers.Projection("EPSG:4326");
  var gml = new OpenLayers.Layer.GML("KML", url, 
    {
          projection: proj_4326,
      format: OpenLayers.Format.KML, 
      formatOptions: {
        extractStyles: true, 
        extractAttributes: true,
      },
    }
  );
  map.addLayer(gml);

et

Code:

  var markers = new OpenLayers.Layer.Markers("markers",
      {
      srs: 'EPSG:900913', 
      transparent:true,
      format:'image/gif'
    }, 
    {singleTile: true} 
        );
    map.addLayer(markers);
  var size = new OpenLayers.Size(10,17);
  var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
  var icon = new OpenLayers.Icon('http://boston.openguides.org/markers/AQUA.png',size,offset);
  for(var i = 0; i < placemarks.length; i++) {
    var point = placemarks[i].getElementsByTagName("Point")[0];
    var coords = point.getElementsByTagName("coordinates")[0].childNodes[0].nodeValue;
    coords = coords.split(",");
      var name = placemarks[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
    var description = placemarks[i].getElementsByTagName("description")[0].childNodes[0].nodeValue;
    console.log("ol_markers name:%s lon:%s lat:%s",name,coords[0],coords[1])
// Création du marqueur
        olLL = new OpenLayers.LonLat(coords[0],coords[1]);        
        markers.addMarker(new OpenLayers.Marker(olLL, icon.clone()));        
  }

Code:

  var features = new OpenLayers.Layer.Markers("features",
      {
      srs: 'EPSG:900913', 
      transparent:true,
      format:'image/gif'
    }, 
    {singleTile: true} 
        );
    map.addLayer(features);
  var size = new OpenLayers.Size(10,17);
  var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
  var icon = new OpenLayers.Icon('http://boston.openguides.org/markers/AQUA.png',size,offset);
  for(var i = 0; i < placemarks.length; i++) {
    var point = placemarks[i].getElementsByTagName("Point")[0];
    var coords = point.getElementsByTagName("coordinates")[0].childNodes[0].nodeValue;
    coords = coords.split(",");
      var name = placemarks[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
    var description = placemarks[i].getElementsByTagName("description")[0].childNodes[0].nodeValue;
    console.log("ol_features name:%s lon:%s lat:%s",name,coords[0],coords[1])
// Création du marqueur
        olLL = new OpenLayers.LonLat(coords[0],coords[1]);        
        feature = new OpenLayers.Feature(features,olLL,icon.clone());
        feature.id = name;
        features.addMarker(feature.createMarker());        
  }

Hors ligne

 

#10 Thu 22 May 2008 03:28

vblanque
Participant occasionnel
Lieu: Santiago, Chili
Date d'inscription: 25 Oct 2007
Messages: 20

Re: [OpenLayers]: échelle des latitudes

normalement le code proposé par erilem fonctionne bien

Code:

var projIn = new OpenLayers.Projection("EPSG:4326");
var projOut = new OpenLayers.Projection("EPSG:900913");    

  var gml = new OpenLayers.Layer.GML("KML", url, {
      format: OpenLayers.Format.KML, 
      formatOptions: {
          extractStyles: true, 
          extractAttributes: true,
          externalProjection: projIn,
          internalProjection: projOut 
      }

Je le fais fonctionner sans problème avec une couche Kml.

J'ai Openlayers 2.6 (Release) et la librairie (Proj4js):

Code:

    
    <script src="lib/OpenLayers.js"></script>
    <script src="lib/proj4js/proj4js.js"></script>

Dans la librairie Proj4js, j'ai dans le répertoire 'defs', les fichiers de projection:

- fichier: EPSG4326.js

Code:

Proj4js.defs["EPSG:4326"] = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ";

- fichier: EPSG900913.js

Code:

Proj4js.defs.google = "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs";

En espérant que cela puisse te servir, chez moi, ça fonctionne nickel !

a+

Dernière modification par vblanque (Thu 22 May 2008 03:30)

Hors ligne

 

#11 Thu 22 May 2008 19:50

mga_sig
Participant occasionnel
Date d'inscription: 17 May 2008
Messages: 12

Re: [OpenLayers]: échelle des latitudes

De savoir que cela peut fonctionner m'encourage, ainsi que vos conseils pour y arriver.
Mais j'en suis toujours au même stade!!!

J'ai récupéré les librairies:

Code:

  wget  -O DL/firebuglite1.0-b1.zip http://www.getfirebug.com/releases/firebuglite1.0-b1.zip
  "$UZ" x -otmp DL/firebuglite1.0-b1.zip
  wget -O DL/OpenLayers-2.6.zip http://openlayers.org/download/OpenLayers-2.6.zip
  "$UZ" x -otmp DL/OpenLayers-2.6.zip
  wget -r -l 3 -nH --cut-dirs=4 --directory-prefix=proj4js http://dev.openlayers.org/sandbox/proj4js/lib/proj4js/
  rm  proj4js/index.html*
  rm  proj4js/*/index.html*
  [ -d ../lib ] && rm -rf ../lib
  [ -d ../lib ] || mkdir ../lib
  cp -pR  tmp/OpenLayers-2.6/* ../lib
  cp -pR proj4js ../lib
  cp -pR tmp/firebug ../lib
  ls -lR ../lib
    cat <<'EOF' > ../lib/proj4js/defs/EPSG4326.js
Proj4js.defs["EPSG:4326"] = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ";
EOF

avec $UZ qui est un pointeur sur 7-zip
J'ai remplacé l'appel des javascripts:

Code:

<script src="/lib/firebug/firebug.js" language="javascript" type="text/javascript" ></script>
<script src="/lib/OpenLayers.js"></script>
<script src="/lib/proj4js/proj4js.js"></script>

un nouveau layer de test:

Code:

  var projIn = new OpenLayers.Projection("EPSG:4326");
  var projOut = new OpenLayers.Projection("EPSG:900913"); 
  var gml = new OpenLayers.Layer.GML("kml2", url, 
    {
      format: OpenLayers.Format.KML, 
      formatOptions: {
        extractStyles: true, 
        extractAttributes: true,
        externalProjection: projIn,
        internalProjection: projOut         
      },
    }
  );
  map.addLayer(gml);

et même punition

Dans la console Firebug, onglet Net, je ne vois pas de demande pour EPSG4326.js

L'erreur peut-elle provenir des fichiers KML ?

Hors ligne

 

#12 Thu 22 May 2008 22:01

mga_sig
Participant occasionnel
Date d'inscription: 17 May 2008
Messages: 12

Re: [OpenLayers]: échelle des latitudes

Après avoir vidé le cache de Firefox, voici les requêtes GET en http

Code:

 37   4.756035 192.168.0.31 -> 212.27.63.149 HTTP GET /googlemaps/ol.html?q=ign_1216.kml&l=kml2 HTTP/1.1
 63   5.050549 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/firebug/firebug.js HTTP/1.1
191   8.679208 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/OpenLayers.js HTTP/1.1
753   9.987976 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/proj4js/proj4js.js HTTP/1.1
804  10.287523 192.168.0.31 -> 212.27.63.149 HTTP GET /gml/ign_1216.kml HTTP/1.1
838  10.531425 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/proj4js/defs/EPSG900913.js?q=ign_1216.kml&l=kml2 HTTP/1.1
847  10.629111 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/proj4js/projCode/merc.js?q=ign_1216.kml&l=kml2 HTTP/1.1
862  10.842402 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/theme/default/style.css HTTP/1.1
867  10.929446 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/north-mini.png HTTP/1.1
895  11.116472 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/west-mini.png HTTP/1.1
900  11.210422 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/east-mini.png HTTP/1.1
912  11.273663 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/south-mini.png HTTP/1.1
927  11.367187 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/zoom-plus-mini.png HTTP/1.1
933  11.460784 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/zoom-world-mini.png HTTP/1.1
942  11.554460 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/zoom-minus-mini.png HTTP/1.1
956  11.649258 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/layer-switcher-maximize.png HTTP/1.1
960  11.726197 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/slider.png HTTP/1.1
974  11.820006 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/drag-rectangle-off.png HTTP/1.1
979  11.913438 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/panning-hand-on.png HTTP/1.1
1013  12.009165 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/layer-switcher-minimize.png HTTP/1.1
1075  12.325365 192.168.0.31 -> 212.27.63.149 HTTP GET /favicon.ico HTTP/1.1
1083  12.327648 192.168.0.31 -> 212.27.63.149 HTTP GET /lib/img/zoombar.png HTTP/1.1

Hors ligne

 

#13 Sat 24 May 2008 22:08

mga_sig
Participant occasionnel
Date d'inscription: 17 May 2008
Messages: 12

Re: [OpenLayers]: échelle des latitudes

Ce qui est bien avec la pluie, c'est que je poursuis mes essais: je viens de transformer "mon" code javascript en version objet/prototype.
Comme je suis un grand débutant en javascript, j'ai eu un peu de mal, mais bon le principal est le résultat.
J'ai donc maintenant une page html avec 2 cartes:
- celle de gauche est obtenue par un OpenLayers.Layer.GML
- celle de droite avec un OpenLayers.Layer.Markers
Et du côté positionnement des marqueurs, le OpenLayers.Layer.Markers est gagnant.

Pour voir: http://atlasnw.free.fr/googlemaps/olo.h … n_1216.kml

Hors ligne

 

#14 Wed 25 June 2008 12:12

@eshogues
Participant actif
Lieu: Lausanne/Chambéry
Date d'inscription: 27 Sep 2007
Messages: 82

Re: [OpenLayers]: échelle des latitudes

Bonjour à tous

Je rencontre exactement le meme problème que mga_sig.
Je voudrais intégrer les données du réseau de GPS permanent de l'ign, propsé en libre téléchargement.

Je souhaiterais savoir où puis je télécharger la bibliothèque Proj4 que vous utilisez

Code:

<script src="/lib/proj4js/proj4js.js"></script>

De plus je voudrais savoir si un tuto existe pour générer un kml à partir d'un csv ou d'un txt.

Les données des stations étant précises qu'elle est la solution la plus adaptée selon vous?
le KML, les Markers???

Cordialement

Arnaud

Hors ligne

 

#15 Wed 25 June 2008 12:25

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: [OpenLayers]: échelle des latitudes

Arnaud,

Au hazard : http://proj4js.org/ wink

Pour les données, prend les plus simples à créer. Regarde du côté d'OGR pour voir ses possibilités en fonction du format des données de départ.

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#16 Wed 25 June 2008 15:52

@eshogues
Participant actif
Lieu: Lausanne/Chambéry
Date d'inscription: 27 Sep 2007
Messages: 82

Re: [OpenLayers]: échelle des latitudes

Merci pour l'info

Cordialement

Arnaud

Hors ligne

 

Pied de page des forums

Powered by FluxBB