Pages: 1
- Sujet précédent - MAPSERVER et openLayers : probleme superposition des cartes. - Sujet suivant
#1 Tue 29 October 2013 10:29
- alainib
- Juste Inscrit !
- Lieu: montpellier
- Date d'inscription: 29 Oct 2013
- Messages: 9
MAPSERVER et openLayers : probleme superposition des cartes.
Bonjour, je suis nouveau sur ce site et dans le domaine de la géomatique.
J'essaie de créer une carte avec Mapserver et openlayers mais je rencontre un problème d'alignement/superposition des cartes.
Le but est d'avoir la carte de la france et que certaines communes soient coloriées (pour le moment je prend toutes les communes de France pour etre sur de l'alignement des cartes).
J'utilise openlayers pour avoir la carte de la france zoomable depuis les serveurs de openlayers.
J'utilise mapserver pour récuperer depuis postgres les contours des communes de France au format Lambert 93:
avec ogrinfo sur mon shape j'ai :
Code:
Layer name: commune Geometry: Polygon Feature Count: 36610 Extent: (99226.000000, 6049647.000000) - (1242375.000000, 7110524.000000) Layer SRS WKT: PROJCS["RGF93_Lambert_93", GEOGCS["GCS_RGF_1993", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS_1980",6378137.0,298.257222101]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["False_Easting",700000.0], PARAMETER["False_Northing",6600000.0], PARAMETER["Central_Meridian",3.0], PARAMETER["Standard_Parallel_1",44.0], PARAMETER["Standard_Parallel_2",49.0], PARAMETER["Latitude_Of_Origin",46.5], UNIT["Meter",1.0]] ID_GEOFLA: Integer (10.0) CODE_COMM: String (3.0) INSEE_COM: String (5.0) NOM_COMM: String (50.0) STATUT: String (20.0) X_CHF_LIEU: Integer (6.0) Y_CHF_LIEU: Integer (6.0) X_CENTROID: Integer (6.0) Y_CENTROID: Integer (6.0) Z_MOYEN: Integer (4.0) SUPERFICIE: Integer (10.0) POPULATION: Real (6.1) CODE_CANT: String (2.0) CODE_ARR: String (1.0) CODE_DEPT: String (2.0) NOM_DEPT: String (30.0) CODE_REG: String (2.0) NOM_REGION: String (30.0)
Voici mon code javacript :
Code:
<html> <head><title>OpenLayers KML Example</title></head> <body> <script type="text/javascript" src="lib/jquery.js"></script> <script type="text/javascript" src="lib/OpenLayers.js"></script> <script type="text/javascript" src="lib/html2canvas.js"></script> <div id="map" style="width:700px; height:600px ; margin:10px auto 50px auto;"></div> <script defer="defer"> var map = new OpenLayers.Map('map',{ maxExtent: new OpenLayers.Bounds( 99226.000000, 6049647.000000, 1242375.000000 , 7110524.000000 ), projection : new OpenLayers.Projection("EPSG:2154"), displayProjection : new OpenLayers.Projection("EPSG:2154") } ); map.addLayer(new OpenLayers.Layer.OSM()); var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", "http://localhost/cgi-bin/mapserv.exe?MODE=map&map=C:/ms4w/Apache/htdocs/signalement_albopictus/app/webroot/mapserver/colonisation.map", { layers: 'communeatteinte', SRS:'EPSG:2154' } , { isBaseLayer : false, visibility : true , projection : new OpenLayers.Projection("EPSG:2154"), displayProjection : new OpenLayers.Projection("EPSG:2154") } ); map.addLayer(wms); var zoom=5; var center = new OpenLayers.LonLat(80000,5800000); wms.setCenter(center, 5); map.zoomToMaxExtent(); map.addControl(new OpenLayers.Control.Navigation()); </script> </body></html>
et voici le fichier map
Code:
MAP NAME commune_map STATUS ON SIZE 600 600 UNITS METERS EXTENT 99226.000000 6049647.000000 1242375.000000 7110524.000000 FONTSET './fonts/fonts.txt' SYMBOLSET './symbols/symbols.txt' IMAGECOLOR 255 255 255 IMAGEQUALITY 99 IMAGETYPE png PROJECTION "init=epsg:2154" END OUTPUTFORMAT NAME png DRIVER 'GD/PNG' MIMETYPE 'image/png' #IMAGEMODE RGBA EXTENSION 'png' TRANSPARENT ON END WEB METADATA "ows_enable_request" "*" END TEMPLATE 'fooOnlyForWMSGetFeatureInfo' END LAYER NAME "communeatteinte" #DATA commune STATUS DEFAULT TYPE POLYGON DUMP true TEMPLATE fooOnlyForWMSGetFeatureInfo EXTENT 99226.000000 6049647.000000 1242375.000000 7110524.000000 CONNECTIONTYPE POSTGIS CONNECTION "host=localhost dbname=base user=postgres password=passw port=5433" DATA "the_geom FROM ( select * from communes where true ) AS foo USING UNIQUE id" PROJECTION "init=epsg:2154" END CLASS NAME "commune_color" COLOR 237 36 76 END END END
J'obtiens bien la carte de france interactive et ma carte de France crée à partir des contours des communes ( en rouge sur la photo) mais impossible de les superposer correctement, de plus quand je zoom la carte rouge devrai s'agrandir or c'est l'inverse et elle ce duplique.
J'ai testé depuis 2 jours en vain.
Je vous remercie d'avance pour vos conseil et aide.
Cordialement
Hors ligne
#2 Tue 29 October 2013 10:36
Re: MAPSERVER et openLayers : probleme superposition des cartes.
Bonjour,
Ton problème est un problème de projection : tu essaies de superposer deux couches qui n'ont pas la même projection. Pour faire simple : la terre est ronde et nous travaillons sur un plan cartésien (et pas sphérique), donc nous projetons les données de la surface du globe sur une feuille plane. Il y a plusieurs méthodes et paramétrage en fonction de l'endroit où nous nous trouvons (=> notion de système de référence, ou srid).
Les projections sont généralement définie par un code (code EPSG), 2154 est le code pour la projection lambert 93 (couche des départements).
Tu ajoutes une couches OSM dont l'objectif est de couvrir la terre entière, dont la projection lambert 93 n'est pas faites pour ca. Ils utilisent donc un autre système de rérérence (Google Mercator, code EPSG : 900913 puis 3857).
Il faut que tu définisses dans ton flux WMS la projection 3857 (ou 900913 mais ce numéro est déprécié). C'est assez simple : dans ton objet METADATA de ton objet WEB tu rajoutes : "ows_srs" "epsg:3857". Tu peux en mettre plusieurs.
Tu devras changer ton code openlayers : code epsg et boudingbox pour la convertir dans la bonne projection.
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 Tue 29 October 2013 10:57
- alainib
- Juste Inscrit !
- Lieu: montpellier
- Date d'inscription: 29 Oct 2013
- Messages: 9
Re: MAPSERVER et openLayers : probleme superposition des cartes.
Bonjour et merci beaucoup pour votre aide.
Je ne suis pas du tout familier avec toutes ces notions de projection mais je commence à y voir un peu plus clair.
J'ai rajouter dans le fichier map dans l'objet web/metadata:
Code:
WEB METADATA "ows_enable_request" "*" "ows_srs" "epsg:3857" END TEMPLATE 'fooOnlyForWMSGetFeatureInfo' END
Dans le code openlayers j'ai modifier les projections en epsg:3857 pour les deux couches:
Code:
var map = new OpenLayers.Map('map',{ maxExtent: new OpenLayers.Bounds( 99226.000000, 6049647.000000, 1242375.000000 , 7110524.000000 ), projection : "EPSG:3857", } ); map.addLayer(new OpenLayers.Layer.OSM()); var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", "http://localhost/cgi-bin/mapserv.exe?MODE=map&map=C:/ms4w/Apache/htdocs/signalement_albopictus/app/webroot/mapserver/colonisation.map", { layers: 'communeatteinte', SRS:'EPSG:2154' } , { isBaseLayer : false, visibility : true , projection : "EPSG:3857" } );
de plus la définition suivante ne pose t'elle pas de problème ? :
Code:
{ layers: 'communeatteinte', SRS:'EPSG:2154' }
ou faut'il que je mette également EPSG:3857 ?
je ne vois pas par contre comment définir le bounding box, cela sert'il a évité que la "carte rouge" de france ne se répéte en plus petit lorsque je zoom ?
Si j'ai bien compris il n'est pas nécessaire de transformer mes contours en base de données pour les mettres dans un autre référentiel, openlayers le fait dynamiquement ?
merci d'avance
Alain
Dernière modification par alainib (Tue 29 October 2013 10:59)
Hors ligne
#4 Tue 29 October 2013 11:30
Re: MAPSERVER et openLayers : probleme superposition des cartes.
Bonjour,
Excuse moi : bouding box = maxExtent, donc tu as bien fais la correction dans la partie JavaScript.
Pour "SRS:'EPSG:2154' " oui il faut changer ca en 3857 car openlayers va appeller la couche WMS de ton mapfile avec ce code, que tu as bien définie dans ton mapfile.
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
#5 Tue 29 October 2013 12:51
- alainib
- Juste Inscrit !
- Lieu: montpellier
- Date d'inscription: 29 Oct 2013
- Messages: 9
Re: MAPSERVER et openLayers : probleme superposition des cartes.
le maxExtent doit'il s'appliquer à la carte ou au wms dans le code openlayers ? ( je ne l'ai fait que à la carte)
j'ai toujours le problème de superposition erronée,
dans le fichier map la balise projection est différente de celle de web/metadata,
la carté crée par le fichier map s'affiche plusieurs fois lorsque je zoom, comment puis je éviter cela ?
merci d'avance.
Alain
Code:
<script defer="defer"> var map = new OpenLayers.Map('map',{ maxExtent: new OpenLayers.Bounds( 99226.000000, 6049647.000000, 1242375.000000 , 7110524.000000 ), units: 'm', projection : "EPSG:3857", } ); map.addLayer(new OpenLayers.Layer.OSM()); var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", "http://localhost/cgi-bin/mapserv.exe?MODE=map&map=C:/ms4w/Apache/htdocs/signalement_albopictus/app/webroot/mapserver/colonisation.map", { layers: 'communeatteinte', SRS:'EPSG:3857' } , { isBaseLayer : false, visibility : true , projection : "EPSG:3857", } ); map.addLayer(wms); var zoom=5; var center = new OpenLayers.LonLat(80000,5800000); map.zoomToMaxExtent(); map.addControl(new OpenLayers.Control.Navigation()); </script>
fichier map:
Code:
MAP NAME commune_map STATUS ON SIZE 600 600 UNITS METERS EXTENT 99226.000000 6049647.000000 1242375.000000 7110524.000000 FONTSET './fonts/fonts.txt' SYMBOLSET './symbols/symbols.txt' IMAGECOLOR 255 255 255 IMAGEQUALITY 99 IMAGETYPE png PROJECTION "init=epsg:2154" END OUTPUTFORMAT NAME png DRIVER 'GD/PNG' MIMETYPE 'image/png' #IMAGEMODE RGBA EXTENSION 'png' TRANSPARENT ON END WEB METADATA "ows_enable_request" "*" "ows_srs" "epsg:3857" END TEMPLATE 'fooOnlyForWMSGetFeatureInfo' END LAYER NAME "communeatteinte" #DATA commune STATUS DEFAULT TYPE POLYGON DUMP true TEMPLATE fooOnlyForWMSGetFeatureInfo EXTENT 99226.000000 6049647.000000 1242375.000000 7110524.000000 CONNECTIONTYPE POSTGIS CONNECTION "host=localhost dbname=base user=postgres password=pass port=5433" DATA "the_geom FROM ( select * from communes where true ) AS foo USING UNIQUE id" PROJECTION "init=epsg:2154" END CLASS NAME "commune_color" COLOR 237 36 76 END END END
Hors ligne
#6 Tue 29 October 2013 13:35
Re: MAPSERVER et openLayers : probleme superposition des cartes.
Bonjour,
Dans le mapfile :
Extent = bbox dans la projection définie par le bloc Projection
wms_srs : liste des projections géré par le flux WMS
projection dans le bloc MAP : système de référence par défaut de la carte
Projection dans le bloc LAYER : système de référence de la donnée source (correct dans ton mapfile)
Dans OpenLayers :
maxExtent: étendue sur laquelle se situe la carte affichée, dans le système de référence définie
projection : système de référence
Ta variable center peut aussi être incorrect (es tu sur que la projection de ces coordonnées sont en 3857 ?)
Il y a donc un problème soit dans le maxExtent du javaScript, soit dans l'Extent du mapfile.
Ton problème de multiplication est dû à ces problèmes de projection mal définie.
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
#7 Tue 29 October 2013 13:39
Re: MAPSERVER et openLayers : probleme superposition des cartes.
Re,
L'extent de la France en 3857 est : -740866, 5212703, 1131482, 6680880
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
#8 Tue 29 October 2013 13:43
- alainib
- Juste Inscrit !
- Lieu: montpellier
- Date d'inscription: 29 Oct 2013
- Messages: 9
Re: MAPSERVER et openLayers : probleme superposition des cartes.
merci pour toutes ces spécifications, je vais analyser tout cela.
La seul chose dont je suis sur c'est que mes données dans postgres sont en lambert 93, et que leur Extent est (99226.000000, 6049647.000000) - (1242375.000000, 7110524.000000) obtenu avec ogrinfo, que j'ai mis dans tout les extends que j'ai.
le reste est plutôt du test en espérant que cela marche.
Hors ligne
#9 Tue 29 October 2013 14:03
Re: MAPSERVER et openLayers : probleme superposition des cartes.
Bonjour,
Pour le mapfile et OpenLayers tu n'es pas obligé de mettre l'extent exact de tes données. Donc tu peux tenter avec celui que je t'ai donné. Ce qui est important c'est la cohérence des projections (et des extents vis à vis de la projection utilisée).
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
#10 Wed 30 October 2013 11:43
- alainib
- Juste Inscrit !
- Lieu: montpellier
- Date d'inscription: 29 Oct 2013
- Messages: 9
Re: MAPSERVER et openLayers : probleme superposition des cartes.
Bonjour,
après moulte tentatives empiriques cela ne marche pas encore.
j'ai généré un nouveau fichier mapfile avec a "Quantum GIS Desktop (1.8.0)" que voici :
Code:
MAP NAME commune_map STATUS ON SIZE 600 600 UNITS meters EXTENT -497382.386212 5795616.476470 2137577.593991 7092247.122342 FONTSET './fonts/fonts.txt' SYMBOLSET './symbols/symbols.txt' IMAGECOLOR 255 255 255 IMAGEQUALITY 90 IMAGETYPE png PROJECTION 'proj=lcc' 'lat_1=49' 'lat_2=44' 'lat_0=46.5' 'lon_0=3' 'x_0=700000' 'y_0=6600000' 'ellps=GRS80' 'towgs84=0,0,0,0,0,0,0' 'units=m' 'no_defs' END OUTPUTFORMAT NAME png DRIVER 'GD/PNG' MIMETYPE 'image/png' #IMAGEMODE RGBA EXTENSION 'png' TRANSPARENT ON END # Web interface definition. Only the template parameter # is required to display a map. See MapServer documentation WEB # Set IMAGEPATH to the path where MapServer should # write its output. IMAGEPATH '/tmp/' # Set IMAGEURL to the url that points to IMAGEPATH # as defined in your web server configuration IMAGEURL '/tmp/' # WMS server settings METADATA 'ows_title' 'QGIS-MAP' 'ows_onlineresource' 'C:/ms4w/Apache/htdocs/mapserver/commune.map' 'ows_srs' 'EPSG:2154' END #Scale range at which web interface will operate # Template and header/footer settings # Only the template parameter is required to display a map. See MapServer documentation TEMPLATE 'fooOnlyForWMSGetFeatureInfo' END LAYER NAME 'communes' TYPE POLYGON DUMP true TEMPLATE fooOnlyForWMSGetFeatureInfo EXTENT -497382.386212 5795616.476470 2137577.593991 7092247.122342 CONNECTIONTYPE postgis CONNECTION "dbname='signalement' host=127.0.0.1 port=5433 user='postgres' password='log' sslmode=disable" DATA 'the_geom FROM "communes" USING UNIQUE id USING srid=2154' METADATA 'ows_title' 'communes' END STATUS OFF TRANSPARENCY 100 PROJECTION 'proj=lcc' 'lat_1=49' 'lat_2=44' 'lat_0=46.5' 'lon_0=3' 'x_0=700000' 'y_0=6600000' 'ellps=GRS80' 'towgs84=0,0,0,0,0,0,0' 'units=m' 'no_defs' END CLASS NAME 'communes' STYLE WIDTH 0.91 OUTLINECOLOR 0 0 0 COLOR 23 15 132 END END END END
j'ai modifier le code javascript en fonction de ce que j'ai compris :
Code:
var link = "http://localhost/cgi-bin/mapserv.exe?MODE=map&map=C:/ms4w/Apache/htdocs/mapserver/commune.map&"; var map = new OpenLayers.Map('map', { controls: [], maxExtent: new OpenLayers.Bounds( -740866, 5212703, 1131482, 6680880 ), } ); map.addLayer(new OpenLayers.Layer.OSM()); var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", link, { layers: 'communes', maxExtent: new OpenLayers.Bounds( -497382.386212, 5795616.476470 ,2137577.593991 ,7092247.122342), // SRS:'EPSG:2154', // toujours ignoré d'aprés la doc' transparent: true, } , { singleTile: true, ratio: 1 }, { isBaseLayer : false, visibility : true , projection : new OpenLayers.Projection("EPSG:2154"), displayProjection : new OpenLayers.Projection("EPSG:3857") } ); wms.setOpacity(0.52); map.addLayer(wms);
j'ai tenté de permuter les
- maxextent des le wms et osm
- la valeur de projection et displayprojection du wms
mais sans succés, la carte wms ne s'affiche plus qu'une seule fois maintenant, mais elle est mal superposé.
Sinon si je convertit mes données en base de données depuis lambert 93 vers une autre projection cela peut'il résoudre le problème ?
merci d'avance
Alain
Hors ligne
#11 Wed 30 October 2013 11:47
- tbonfort
- Participant actif
- Date d'inscription: 11 Oct 2007
- Messages: 87
Re: MAPSERVER et openLayers : probleme superposition des cartes.
il faut supprimer le "mode=map" de ton url mapserver (var link), en effet tu veux utiliser le mode WMS, et non le mode "mapserver"
Hors ligne
#12 Wed 30 October 2013 11:55
- alainib
- Juste Inscrit !
- Lieu: montpellier
- Date d'inscription: 29 Oct 2013
- Messages: 9
Re: MAPSERVER et openLayers : probleme superposition des cartes.
merci pour votre aide.
je viens de supprimer le "mode=map" de l'url mais maitenant le calque wms ne s'affiche plus sur la carte, a la place il y a une "image rose transparente"
voici l'url
http://localhost/cgi-bin/mapserv.exe?map=C:/ms4w/Apache/htdocs/mapserver/commune.map&LAYERS=communes&MAXEXTENT=-497382.386212%2C5795616.47647%2C2137577.593991%2C7092247.122342&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fpng&SRS=EPSG%3A900913&BBOX=-15898379.692831,-11134923.624203,11496651.240762,12346531.461735&WIDTH=700&HEIGHT=600
Hors ligne
#13 Wed 30 October 2013 12:14
- tbonfort
- Participant actif
- Date d'inscription: 11 Oct 2007
- Messages: 87
Re: MAPSERVER et openLayers : probleme superposition des cartes.
en repartant de zero, avec une config minimale pour faire marcher le tout...
mapfile:
Code:
MAP NAME commune_map STATUS ON SIZE 600 600 UNITS meters EXTENT -497382.386212 5795616.476470 2137577.593991 7092247.122342 PROJECTION "+init=epsg:2154" END WEB METADATA 'ows_srs' 'EPSG:2154 EPSG:3857' 'ows_enable_request' '*' END END LAYER NAME 'communes' TYPE POLYGON CONNECTIONTYPE postgis CONNECTION "dbname='signalement' host=127.0.0.1 port=5433 user='postgres' password='log' sslmode=disable" DATA 'the_geom FROM "communes" USING UNIQUE id USING srid=2154' STATUS ON PROJECTION "+init=epsg:2154" END CLASS NAME 'communes' STYLE WIDTH 0.91 OUTLINECOLOR 0 0 0 COLOR 23 15 132 END END END END
et openlayers:
Code:
var map = new OpenLayers.Map('map',{ displayProjection : new OpenLayers.Projection("EPSG:2154") } ); map.addLayer(new OpenLayers.Layer.OSM()); var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", "http://localhost/cgi-bin/mapserv.exe?map=C:/ms4w/Apache/htdocs/signalement_albopictus/app/webroot/mapserver/colonisation.map", { layers: 'communes'} , { isBaseLayer : false, visibility : true , projection : new OpenLayers.Projection("EPSG:3857"), maxExtent: new OpenLayers.Bounds(-20037508.342789,-20037508.342789,20037508.342789,20037508.342789), sphericalMercator: true } ); map.addLayer(wms); map.zoomToMaxExtent(); map.addControl(new OpenLayers.Control.Navigation());
Hors ligne
#14 Thu 31 October 2013 17:04
- alainib
- Juste Inscrit !
- Lieu: montpellier
- Date d'inscription: 29 Oct 2013
- Messages: 9
Re: MAPSERVER et openLayers : probleme superposition des cartes.
désolé pour le retard et merci pour le code, je vais tester cela de suite.
Hors ligne
#15 Thu 31 October 2013 17:22
- alainib
- Juste Inscrit !
- Lieu: montpellier
- Date d'inscription: 29 Oct 2013
- Messages: 9
Re: MAPSERVER et openLayers : probleme superposition des cartes.
bon super méga bonne nouvelle, les cartes sont bien superposés, lorsque je déplace ou zoom elles restent coordonnées correctement ouf !
Le extent que vous avez mis est complétement différent de celui que j'avais, est ce le résultat d'un calcul spécifique ?
une dernière question, est'il possible de bloquer la navigation pour rester uniquement en France ?
Yves et Tbonfort, merci encore pour votre aide.
Hors ligne
#16 Thu 31 October 2013 18:38
- alainib
- Juste Inscrit !
- Lieu: montpellier
- Date d'inscription: 29 Oct 2013
- Messages: 9
Re: MAPSERVER et openLayers : probleme superposition des cartes.
Il semblerai qu'il faille utiliser l'option "restrictedExtent" pour limiter le déplacement dans la carte, je vais creuser.
Hors ligne
Pages: 1
- Sujet précédent - MAPSERVER et openLayers : probleme superposition des cartes. - Sujet suivant