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 :

Ajouter projection IGNF à Géoserver (pour affichage WFS sur api géoportail)


Sujet :

IGN API Géoportail

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Ajouter projection IGNF à Géoserver (pour affichage WFS sur api géoportail)
    Bonjour à tous,

    Je reviens vers vous pour un nouveau problème :
    Je cherche à superposer des couches WFS provenant de Geoserver sur l'API géoportail ...

    J'essaye donc d'ajouter la référence "IGNF:GEOPORTALFXX" à Geoserver pour que mes couches n'ai pas besoins d'être reprojetées par le client.

    Normalement les ressources nécessaires sont ici : http://lambert93.ign.fr/index.php?id=30#c128
    Mais bien sur rien pour Géoserver, j'ai donc récupéré le WTK de la réf voulue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PROJCS["Geoportail - France metropolitaine",GEOGCS["Reseau géodésique francais 1993",DATUM["Reseau geodesique francais 1993",SPHEROID["IAG GRS 1980",6378137.0000,298.2572221010000,AUTHORITY["IGNF","ELG037"]],TOWGS84[0.0000,0.0000,0.0000,0,0,0,0],AUTHORITY["IGNF","REG024"]],PRIMEM["Greenwich",0.000000000,AUTHORITY["IGNF","LGO01"]],UNIT["degree",0.01745329251994330],AXIS["Longitude",EAST],AXIS["Latitude",NORTH],AUTHORITY["IGNF","RGF93G"]],PROJECTION["Equirectangular",AUTHORITY["IGNF","PRC9001"]],PARAMETER["semi_major",6378137.0000],PARAMETER["semi_minor",6378137.0000],PARAMETER["latitude_of_origin",0.000000000],PARAMETER["central_meridian",0.000000000],PARAMETER["standard_parallel_1",46.500000000],PARAMETER["false_easting",0.000],PARAMETER["false_northing",0.000],UNIT["metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["IGNF","GEOPORTALFXX"]]
    et je l'ai ajouté à "user_projections\epsg.properties"

    Extrait de mon epsg.properties :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    900913=PROJCS["WGS84 / Google Mercator", GEOGCS["WGS 84", DATUM["World Geodetic System 1984", SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AUTHORITY["EPSG","4326"]], PROJECTION["Mercator (1SP)", AUTHORITY["EPSG","9804"]], PARAMETER["semi_major", 6378137.0], PARAMETER["semi_minor", 6378137.0], PARAMETER["latitude_of_origin", 0.0], PARAMETER["central_meridian", 0.0], PARAMETER["scale_factor", 1.0], PARAMETER["false_easting", 0.0], PARAMETER["false_northing", 0.0], UNIT["m", 1.0],  AUTHORITY["EPSG","900913"]]
    6882=PROJCS["Geoportail - France metropolitaine",GEOGCS["Reseau geodesique francais 1993",DATUM["Reseau geodesique francais 1993",SPHEROID["IAG GRS 1980",6378137.0000,298.2572221010000,AUTHORITY["IGNF","ELG037"]],TOWGS84[0.0000,0.0000,0.0000,0,0,0,0],AUTHORITY["IGNF","REG024"]],PRIMEM["Greenwich",0.000000000,AUTHORITY["IGNF","LGO01"]],UNIT["degree",0.01745329251994330],AXIS["Longitude",EAST],AXIS["Latitude",NORTH],AUTHORITY["IGNF","RGF93G"]],PROJECTION["Equirectangular",AUTHORITY["IGNF","PRC9001"]],PARAMETER["semi_major",6378137.0000],PARAMETER["semi_minor",6378137.0000],PARAMETER["latitude_of_origin",0.000000000],PARAMETER["central_meridian",0.000000000],PARAMETER["standard_parallel_1",46.500000000],PARAMETER["false_easting",0.000],PARAMETER["false_northing",0.000],UNIT["metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["IGNF","GEOPORTALFXX"]]
    Je vois bien la nouvelle projection dans geoserver mais impossible de la sélectionner, j'ai un msg m'indiquant que je vais "quitter la page" et je tombe sur un log java (à priori)...

    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
    java.lang.NullPointerException
    	at org.geoserver.web.wicket.CRSPanel$4.onCodeClicked(CRSPanel.java:269)
    	at org.geoserver.web.wicket.SRSListPanel$2.onClick(SRSListPanel.java:119)
    	at org.geoserver.web.wicket.SimpleAjaxLink$1.onClick(SimpleAjaxLink.java:44)
    	at org.apache.wicket.ajax.markup.html.AjaxLink$1.onEvent(AjaxLink.java:65)
    	at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:163)
    	at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:297)
    	at org.apache.wicket.request.target.component.listener.BehaviorRequestTarget.processEvents(BehaviorRequestTarget.java:104)
    	at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:91)
    	at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1239)
    	at org.apache.wicket.RequestCycle.step(RequestCycle.java:1316)
    	at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1418)
    	at org.apache.wicket.RequestCycle.request(RequestCycle.java:532)
    	at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:356)
    	at org.apache.wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:124)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    	at org.springframework.web.servlet.mvc.ServletWrappingController.handleRequestInternal(ServletWrappingController.java:158)
    	at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
    	at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
    	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
    	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
    	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
    	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
    	at org.vfny.geoserver.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
    	at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
    	at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    	at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:124)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    	at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    	at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    	at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    	at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    	at org.acegisecurity.ui.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    	at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    	at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
    	at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    	at org.geoserver.filters.LoggingFilter.doFilter(LoggingFilter.java:73)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    	at org.geoserver.filters.ReverseProxyFilter.doFilter(ReverseProxyFilter.java:183)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    	at org.geoserver.filters.GZIPFilter.doFilter(GZIPFilter.java:41)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
    	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)
    	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    	at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)
    	at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.Server.handle(Server.java:324)
    	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:828)
    	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
    	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    	at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450)
    comment faire pour ajouter "proprement" cette projection à Géoserver ?
    dans le WTK il semble y avoir des références vers d'autres projections (..."AUTHORITY["IGNF","RGF93G"]]"...) faut-il les rajouter dans le epsg.properties également ?

    Merci d'avance...

  2. #2
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Pas de réponse...?

    Voilà ou j'en suis :

    J'ai essayé de rajouter manuellement les projection "IGNF" en utilisant les "user_projections", toutes les projections ajoutées marchent (par exemple IGNF:LAMB93) sauf les projections "IGNF:GEOPORTAL..."

    Je viens de me rendre compte le patch pour Mapserver pour ajouter les-dites projections a été développé par dgrichard !

    Savez vous si il existe un tel patch pour géoserver ? (je n'ai rien trouvé la-dessus...)

    Quelqu'un aurait-il des pistes pour m'aider dans ma recherche ?

  3. #3
    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
    Nous avons fait un patch pour Geoserver 1.6.3 qui comprend directement le registre IGNF.
    Malheureusement, les évolutions de Geoserver et de la GeoAPI ont fait que nous n'avons pas porté ce patch sur les versions qui ont suivies.

    En version 1.7.x de Geoserver, nous avons simplement écrit un filtre qui transforme les CRS entrants dans leur équivalent EPSG avec le danger des reprojections fausses (NTF vers RGF93 sans la grille d'interpolation bilinéaire).

    Nous sommes en discussion avec OpenGeo pour voir comment résoudre cela dans les versions 2.0.x à terme !

    Pour votre problème, il suffit que les WFS Geoserver émettent leurs données pour que l'API se chargent de faire les transformations idoines

    Je conseillerai seulement que les données source soit déjà en RGF93 (géographique ou autres) pour éviter les problèmes de reprojections côté API qui n'utilisent justement pas la fameuse grille

    Cf. l'exemple WFS en ligne.

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci dgrichard pour cette réponse !
    Cela me redonne un peu d'espoir ;-)

    En attendant un patch fontionnel pour la v2 je vais appliquer vos conseils :
    - mes données seront en Lambert 93 (ESPG:2154) pas de problème

    par contre on dirait qu'il manque un mot dans votre phrase non ...?

    Pour votre problème, il suffit que les WFS Geoserver émettent leurs données [...?] pour que l'API se chargent de faire les transformations idoines
    En quoi faut-il émettre les données ...? en EPSG:4326 ...? en ESPG:2154 ?

    Merci d'avance !

  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
    Citation Envoyé par Wraack Voir le message
    par contre on dirait qu'il manque un mot dans votre phrase non ...?
    non, il suffit que le flux soit ouvert

    Citation Envoyé par Wraack Voir le message
    En quoi faut-il émettre les données ...? en EPSG:4326 ...? en ESPG:2154 ?
    Peu importe, si c'est car le flux sera transformé dans la projection de la carte au final, par contre, un flux en géographique sera souvent plus utilisable sur d'autres plate-formes que l'API Géoportail ...

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci dgrichard, je progresse peu à peu...

    J'ai maintenant un problème un peut étrange...
    J'ai ajouté ma couche WFS en utilisant la synthaxe suivante :

    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
    var saveStrategy = new OpenLayers.Strategy.Save();
    				
    wfsF = new OpenLayers.Layer.Vector("Editable Features", {
    	strategies: [new OpenLayers.Strategy.BBOX(), saveStrategy],
    	projection: new OpenLayers.Projection("EPSG:2154"),
    	protocol: new OpenLayers.Protocol.WFS({
    		version: "1.0.0",
    		srsName: "EPSG:2154",
    		url: "http://192.168.3.85:8080/geoserver/wfs",
    		featureNS :  "http://192.168.3.85:8080/postgis",
    		featureType: "poly2154",
    		geometryName: "geom",
    		schema: "http://192.168.3.85:8080/geoserver/wfs/DescribeFeatureType?version=1.0.0&typename=postgis:poly2154"
    		})
    }); 
    			
    			
    OpenLayers.Format.WFS.prototype.layerName = 'postgis:poly2154';
    VISU.getMap().addLayer(wfsF);
    Afin d'utiliser le WFS-T

    Depuis l'api geoportail j'arrive bien a enregistrer de nouveaux polygones dans cette couche (nouvel enregistrement dans postgis, contours visible depuis Qgis) mais rien ne s'affiche sur l'api... je créé mes polygones en "aveugle"...

    La requête d'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <wfs:getfeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd http://192.168.3.85:8080/postgis http://192.168.3.85:8080/geoserver/wfs/DescribeFeatureType?version=1.0.0&amp;typename=postgis:poly2154" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <wfs:query typeName="feature:poly2154" xmlns:feature="http://192.168.3.85:8080/postgis">
    <ogc:filter xmlns:ogc="http://www.opengis.net/ogc">
    <ogc:bbox>
    <ogc:propertyname>geom</ogc:propertyname>
    <gml:box xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:2154">
    <gml:coordinates decimal="." cs="," ts=" ">-196794.69340390654,7020937.503549136 2006031.5692755543,9351837.158278557</gml:coordinates>
    </gml:box>
    </ogc:bbox>
    </ogc:filter>
    </wfs:query>
    </wfs:getfeature>
    La réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <wfs:featurecollection xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" xmlns:postgis="http://192.168.3.85:8080/postgis" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://192.168.3.85:8080/postgis http://192.168.3.85:8080/geoserver/wfs?service=WFS&amp;version=1.0.0&amp;request=DescribeFeatureType&amp;typeName=postgis%3Apoly2154 http://www.opengis.net/wfs http://192.168.3.85:8080/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd">
    <gml:boundedby>
    <gml:null>unknown</gml:null>
    </gml:boundedby>
    </wfs:featurecollection>
    On constate une erreur "unknown" ... Que veut-elle dire ...?
    J'ai vu que cela pouvait provenir d'un espace dans le typename mais ce n'est pas mon cas ...

    J'ai testé avec la synthaxe données dans l'exemple "sandre" et j'ai exactement la même réponse...

    De quoi cela peut-il provenir ? Comment se fait-il que les requêtes de création passent mais pas les requêtes d'affichage ??

    Merci d'avance de vos éclaircissements ...

  7. #7
    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
    Plusieurs petits détails :

    * l'espace de nom semble faux (feature:poly2154), je mettrai plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    featurePrefix:'postgis',
    featureNS:'http://192.168.3.85:8080/postgis',
    en enlevant schema des options

    * je rajouterai les options de reprojections pour l'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    geometryName:"geom",
    formatOptions:{
        internalProjection: VISU.getMap().getProjection().clone(),
        externalProjection: new OpenLayers.Projection('EPSG:2154')
    }
    Il est possible que cela ne soit pas suffisant, mais au moins on verra si tu reçois les données ... En effet, j'ai corrigé pas mal de petits bugs sur OpenLayers pour reprojeter à la volée en partant de la version 2.9 d'OpenLayers :

    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
                OpenLayers.Control.GetFeature.prototype.filterType= OpenLayers.Filter.Spatial.BBOX;
                OpenLayers.Control.GetFeature.prototype.EVENT_TYPES= [
                    "featureselected", "featuresselected", "featureunselected",
                    "clickout", "beforefeatureselected", "beforefeaturesselected",
                    "hoverfeature", "outfeature"];
                OpenLayers.Control.GetFeature.prototype.destroy= function () {
                    if (this.srs) {
                        this.srs.destroy();
                        this.srs= null;
                    }
                    OpenLayers.Control.prototype.destroy.apply(this,arguments);
                };
                OpenLayers.Control.GetFeature.prototype.selectBox= function(position) {
                    var bounds;
                    if (position instanceof OpenLayers.Bounds) {
                        var minXY = this.map.getLonLatFromPixel(
                            new OpenLayers.Pixel(position.left, position.bottom)
                        );
                        var maxXY = this.map.getLonLatFromPixel(
                            new OpenLayers.Pixel(position.right, position.top)
                        );
                        bounds = new OpenLayers.Bounds(
                            minXY.lon, minXY.lat, maxXY.lon, maxXY.lat
                        );
    
                    } else {
                        if(this.click) {
                            // box without extent - let the click handler take care of it
                            return;
                        }
                        bounds = this.pixelToBounds(position);
                    }
                    this.setModifiers(this.handlers.box.dragHandler.evt);
                    this.request(bounds);
                };
                OpenLayers.Control.GetFeature.prototype.request= function(bounds, options) {
                    options = options || {};
                    if (!this.srs && this.protocol.srsName && !this.map.getProjection().equals(this.protocol.srsName)) {
                        this.srs= new OpenLayers.Projection(this.protocol.srsName);
                    }
                    var filter = new OpenLayers.Filter.Spatial({
                        type: this.filterType,
                        value: this.srs? bounds.transform(this.map.getProjection(),this.srs) : bounds
                    });
    
                    var response = this.protocol.read({
                        maxFeatures: options.single == true ? this.maxFeatures : undefined,
                        filter: filter,
                        callback: function(result) {
                            if(result.success()) {
                                if(result.features.length) {
                                    if(options.single == true) {
                                        this.selectBestFeature(result.features,
                                            bounds.getCenterLonLat(), options);
                                    } else {
                                        this.select(result.features);
                                    }
                                } else if(options.hover) {
                                    this.hoverSelect();
                                } else {
                                    this.events.triggerEvent("clickout");
                                    if(this.clickout) {
                                        this.unselectAll();
                                    }
                                }
                            }
                            // Reset the cursor.
                            OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait");
                        },
                        scope: this
                    });
                    if(options.hover == true) {
                        this.hoverResponse = response;
                    }
                };
                OpenLayers.Control.GetFeature.prototype.select= function(features) {
                    if(!this.modifiers.multiple && !this.modifiers.toggle) {
                        this.unselectAll();
                    }
                    if(!(features instanceof Array)) {
                        features = [features];
                    }
    
                    var cont = this.events.triggerEvent("beforefeaturesselected", {
                        features: features
                    });
                    if(cont !== false) {
                        var selectedFeatures = [];
                        var feature;
                        for(var i=0, len=features.length; i<len; ++i) {
                            feature = features[i];
                            if(this.features[feature.fid || feature.id]) {
                                if(this.modifiers.toggle) {
                                    this.unselect(this.features[feature.fid || feature.id]);
                                }
                            } else {
                                cont = this.events.triggerEvent("beforefeatureselected", {
                                    feature: feature
                                });
                                if(cont !== false) {
                                    this.features[feature.fid || feature.id] = feature;
                                    selectedFeatures.push(feature);
    
                                    this.events.triggerEvent("featureselected",
                                        {feature: feature});
                                }
                            }
                        }
                        this.events.triggerEvent("featuresselected", {
                            features: selectedFeatures
                        });
                    }
                };
                OpenLayers.Format.GML.Base.prototype.readers.feature._typeName= function(node, obj) {
                    var container = {components: [], attributes: {}};
                    this.readChildNodes(node, container);
                    // look for common gml namespaced elements
                    if(container.name) {
                        container.attributes.name = container.name;
                    }
                    var feature = new OpenLayers.Feature.Vector(
                        container.components[0], container.attributes
                    );
                    if (!this.singleFeatureType) {
                        feature.type = node.nodeName.split(":").pop();
                        feature.namespace = node.namespaceURI;
                    }
                    var fid = node.getAttribute("fid") ||
                    this.getAttributeNS(node, this.namespaces["gml"], "id");
                    if(fid) {
                        feature.fid = fid;
                    }
                    if(this.internalProjection && this.externalProjection &&
                       feature.geometry) {
                        feature.geometry.transform(
                            this.externalProjection, this.internalProjection
                        );
                    }
                    if(container.bounds) {//IGNF: reproject bounds !!
                        feature.geometry.bounds = container.bounds;
                        if(this.internalProjection && this.externalProjection) {
                            feature.geometry.bounds.transform(
                                this.externalProjection, this.internalProjection
                            );
                        }
                    }
                    obj.features.push(feature);
                };
    Ces modifications feront partie d'une prochaine mise-à-jour de l'API ...

  8. #8
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci dgrichard pour ces indications,

    J'ai appliqué les 3 premières modif suggèrées : espace de nom corrigé, schema enlevé, option de reprojection d'affichage ajoutée

    et là miracle ma couche s'affiche !!! :-)
    Lorsque je créé mes polygones ils sont bien stocké dans la base postgis et se réaffichent bien a l'endroit voulu...

    Tout va bien .. enfin presque ^^

    en effet en voulant récupérer les données dans un sig je me suis rendu compte que les coordonnées stockées ressemblaient à
    1 065 278 , 8 260 709
    exemple de requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <wfs:transaction xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><wfs:insert><feature:poly2154 xmlns:feature="http://192.168.3.85:8080/postgis"><feature:geom><gml:polygon xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:2154"><gml:outerboundaryis><gml:linearring><gml:coordinates decimal="." cs="," ts=" ">1065278.3263659088,8260709.145127127 966856.4409522011,8104416.758771849 1105209.101675572,8054711.4215309825 1137683.6371401395,8198339.586581135 1065278.3263659088,8260709.145127127</gml:coordinates></gml:linearring></gml:outerboundaryis></gml:polygon></feature:geom><feature:texte>855</feature:texte></feature:poly2154></wfs:insert></wfs:transaction>
    hors ma base postgis est en Lambert 93... ces coordonnées devraient être en
    643 000 , 6 686 032
    donc en résumé mes coordonnées sont bien stockées mais en IGNF:GEOPORTAL et non pas en ESPG:2154 comme souhaité...

    Remarque intéressante, si je supprime les options de reprojection d'affichage
    les coordonnées partent bien en Lambert 93 mais ne s'affichent plus au bon endroit !!

    exemple de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <wfs:transaction xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><wfs:insert><feature:poly2154 xmlns:feature="http://192.168.3.85:8080/postgis"><feature:geom><gml:polygon xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:2154"><gml:outerboundaryis><gml:linearring><gml:coordinates decimal="." cs="," ts=" ">643358.890765069,6686032.3625821015 759335.0235186336,6604320.543252594 668940.3883627612,6550988.235948923 593284.7970482918,6596796.7956266925 643358.890765069,6686032.3625821015</gml:coordinates></gml:linearring></gml:outerboundaryis></gml:polygon></feature:geom><feature:texte>test</feature:texte></feature:poly2154></wfs:insert></wfs:transaction>
    bref j'ai un soucis quelque part dans les reprojections ...



    Mon code complet :
    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
    var saveStrategy = new OpenLayers.Strategy.Save();
    				
    				wfsF = new OpenLayers.Layer.Vector("Editable Features", {
    							styleMap: new OpenLayers.StyleMap({'default':{
    							strokeColor: "#FF0000",
    							strokeOpacity: 1,
    							strokeWidth: 3,
    							//fillColor: "#FF5500",
    							fillOpacity: 0,
    							pointRadius: 6,
    							pointerEvents: "visiblePainted",
    							label : "${texte}",
    							fontColor: "red",
    							fontSize: "12px",
    							fontFamily: "Courier New, monospace",
    							fontWeight: "bold",
    							labelAlign: "cm",
    							labelXOffset: 10,
    							labelYOffset: 10
    						}}),
    						strategies: [new OpenLayers.Strategy.BBOX(), saveStrategy],
    						projection: new OpenLayers.Projection("EPSG:2154"),
    						originators:[
    								{
    									logo:'sandre',
    									pictureUrl: 'cofogar.JPG',
    									url: 'http://www.cofogar.com/'
    								}
    							],
    						protocol: new OpenLayers.Protocol.WFS({
    							version: "1.0.0",
    							srsName: "EPSG:2154",
    							url: "http://192.168.3.85:8080/geoserver/wfs",
    							featureNS :  "http://192.168.3.85:8080/postgis",
    							featureType: "poly2154",
    							featurePrefix:'postgis',
    							featureNS:'http://192.168.3.85:8080/postgis',
    							geometryName: "geom",
    							formatOptions:{
    								internalProjection: VISU.getMap().getProjection().clone(),
    								externalProjection: new OpenLayers.Projection('EPSG:2154')
    							}
    
    						})
    						
    					}); 
    			
    			
    				OpenLayers.Format.WFS.prototype.layerName = 'postgis:poly2154';
    				VISU.getMap().addLayer(wfsF);
    Encore merci pour votre aide

  9. #9
    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
    Citation Envoyé par Wraack Voir le message
    donc en résumé mes coordonnées sont bien stockées mais en IGNF:GEOPORTAL et non pas en ESPG:2154 comme souhaité...
    Les options formatOptions{(internal|external)Projection} sont justement là pour cela :

    * externalProjection : lambert93 => l'insertion devrait s'effectuer dans ce système;

    Je soupconne un bug dans OpenLayers, mais il faut tracer toute la chaîne en amont de l'envoi (et entres autre les procédures d'écritures WFST) ...

    Citation Envoyé par Wraack Voir le message
    Remarque intéressante, si je supprime les options de reprojection d'affichage
    les coordonnées partent bien en Lambert 93 mais ne s'affichent plus au bon endroit !!
    Normal, tu reviens au point de départ : lecture en lambert93, mais superposition avec IGNF:GEOPORTALFXX impossible !)

    Citation Envoyé par Wraack Voir le message
    bref j'ai un soucis quelque part dans les reprojections ...
    Comme indiqué, il faut tracer la chaîne complète pour trouver pourquoi la reprojection IGNF:GEOPORTALFXX vers EPSG:2154 n'est pas prise en compte ...

  10. #10
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Ok merci pour ces indications ...

    J'avoue avancer un peu en aveugle sur ces problèmes de projection...
    Un indice pour savoir comment "tracer la chaîne complète" ...?

  11. #11
    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
    Citation Envoyé par Wraack Voir le message
    Ok merci pour ces indications ...

    J'avoue avancer un peu en aveugle sur ces problèmes de projection...
    Un indice pour savoir comment "tracer la chaîne complète" ...?
    Première piste : OpenLayers.Strategy.Save ...
    La méthode save() est sensée faire le travail correctement. Le mieux est de procéder comme suit avec un déboggueur Javascript.

    1/ Méthode pas-à-pas :

    copier le code source (OpenLayers/Géoportail) de la méthode dans la page à débogguer en "écrasant" la version de l'API :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NomCompletdelaClasseATester.prototype.fonctionATester= function(...) {...};
    L'en-tête et le corps de la méthode sont à recopier des sources OpenLayers/Géoportail

    Et de fils en aiguille et ajoute ces classes !

    2/ Avec les bibliothèques non compressées :

    en s'appuyant sur cet exemple, il faut publier en local les bibliothèques et les servir par un serveur HTTP. Cela permet en exécutant pas-à-pas de trouver plus rapidement.

    Pour ton problème, il faut cerner pourquoi la reprojection n'est pas effectuée, les classes à vérifier sont :

    -> OpenLayers.Strategy.Save;
    -> OpenLayers.Protocol.WFST;
    -> OpenLayers.Filter.Spatial;

    il peut bien sûr en avoir d'autres ...

  12. #12
    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
    J'ai pu avancer un peu sur le problème avec les nouveaux patch suivants :

    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
        /**
         * APIMethod: destroy
         * Clean up the strategy.
         */
        OpenLayers.Strategy.BBOX.prototype.destroy= function() {
            this.deactivate();
            if (this.srs) {//IGNF
                this.srs.destroy();
                this.srs= null;
            }
            this.layer = null;
            this.options = null;
        };
    
        /**
         * Method: calculateBounds
         * IGNF: BBOX reprojection added
         *
         * Parameters:
         * mapBounds - {<OpenLayers.Bounds>} the current map extent, will be
         *      retrieved from the map object if not provided
         */
        OpenLayers.Strategy.BBOX.prototype.calculateBounds= function(mapBounds) {
            if(!mapBounds) {
                //IGNF: reproject back to map's projection
                mapBounds = this.getMapBounds().transform(
                    this.layer.getNativeProjection(), this.layer.map.getProjection()
                );
            }
            var center = mapBounds.getCenterLonLat();
            var dataWidth = mapBounds.getWidth() * this.ratio;
            var dataHeight = mapBounds.getHeight() * this.ratio;
            this.bounds = new OpenLayers.Bounds(
                center.lon - (dataWidth / 2),
                center.lat - (dataHeight / 2),
                center.lon + (dataWidth / 2),
                center.lat + (dataHeight / 2)
            );
            //IGNF: reproject BBOX !
            if (!this.srs && this.layer.protocol.srsName && !this.layer.map.getProjection().equals(this.layer.protocol.srsName)) {
                this.srs= new OpenLayers.Projection(this.layer.protocol.srsName);
            }
            if (this.srs) {
                this.bounds.transform(this.layer.map.getProjection(), this.srs);
            }
        };
    
        /**
         * Method: createFilter
         *
         * Returns
         * {<OpenLayers.Filter>} The filter object.
         */
        OpenLayers.Strategy.BBOX.prototype.createFilter= function() {
            var filter= new OpenLayers.Filter.Spatial({
                type: OpenLayers.Filter.Spatial.BBOX,
                value: this.bounds,
                projection: (this.srs || this.layer.map.getProjection()).getCode() //IGNF:
            });
            if (this.layer.filter) {
                filter = new OpenLayers.Filter.Logical({
                    type: OpenLayers.Filter.Logical.AND,
                    filters: [this.layer.filter, filter]
                });
            }
            return filter;
        };
    
        /**
         * Method: triggerRead
         *      IGNF: test on event false return, trigger "loadend" on aborting.
         *
         * Returns:
         * {<OpenLayers.Protocol.Response>} The protocol response object
         *      returned by the layer protocol.
         */
        OpenLayers.Strategy.BBOX.prototype.triggerRead= function() {
            //IGNF:
            if (this.response) {
                this.layer.events.triggerEvent("loadend");
            }
            this.layer.protocol.abort(this.response);
            //IGNF:
            if (this.layer.events.triggerEvent("loadstart")===false) {
                return;
            }
            this.response = this.layer.protocol.read({
                filter: this.createFilter(),
                callback: this.merge,
                scope: this
            });
        };
    Le code de la page ressemble à (on est dans initGeoportalMap) :

    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
            ...
            var saveStrategy= new OpenLayers.Strategy.Save(
                // for debug :
                {
                    save:function(features) {
                        OpenLayers.Console.debug('saving ...');
                    }
                }
            );
            var vlayer= new OpenLayers.Layer.Vector('deps', {
                strategies: [new OpenLayers.Strategy.BBOX(), saveStrategy],
            var vlayer= new OpenLayers.Layer.Vector('deps', {
                strategies: [new OpenLayers.Strategy.BBOX(), saveStrategy],
                //projection: new OpenLayers.Projection('EPSG:4326'),//useless for vector layers as they are on-the-fly reprojected to map's projection
                protocol: new OpenLayers.Protocol.WFS({
                    version: '1.0.0',
                    srsName: 'EPSG:4326',//send BBOX filter in EPSG:4326
                    url: 'http://localhost:8080/geoserver/wfs',
                    featureNS: 'http://www.ign.fr/',
                    featureType: 'departement',
                    featurePrefix: 'ignf',
                    geometryName: 'the_geom',
                    formatOptions: {
                        internalProjection: viewer.getMap().getProjection().clone(),
                        externalProjection: new OpenLayers.Projection('EPSG:2154')//GML is in EPSG:2154 (native srs)
                    }
                })
            });
            viewer.getMap().addLayer(vlayer);
            ....
    Dans mon cas, j'utilise Geoserver pour afficher GéoFLA départements en Lambert93 côté serveur (l'affichage fonctionne nickel). Les reprojections s'effectuent à la volée côté client.

    Reste à voir si la sauvegarde envoie les données correctement en copiant le code de Strategy.save() dans la page

  13. #13
    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
    Mon GeoServer est trop récent!
    Caused by: org.opengis.referencing.NoSuchAuthorityCodeException: L'autorité "IGNF" n'est pas connue ou ne correspond pas aux indices spécifiés. Le fichier JAR qui la définie n'est peut-être pas accessible?
    at org.geotools.referencing.factory.ManyAuthoritiesFactory.noSuchAuthority(ManyAuthoritiesFactory.java:488)

  14. #14
    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
    Citation Envoyé par mga_geo Voir le message
    Mon GeoServer est trop récent!
    On avait fait un patch pour Geoserver 1.6.4 ...

    Il te faut donc éviter d'envoyer des "IGNF:" pour l'instant ...
    As-tu regarder le code exemple, il me semble que l'on est dans le même cas

Discussions similaires

  1. url pour JSON Out sur api.ign
    Par nicolas.h dans le forum IGN API Géoportail
    Réponses: 2
    Dernier message: 24/09/2012, 15h40
  2. Réponses: 0
    Dernier message: 21/08/2008, 06h04
  3. Problème de dimension pour affichage sur graph
    Par Marc29 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 17/06/2008, 10h55
  4. Click sur cellule pour affichage feuille
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/06/2008, 11h07
  5. Ajouter un second axe pour les abscisses sur un graphique
    Par developpeur82 dans le forum MATLAB
    Réponses: 4
    Dernier message: 02/04/2007, 15h22

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