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

GEODATA DAYS 2024

#1 Thu 14 October 2010 22:56

tiolebucheron
Participant actif
Lieu: Rouen
Date d'inscription: 26 Mar 2006
Messages: 147

Modification d'écriture

Bonjour

Sous Openlayer ou autre, existe-t-il une fonction pour transformer

Code:

MULTIPOLYGON(((377214.302977711 2446886.56088011,377182.33865765 2446904.66253807,377156.675547636 2446918.63976763,377114.972993864 2446942.46979836,377138.803024591 2446986.69283615,377148.999528123 2447003.763387,377139.948699145 2447012.81421598,376982.074745581 2447141.70260333,376957.0990403 2447154.19045597,376901.992094244 2447006.62757339,376974.055023701 2446936.74142559,376978.752289374 2446890.11247123,376979.66882

EN

Code:

<gml:MultiPolygon srsName="EPSG:4326">
           <gml:polygonMember>
              <gml:Polygon>
              <gml:outerBoundaryIs>
                 <gml:LinearRing>
                    <gml:coordinates>1.313216,46.690770 1.000968,46.861087 0.887424,47.059790 1.142899,47.244300 1.355795,47.244300 1.554498,47.017211 1.710622,47.059790 1.767394,46.747542 1.313216,46.690770 1.313216,46.690770 </gml:coordinates>
                  </gml:LinearRing>
                </gml:outerBoundaryIs>
              </gml:Polygon>
            </gml:polygonMember>
            <gml:polygonMember>
              <gml:Polygon>
                <gml:outerBoundaryIs>
                 <gml:LinearRing>

et inversement !!

Pouvez-vous m'indiquez les spécifications de ces deux syntaxes??

Merci de votre aide Tio

Hors ligne

 

#2 Fri 15 October 2010 09:38

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

Re: Modification d'écriture

Bonjour,

Tu peux regarder cette page d'exemple : http://dev.openlayers.org/releases/Open … rmats.html

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 Fri 15 October 2010 11:10

tiolebucheron
Participant actif
Lieu: Rouen
Date d'inscription: 26 Mar 2006
Messages: 147

Re: Modification d'écriture

Merci  Voici un example tout simple

Code:

    var out_options = {
                'internalProjection': map.baseLayer.projection,
                'externalProjection': map.baseLayer.projection
            };
            var gmlOptions = {
                featureType: "feature",
                featureNS: "http://example.com/feature"
            };

            var gmlOptionsOut = OpenLayers.Util.extend(
                OpenLayers.Util.extend({}, gmlOptions),
                out_options
            );
            formats = {
                wkt: new OpenLayers.Format.WKT(out_options),
                gml2: new OpenLayers.Format.GML.v2(gmlOptionsOut)

            };


console.log(formats);
feature=map.getLayersByName('outline')[0].features;
console.log(feature);
var str = formats['gml2'].write(feature,true);
console.log(str);

Il me reste qu'à faire le ménage pour récupérer la balise de la géometrie.

Merci Yves.

Hors ligne

 

#4 Mon 18 October 2010 10:14

tiolebucheron
Participant actif
Lieu: Rouen
Date d'inscription: 26 Mar 2006
Messages: 147

Re: Modification d'écriture

Bonjour

Je relance ce sujet pour deux problèmes :
1) Afin de récupérer uniquement le polygon j'ai fait ceci :

Code:

featureGML.substring(featureGML.indexOf('feature:geometry',0)+17,featureGML.indexOf('feature:geometry', featureGML.indexOf('feature:geometry',0)+1)-2);

Efficace mais pas orthodoxe. Je n'ai pas réussit à utiliser Openlayers.formats.XML

2) Ce cherche à récupérer le polygon avec des projection différentes (27582 et 2154)

Code:

map.getLayersByName('outline')[0].features[0].geometry.transform(new OpenLayers.Projection('EPSG:27572'),new OpenLayers.Projection('EPSG:27582'));

Ne fonctionne pas!! Je ne situe pas le problème.

Merci de votre aide Tio

Hors ligne

 

#5 Mon 18 October 2010 10:59

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

Re: Modification d'écriture

Bonjour,

Concernant le point 2 :

là tu as ta géométrie en WKT :

map.getLayersByName('outline')[0].features[0].geometry


Après il faut que tu te créés un objet Feature propre à OpenLayers que tu pourras reprojeter (le site d'openlayers est down je n'ai pas pu vérifier).

Je n'ai pas compris le point 1 wink

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 Mon 18 October 2010 11:08

tiolebucheron
Participant actif
Lieu: Rouen
Date d'inscription: 26 Mar 2006
Messages: 147

Re: Modification d'écriture

Re,
Ok pour le point 2.

pour le point 1 Dans le fomat GML, j'ai utilisé la chaîne de caractère pour récupérer la balise "feature:geometry". Il aurait été plus propre, je pense d'utiliser le XML!!! Non Qu'en penses-tu?

Tio.

Hors ligne

 

#7 Wed 20 October 2010 09:59

tiolebucheron
Participant actif
Lieu: Rouen
Date d'inscription: 26 Mar 2006
Messages: 147

Re: Modification d'écriture

Je rencontre toujours des problèmes. Quand je test les différentes étapes, cela fonctionne.

Quand je lance le script entièrement, j'ai l'erreur suivante : "geometry.clone().transform is not a function"
Je ne comprend pas l'erreur.

Merci de votre Aide

Tio

Code:

    
    var geom = new Array();
    var src = new Array(2154,27582);
    var out_options = {
     'internalProjection': map.baseLayer.projection,
     'externalProjection': map.baseLayer.projection
    };
    var gmlOptions = {
        featureType: "feature",
        featureNS: "http://example.com/feature"
    };
    var gmlOptionsOut = OpenLayers.Util.extend(
        OpenLayers.Util.extend({}, gmlOptions),
        out_options
    );
    var formats = {
        wkt: new OpenLayers.Format.WKT(out_options),
        gml2: new OpenLayers.Format.GML.v2(gmlOptionsOut)
    };
    
    for (i=0; i<map.getLayersByName('outline')[0].features.length; i++){
        geom[i]= new Array();
        geom[i]['wkt'] = map.getLayersByName('outline')[0].features[i].geometry;
        k=i;
        for(j=0; j<src.length; j++){
            var tmp = new OpenLayers.Feature.Vector(map.getLayersByName('outline')[0].features[k].geometry);
            tmp.geometry.transform(new OpenLayers.Projection(map.baseLayer.projection.projCode),new OpenLayers.Projection('EPSG:'+src[j]));
            var featureGML = formats['gml2'].write(new OpenLayers.Feature.Vector(tmp),true);
            geom[k]['gml'] = new Array();
            geom[k]['gml'][src[j]] = featureGML.substring(featureGML.indexOf('feature:geometry',0)+17,featureGML.indexOf('feature:geometry', featureGML.indexOf('feature:geometry',0)+1)-2);
        }
    }

Hors ligne

 

#8 Fri 22 October 2010 13:16

tiolebucheron
Participant actif
Lieu: Rouen
Date d'inscription: 26 Mar 2006
Messages: 147

Re: Modification d'écriture

Bonjour

Je viens de trouver l'erreur , il manquait une affectation à la variable

  tmp =         tmp.geometry.transform(new OpenLayers.Projection(map.baseLayer.projection.projCode),new OpenLayers.Projection('EPSG:'+src[j]));

Par contre, pouvez-vous m'expliquer ce résultat

Code:

console.log(map.getLayersByName('outline')[0].features[0].geometry);
var tmp = new OpenLayers.Feature.Vector(map.getLayersByName('outline')[0].features[0].geometry);
tmp = tmp.geometry.transform(new OpenLayers.Projection(map.baseLayer.projection.projCode),new OpenLayers.Projection('EPSG:2154'));
console.log(map.getLayersByName('outline')[0].features[0].geometry);

1=> 27572 POLYGON((452458.31904584 2520883.3001864,451752.76387129 2512769.415679,459161.09320412 2516649.969139,452458.31904584 2520883.3001864)) { id="OpenLayers.Geometry.Polygon_3014", more...}

2=> 2154 POLYGON((504638.10140192474 6955402.053690341,503865.8876504806 6947298.930498692,511301.8014213318 6951115.847015039,504638.10140192474 6955402.053690341)) {


Mon objet initial est map.getLayersByName('outline')[0].features[0].geometry.

Après transformation, via la variable tmp l'objet initial n'est pas identique.

Merci pour votre aide.
Tio

Hors ligne

 

#9 Mon 25 October 2010 08:58

tiolebucheron
Participant actif
Lieu: Rouen
Date d'inscription: 26 Mar 2006
Messages: 147

Re: Modification d'écriture

J'ai trouvé la solution.
Pour cela j'ai repasse le polygon initial en wkt avec openlayer format. Ensuite j'ai créé un nouveau polygon avec cette chaine.

Résolut

Hors ligne

 

#10 Mon 25 October 2010 16:11

tiolebucheron
Participant actif
Lieu: Rouen
Date d'inscription: 26 Mar 2006
Messages: 147

Re: Modification d'écriture

Bonjour

J'ai un problème que je comprend pas lors de la conversion de projection
tmp = tmp.geometry.transform(new OpenLayers.Projection(map.baseLayer.projection.projCode),new OpenLayers.Projection('EPSG:'+src[j]));

Cela fonctionne très bien pour la 27582, mais pas pour la 2154. il me modifier la coordonnées des points.

27582
POLYGON((518071.44534596906 2531717.0935387663,517041.33479111857 2532108.676660671,517750.4177415489 2532154.537746969,518480.66734720924 2532076.926677767,518071.44534596906 2531717.0935387663,518071.44534596906 2531717.0935387663)) { id="OpenLayers.Geometry.Polygon_5919", more...}
<gml:featureMember xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.opengis.net/gml http://schemas.opengis.net/gml/2.1.2/feature.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><feature:feature xmlns:feature="http://example.com/feature"><feature:geometry><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates decimal="." cs="," ts=" ">518071.44534596906,2531717.0935387663 517041.33479111857,2532108.676660671 517750.4177415489,2532154.537746969 518480.66734720924,2532076.926677767 518071.44534596906,2531717.0935387663</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></feature:geometry></feature:feature></gml:featureMember>
2154
POLYGON((570301.7796602645 6965685.096435715,569275.5397314288 6966085.018542743,569984.5830060684 6966124.952082867,570713.7528938007 6966041.310273165,570301.7796602645 6965685.096435715,570301.7796602645 6965685.096435715)) { id="OpenLayers.Geometry.Polygon_5894", more...}
<gml:featureMember xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.opengis.net/gml http://schemas.opengis.net/gml/2.1.2/feature.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><feature:feature xmlns:feature="http://example.com/feature"><feature:geometry><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates decimal="." cs="," ts=" ">570301.7796602645,6965685.096435715,43.78045410942286 569275.5397314288,6966085.018542743,43.789065099321306 569984.5830060684,6966124.952082867,43.78273188881576 570713.7528938007,6966041.310273165,43.7763734459877 570301.7796602645,6965685.096435715,43.78045410942286</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></feature:geometry></feature:feature></gml:featureMember>


voici les quelques lignes de code

Code:

  tmp = new OpenLayers.Feature.Vector(GeomFromWKT(formats['wkt'].write(map.getLayersByName('outline')[0].features[k])),true);
            tmp = tmp.geometry.transform(new OpenLayers.Projection(map.baseLayer.projection.projCode),new OpenLayers.Projection('EPSG:'+src[j]));
            featureGML = formats['gml2'].write(new OpenLayers.Feature.Vector(tmp));
            geom[k] = geom[k]+'"' + src[j] + '":"' + featureGML.substring(featureGML.indexOf('feature:geometry',0)+17,featureGML.indexOf('feature:geometry', featureGML.indexOf('feature:geometry',0)+1)-2).replace(/"/g,"\\\"").replace(/\//g,"\\/") + '",';

Merci de votre aide. J'avance mais pas vite

Tio

Hors ligne

 

#11 Thu 28 October 2010 11:24

tiolebucheron
Participant actif
Lieu: Rouen
Date d'inscription: 26 Mar 2006
Messages: 147

Re: Modification d'écriture

J'ai avancé dans le diagnostic du problème

Je crée un Vector en 27572
tmp = new OpenLayers.Feature.Vector(GeomFromWKT('POLYGON((473624.97428247717 2503420.8096146192,468333.3104733147 2481195.821616069,495144.40710643225 2488604.150948889,473624.97428247717 2503420.8096146192))'),true);
Je le transforme en 2154
tmp = tmp.geometry.transform(new OpenLayers.Projection(map.baseLayer.projection.projCode),new OpenLayers.Projection('EPSG:'+src[j]));

POLYGON((525647.2866382567 6937775.032845644,520174.83243102545 6915607.812195801,547030.399726584 6922789.120917389,525647.2866382567 6937775.032845644,525647.2866382567 6937775.032845644)) { id="OpenLayers.Geometry.Polygon_2925", more...}


Je fais la transcription en gml
featureGML = formats['gml2'].write(new OpenLayers.Feature.Vector(tmp));

"<gml:featureMember xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.opengis.net/gml http://schemas.opengis.net/gml/2.1.2/feature.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><feature:feature xmlns:feature="http://example.com/feature"><feature:geometry><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates decimal="." cs="," ts=" ">525647.2866382567,6937775.032845644,44.21614613290876 520174.83243102545,6915607.812195801,44.29253465030342 547030.399726584,6922789.120917389,44.039753519929945 525647.2866382567,6937775.032845644,44.21614613290876</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></feature:geometry></feature:feature></gml:featureMember>"


C'est au niveau de la transcription en gml qu'il y a un problème

Code:

var out_options = {
'internalProjection': map.baseLayer.projection,
'externalProjection': map.baseLayer.projection
};
var gmlOptions = {
featureType: "feature",
featureNS: "http://example.com/feature"
};
var gmlOptionsOut = OpenLayers.Util.extend(
OpenLayers.Util.extend({}, gmlOptions),
out_options
);
var formats = {
wkt: new OpenLayers.Format.WKT(out_options),
gml2: new OpenLayers.Format.GML.v2(gmlOptionsOut)
};

Ce code fonctionne avec la transcription GML en 27582.

Merci de votre Aide Tio

Hors ligne

 

Pied de page des forums

Powered by FluxBB