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 Tue 17 August 2010 10:57

chapo
Participant occasionnel
Date d'inscription: 23 Apr 2010
Messages: 14

Affichage du résultat d'une requête postgres/postgis sous MGE 2011

Bonjour à vous.

Je recherche de l'aide sur le problème suivant :

J'ai une base de données point de mesure (par exemple point de mesure, milieu de mesure, substance, date de mesure)

J'ai un formulaire classique dans lequel l'utilisateur entre les paramètres qui vont constituer une requête SQL dans ma bdd.

J'arrive a avoir mon résultat que j'aimerais afficher dans Mapguide. Les résultats sont du type id_pts / the_geom / valeur /substance.

J'ai essayé de voir les exemples 'create layer via dom' ou encore 'create new point layer definition' dans le guide de développement mais je lutte.

La première option me paraît mal adaptée à ma problématique (j'ai l'impression qu'on peut uniquement jouer sur les filtres) et j'ai du mal à mettre en œuvre la deuxième.

Pensez vous à d'autre option de création de layer dans mapguide à partir d'une telle requête ?

Aussi et quand j'aurais résolu ce premier pb (on sait jamais !) j'aimerais que l'utilisateur puisse afficher une thématique de son choix (comme le widget 'theme' de fusion). Y a t'il un équivalent dans un viewer Ajax ou cela nécessite du développement ?

(Vous me direz, suffirait de passer le tout dans fusion pour pouvoir bénéficier des widgets déjà existant, certes mais c'est pas évident de taper du code la dedans...)

Voila, merci d'avance !

Cordialement.
pc

Hors ligne

 

#2 Mon 30 August 2010 12:13

chapo
Participant occasionnel
Date d'inscription: 23 Apr 2010
Messages: 14

Re: Affichage du résultat d'une requête postgres/postgis sous MGE 2011

Reformulons, reformulons ...

J'essaye de créer un layer à partir d'une requête issue de postgis.
Mettons j'ai les champs suivants :
Name (String) / Mesure (Float) / the_geom (geometry)

Je veux afficher un nouveau layer 'point' avec les couches déjà existantes dans mon interface carto Mapguide.

Code:

// Create a feature class definition for the new feature source
    $classDefinition = new MgClassDefinition();
    $classDefinition->SetName("Point");
    $classDefinition->SetDescription("Point");
    $classDefinition->SetDefaultGeometryPropertyName("the_geom");
    
    // Create an identify property
    $identityProperty = new MgDataPropertyDefinition("KEY");
    $identityProperty->SetDataType(MgPropertyType::Int32);
    $identityProperty->SetAutoGeneration(true);
    $identityProperty->SetReadOnly(true);    
    // Add the identity property to the class definition
    $classDefinition->GetIdentityProperties()->Add($identityProperty);
    $classDefinition->GetProperties()->Add($identityProperty);
    
    // Create a name property
    $nameProperty = new MgDataPropertyDefinition("id_pts");
    $nameProperty->SetDataType(MgPropertyType::String);    
    // Add the name property to the class definition
    $classDefinition->GetProperties()->Add($nameProperty);
    
    // Create a measure property
    $measureProperty = new MgDataPropertyDefinition("measure");
    $measureProperty->SetDataType(MgPropertyType::Float);    
    // Add the name property to the class definition
    $classDefinition->GetProperties()->Add($measureProperty);
    
    // Create a geometry property
    $geometryProperty = new MgGeometricPropertyDefinition("the_geom");
    $geometryProperty->SetGeometryTypes(MgFeatureGeometricType::Point);    
    // Add the geometry property to the class definition
    $classDefinition->GetProperties()->Add($geometryProperty);
    
    // Create a feature schema
    $featureSchema = new MgFeatureSchema("PointSchema", "Point schema");
    // Add the feature schema to the class definition
    $featureSchema->GetClasses()->Add($classDefinition);             
    
    // Create the feature source
    $featureSourceName = 'Library://RSE/points.FeatureSource'; 
    $resourceIdentifier = new MgResourceIdentifier($featureSourceName);
    $srs = $map->GetMapSRS();
    $sdfParams = new MgCreateSdfParams("ArbitraryXY", $srs, $featureSchema);
// a priori il faut changer qq chose ici mais ...je ne sais pas quoi...
    $featureService->CreateFeatureSource($resourceIdentifier, $sdfParams);
    
    // We need to add some data to the sdf before using it.  The spatial context
    // reader must have an extent.
    $batchPropertyCollection = new MgBatchPropertyCollection();
    $wktReaderWriter = new MgWktReaderWriter();
    $agfReaderWriter = new MgAgfReaderWriter();
    $geometryFactory = new MgGeometryFactory();

    // Make a point     
    $propertyCollection = ("Point A", 0.15, 01010000206A080000CAC9FA6B3C9129418E2E7FC632475841);
    $batchPropertyCollection->Add($propertyCollection);
    unset($propertyCollection);    
    
        
    // Add the batch property collection to the feature source
    $cmd = new MgInsertFeatures("Point", $batchPropertyCollection); 
    $featureCommandCollection = new MgFeatureCommandCollection();
    $featureCommandCollection->Add($cmd);
    
    // Execute the "add" commands
    $featureService->UpdateFeatures($resourceIdentifier, $featureCommandCollection, false);

Si vous avez des pistes, je suis preneur !
Merci.
Cdt.

Hors ligne

 

#3 Mon 30 August 2010 17:29

Gwenael Bachelot
Participant assidu
Lieu: Bureau Autodesk : Paris 12ème
Date d'inscription: 5 Sep 2005
Messages: 608
Site web

Re: Affichage du résultat d'une requête postgres/postgis sous MGE 2011

Bonjour,
Je ne suis pas certain de comprendre...
Si vous utilisiez le fournisseur FDO pour PostGIS, vous pourriez :
- ajouter à la carte les données PostGIS résultant d'une requête (sans avoir à créer des points)
- appliquer ensuite des symbologies standards

Cordialement,
Gwenael Bachelot

Hors ligne

 

#4 Mon 30 August 2010 17:58

chapo
Participant occasionnel
Date d'inscription: 23 Apr 2010
Messages: 14

Re: Affichage du résultat d'une requête postgres/postgis sous MGE 2011

Désolé, je me suis mal expliqué.


En fait je veux que l'utilisateur puisse interroger une chronique de mesure à travers un formulaire (en entrant un milieu de mesure, la substance qui l'intéresse, la date de début et la date de fin).
Ce formulaire interroge une base postgis et renvoie les identifiants de mes points de mesure et la valeur moyenne (ou max ou autre) de ma chronique de mesure.
Je voudrais appliquer une symbologie sous forme de taille de symbole proportionnelle à la valeur moyenne de mes mesures et afficher le résultat dans un layer temporaire de Mapguide (un peu comme le module 'geostat' de Mapfish).

Donc effectivement comme vous le dites, je n'ai pas à créer de points, j'ai 'juste' à programmer une jointure entre ma géométrie de point et le résultat de ma requête postgis - c'est déjà un élément de réponse !

Je vais creuser dans cette direction.
Merci.

Hors ligne

 

#5 Tue 31 August 2010 10:17

chapo
Participant occasionnel
Date d'inscription: 23 Apr 2010
Messages: 14

Re: Affichage du résultat d'une requête postgres/postgis sous MGE 2011

Étonnant...

je n'arrive pas à faire de jointures avec MGE...
Je voudrais joindre ma table point à une table issue d'une requête toutes les deux localisées dans une base de données Postgres/Postgis (je précise que je peux visualiser ma table point sans problème dans mon interface carto et ma table issue de ma requête apparaît dans la liste des tables dans MGE ).
Je fais le lien sur un champ commun d'identifiant des points. Mais la table issue de ma jointure n'apparait pas dans la liste de classes d'objets de calques...

En voyant ce topic http://georezo.net/forum/viewtopic.php?pid=161952 (sous Oracle certes mais bon...) j'ai inséré dans le résultat issu de ma requête un Serial que j'ai déclaré en clef primaire, j'ai essayé sans clef primaire, avec / sans / avec !! - la jointure n'apparaît toujours pas...

Je me plante qq part ?? Que fais-je de travers ??

Merci du feedback !
Bien cdt.

Hors ligne

 

#6 Tue 31 August 2010 15:41

Gwenael Bachelot
Participant assidu
Lieu: Bureau Autodesk : Paris 12ème
Date d'inscription: 5 Sep 2005
Messages: 608
Site web

Re: Affichage du résultat d'une requête postgres/postgis sous MGE 2011

Bonjour,

chapo a écrit:

Ce formulaire interroge une base postgis et renvoie les identifiants de mes points de mesure et la valeur moyenne (ou max ou autre) de ma chronique de mesure.
Je voudrais appliquer une symbologie sous forme de taille de symbole proportionnelle à la valeur moyenne de mes mesures et afficher le résultat dans un layer temporaire de Mapguide (un peu comme le module 'geostat' de Mapfish).

Donc effectivement comme vous le dites, je n'ai pas à créer de points, j'ai 'juste' à programmer une jointure entre ma géométrie de point et le résultat de ma requête postgis - c'est déjà un élément de réponse !


Je dirais plutôt :
- l'utilisateur saisi ses critères dans un formulaire
- MapGuide ajoute à la carte courante un layer issu de PostGIS, avec le filtre défini par l'utilisateur.

Du coup, pas de jointure à faire...

Cordialement
Gwenael Bachelot
Autodesk

Hors ligne

 

#7 Tue 31 August 2010 18:04

chapo
Participant occasionnel
Date d'inscription: 23 Apr 2010
Messages: 14

Re: Affichage du résultat d'une requête postgres/postgis sous MGE 2011

Merci pour la réponse.

Mais dans ce cas m'est-il possible de calculer la valeur moyenne ou la valeur max de ma chronique de mesure ?

Je m'explique :

la base de données 'mesures' contient plus de 200 000 enregistrements depuis disons 2005. C'est de la surveillance environnementale donc sur un même point on peut avoir qq milliers de mesures depuis 2005.

L'utilisateur choisit de représenter les concentration du C14 dans le sol depuis jan-2009 à dec-2009 (par exemple). Il ne veut pas toutes les données de jan à dec (ce serait illisible), il veut juste la valeur moyenne ou la valeur max de cette période.

La requête sql est du genre

Code:

SELECT id_pts, the_geom, moy(valeur) as moy, max(valeur) as max FROM mesures WHERE substance LIKE 'C14' AND date_mesure > 'jan-2009' AND date_mesure < 'dec-2009'

(en simplifié).

L'objectif serait donc de traduire la requête sql en un filtre sous Mapguide et ensuite modifier le fichier xml par le formulaire (comme l'exemple create_layer_via_dom). Filtrer sur les dates : ok, filtrer sur les substances : ok mais obtenir la valeur moyenne et la valeur max de ma chronique....j'ai pas vu d'exemples...

Ma question est donc la suivante : est-ce faisable ?

Merci !

Bien cdt.

Dernière modification par chapo (Tue 31 August 2010 18:05)

Hors ligne

 

#8 Wed 01 September 2010 09:56

Gwenael Bachelot
Participant assidu
Lieu: Bureau Autodesk : Paris 12ème
Date d'inscription: 5 Sep 2005
Messages: 608
Site web

Re: Affichage du résultat d'une requête postgres/postgis sous MGE 2011

Bonjour,

chapo a écrit:

L'objectif serait donc de traduire la requête sql en un filtre sous Mapguide et ensuite modifier le fichier xml par le formulaire (comme l'exemple create_layer_via_dom). Filtrer sur les dates : ok, filtrer sur les substances : ok mais obtenir la valeur moyenne et la valeur max de ma chronique....j'ai pas vu d'exemples...

Ma question est donc la suivante : est-ce faisable ?


Dans ce cas, je vous suggère de créer dynamiquement une vue dans PostGIS, puis d'ajouter cette vue dans la carte courante.
Il faudra trouver un moyen de supprimer les vues régulièrement, mais cela ne devrait pas poser de problème.

Cordialement,
Gwenael Bachelot
Autodesk

Hors ligne

 

#9 Wed 01 September 2010 10:34

chapo
Participant occasionnel
Date d'inscription: 23 Apr 2010
Messages: 14

Re: Affichage du résultat d'une requête postgres/postgis sous MGE 2011

Merci pour la réponse.

Je vois deux solutions :

1/ créer un layer avec le résultat de la requête Postgis - mais du coup je suis confronté aux problèmes de mon deuxième post (create_layer_from_point_definition)

2/ faire une jointure entre la géométrie de mes points et une table postgis qui serait elle dynamique issue du résultat de ma requête sql de mon formulaire - mais je suis confronté à mon problème de jointure qui n'apparaît pas dans la liste des calques...

Deux solutions ... avec deux problèmes...aie aie...

Aydua !

Cdt.

Hors ligne

 

#10 Thu 02 September 2010 09:00

Gwenael Bachelot
Participant assidu
Lieu: Bureau Autodesk : Paris 12ème
Date d'inscription: 5 Sep 2005
Messages: 608
Site web

Re: Affichage du résultat d'une requête postgres/postgis sous MGE 2011

Bonjour,

chapo a écrit:

1/ créer un layer avec le résultat de la requête Postgis - mais du coup je suis confronté aux problèmes de mon deuxième post (create_layer_from_point_definition)


C'est pourtant la bonne piste. Je vous recommande de commencer par un programme qui ajoute un Layer déjà existant dans votre référentiel MapGuide.

chapo a écrit:

2/ faire une jointure entre la géométrie de mes points et une table postgis qui serait elle dynamique issue du résultat de ma requête sql de mon formulaire - mais je suis confronté à mon problème de jointure qui n'apparaît pas dans la liste des calques...


Oui, mais dans ce cas, c'est MapGuide qui ferait la jointure. Et une base de données est sans aucun doute meilleure pour cette tâche.

Cordialement,
Gwenael Bachelot
Autodesk

Hors ligne

 

#11 Thu 16 September 2010 17:56

chapo
Participant occasionnel
Date d'inscription: 23 Apr 2010
Messages: 14

Re: Affichage du résultat d'une requête postgres/postgis sous MGE 2011

Bonjour !

J'essaye encore de créer des points avec l'exemple create_point_layer_definition (l'exemple que j'ai placé plus haut dans mon premier post) du package PHP sheboyan mais je me heurte à un problème.

L'exemple 'create_layer_via_dom' marche bien, j'obtiens les couches des parcelles récentes en jaune, le filtre est modifié, tout va bien.
Par contre les exemples 'create_new_line_layer', 'create_newsquarefootage_layer_definition' et 'create_point_layer_definition' ne donnent rien comme résultats.

Pour l'exemple create_point_layer_definition, la resource 'Points' apparait dans Studio mais pas dans mon mapframe...

Par conséquent lorsque j'essaye de faire mon propre layer avec cet exemple (create_point_layer_definition) j'arrive à créer la resource .sdf que je visualise dans studio avec la bonne géométrie, la mesure associée (ici j'ai juste NOM, MESURE, GEOM) mais elle n'apparait pas dans le mapframe.

C'est comme si le code ne tenait pas en compte des parties qui correspondent à - 'Create a new layer' en utilisant les fonctions de LayerDefinitionFactory.php et à 'Add the layer to the map' qui utilise les fonctions de layer_function.php.

Pourtant j'ai vérifier les chemins d'appel aux fichiers et ca colle bien...

Avez vous déjà rencontré ce problème ?
Je vous joins un fichier image qui correspond à la structuration de mes fichiers peut être c'est ce qui ne marche pas...et le code PHP...

Si vous avez une idée, je suis preneur !

Merci d'avance !

Code:

   
    //---------------------------------------------------//
    // Create a feature source with point data.
    // (The Sheboygan sample data does not contain such data,
    // so we'll create it.)
    
    // Create a feature class definition for the new feature source
    $classDefinition = new MgClassDefinition();
    $classDefinition->SetName("Points");
    $classDefinition->SetDescription("Points");
    $classDefinition->SetDefaultGeometryPropertyName("GEOM");
    
    // Create an identify property
    $identityProperty = new MgDataPropertyDefinition("KEY");
    $identityProperty->SetDataType(MgPropertyType::Int32);
    $identityProperty->SetAutoGeneration(true);
    $identityProperty->SetReadOnly(true);    
    // Add the identity property to the class definition
    $classDefinition->GetIdentityProperties()->Add($identityProperty);
    $classDefinition->GetProperties()->Add($identityProperty);
    
    // Create a name property
    $nameProperty = new MgDataPropertyDefinition("NAME");
    $nameProperty->SetDataType(MgPropertyType::String);    
    // Add the name property to the class definition
    $classDefinition->GetProperties()->Add($nameProperty);
    
        // Create a measure property
    $measureProperty = new MgDataPropertyDefinition("MEASURE");
    $measureProperty->SetDataType(MgPropertyType::Double);    
    // Add the name property to the class definition
    $classDefinition->GetProperties()->Add($measureProperty);
    
    // Create a geometry property
    $geometryProperty = new MgGeometricPropertyDefinition("GEOM");
    $geometryProperty->SetGeometryTypes(MgFeatureGeometricType::Point);    
    // Add the geometry property to the class definition
    $classDefinition->GetProperties()->Add($geometryProperty);
    
    // Create a feature schema
    $featureSchema = new MgFeatureSchema("PointSchema", "Point schema");
    // Add the feature schema to the class definition
    $featureSchema->GetClasses()->Add($classDefinition);             
    
    // Create the feature source
    $featureSourceName = 'Library://Analyse_RSE/Points.FeatureSource'; 
    $resourceIdentifier = new MgResourceIdentifier($featureSourceName);
    $srs = $map->GetMapSRS();
    $sdfParams = new MgCreateSdfParams("ArbitraryXY", $srs, $featureSchema);
    $featureService->CreateFeatureSource($resourceIdentifier, $sdfParams);
    
    // We need to add some data to the sdf before using it.  The spatial context
    // reader must have an extent.
    $batchPropertyCollection = new MgBatchPropertyCollection();
    $wktReaderWriter = new MgWktReaderWriter();
    $agfReaderWriter = new MgAgfReaderWriter();
    $geometryFactory = new MgGeometryFactory();

    // Make four points     
    $propertyCollection = MakePoint("Point A", 5.2, "POINT(838005 6355540)");
    $batchPropertyCollection->Add($propertyCollection);
    unset($propertyCollection);    
    
    $propertyCollection = MakePoint( "Point B", 9.6, "POINT(838350 6355590)");
    $batchPropertyCollection->Add($propertyCollection);
    unset($propertyCollection);    
            
        
    // Add the batch property collection to the feature source
    $cmd = new MgInsertFeatures("Points", $batchPropertyCollection); 
    $featureCommandCollection = new MgFeatureCommandCollection();
    $featureCommandCollection->Add($cmd);
    
    // Execute the "add" commands
    $featureService->UpdateFeatures($resourceIdentifier, $featureCommandCollection, false);    
    
    // ... 
    //---------------------------------------------------//
    // Create a new layer - à partir de là c'est comme si le code n'était pas pris en compte
    
    $factory = new LayerDefinitionFactory();
    // Create a mark symbol
    $resourceId = "Library://Analyse_RSE/BasicSymbols.SymbolLibrary";
    $symbolName = "cube";
    $width = "24";  // unit = points
    $height = "24"; // unit = points
    $color = "FFFF0000";
    $markSymbol = $factory->CreateMarkSymbol($resourceId, 
      $symbolName, $width, $height, $color);   
    
    // Create a text symbol
    $text = "ID";
    $fontHeight="12";
    $foregroundColor = "FF000000";
    $textSymbol = $factory->CreateTextSymbol($text, 
      $fontHeight, $foregroundColor);

    // Create a point rule.
    $legendLabel = "trees";
    $filter = "";
    $pointRule = $factory->CreatePointRule($legendLabel, 
      $filter, $textSymbol, $markSymbol);
      
    // Create a point type style.
    $pointTypeStyle = $factory->
      CreatePointTypeStyle($pointRule);
      
    // Create a scale range.
    $minScale = "0";
    $maxScale = "1000000000000";
    $pointScaleRange = $factory->CreateScaleRange(
      $minScale, $maxScale, $pointTypeStyle);      

    // Create the layer definiton.
   $featureName = "PointSchema:Points";
    $geometry = "GEOM";
    $layerDefinition = $factory->
        CreateLayerDefinition($featureClass, $featureName,
        $geometry, $pointScaleRange);
        
    //---------------------------------------------------//
    // ...
    // Add the layer to the map - je n'ai pas ajout de cette couche 'Points' dans mon map..
    
    $newLayer = add_layer_definition_to_map($layerDefinition, "Points", "Points", $sessionId, $resourceService, $map);
    add_layer_to_group($newLayer, "Nouveau", "Nouveau", $map);

    // --------------------------------------------------//
    // Turn on the visibility of this layer.
    // (If the layer does not already exist in the map, it will be visible by default when it is added.
    // But if the user has already run this script, he or she may have set the layer to be invisible.)
    $layerCollection = $map->GetLayers();
    if ($layerCollection->Contains("Points"))
    {
        $pointsLayer =$layerCollection->GetItem("Points");
        $pointsLayer->SetVisible(true);
    }
    
    //---------------------------------------------------//
    //  Save the map back to the session repository
    $sessionIdName = "Session:$sessionId//$mapName.Map";
    $sessionResourceID = new MgResourceIdentifier($sessionIdName);
    $sessionResourceID->Validate();
    $map->Save($resourceService, $sessionResourceID);

    //---------------------------------------------------//
}
catch (MgException $e)
{
    echo "<script language=\"javascript\" type=\"text/javascript\"> \n";
    echo "    alert(\" " . $e->GetExceptionMessage() . " \"); \n";
    echo "</script> \n";
}

///////////////////////////////////////////////////////////////////////////////////
function MakePoint($name, $measure, $the_geom)
{    
    $propertyCollection = new MgPropertyCollection();
    $nameProperty = new MgStringProperty("NAME", $name);
    $propertyCollection->Add($nameProperty);
    
    $measureProperty = new MgDoubleProperty("MEASURE", $measure);
    $propertyCollection->Add($measureProperty);

    $wktReaderWriter = new MgWktReaderWriter();
    $agfReaderWriter = new MgAgfReaderWriter();    
    
    $geometry = $wktReaderWriter->Read($the_geom); 
    $geometryByteReader = $agfReaderWriter->Write($geometry); 
    $geometryProperty = new MgGeometryProperty("GEOM", $geometryByteReader);
    $propertyCollection->Add($geometryProperty);
    
    return $propertyCollection;
}
?>

Dernière modification par chapo (Thu 16 September 2010 18:06)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

Pied de page des forums

Powered by FluxBB