RSS

Connexion entre MapServer et ArcSDE

mardi 9 septembre 2008

Il n'est pas forcément évident d'afficher ses données MapServer provenant d'ArcSDE. En effet, la méthode décrite sur l'éditeur de MapServeur est souvent fastidieuse et difficile à réaliser.
Cependant, il est très facile de connecter ces deux logiciels, voici la méthode (sous MS Windows) :

  1. Installer MapServer (lien)
  2. Télécharger le SDK ArcSDE (lien)
  3. Décompresser les DLL de l'archive dans C:\ms4w\Apache\cgi-bin
  4. Déplacer les DLL gdal_SDE.dll et ogr_SDE.dll (C:\ms4w\gdalplugins\ignored\sde-X.X ou X.X correspond à la version ArcSDE) dans C:\ms4w\gdalplugins
  5. Redémarrer le serveur Apache
Dans le fichier map, remplacer DATA "mon_fichier_shp" du layer par le code suivant (en remplaçant les variables) :

CONNECTIONTYPE PLUGIN
PLUGIN "c:/ms4w/Apache/specialplugins/msplugin_sde_92.dll"
# Changer les valeurs ci-dessous SERVEUR_ARCSDE, BASE, UTILISATEUR et MOTDEPASSE
# par vos identifiants de connexion à ARCSDE
CONNECTION "SERVEUR_ARCSDE,port:5151,BASE,UTILISATEUR,MOTDEPASSE"
PROCESSING "CLOSE_CONNECTION=DEFER"
# Changer les valeurs ci-dessous SCHEMA, NOM_DE_TABLE, SHAPE
# par les donnees d'acces a ArcSDE
DATA "SCHEMA.NOM_DE_TABLE,SHAPE,SDE.DEFAULT"
# La methode suivante est facultative
# Changer les valeurs ci-dessous CONDITION
# par les filtres de clause where
FILTER "where CONDITION"

Convertir des données SIG avec PHP

Cette fonction permet de convertir des données géographiques Lambert II étendu en WGS84 avec le langage PHP.
Le code a été réadapté à partir d'un site (initialement en javascript) ; mais je ne me souviens plus de l'URL, donc si l'auteur se reconnaît merci de m'envoyer un message afin que je puisse ajouter son nom.

/**
* Fonction de conversion de coordonnees au format Lambert 2 etendu vers WGS84
*
* @param $valX Longitude au format l2e (de type XXX.XXX)
* @param $valY Latitude au format l2e (de type YYYY.YYY)
*
* @return tableau (de deux dimensions) contenant les valeurs transformees
* - Longitude (numerique)
* - Latitude (numerique)
*/

function conversionLambert2eVersWGS84($valX, $valY)
{
// Definition des constantes
$Xs = 600000;
$Ys = 6199695.769;
$n = 0.7289686274;
$C = 11745793.39;
$e = 0.08248325676;
$delta = 0.040792344;
$PI = 3.14159265358979323846264338327950288419716939937510;
$ret = array();

// Calcul de la latitude
$X = ($valX) * 1000;
$Y = ($valY - 2000 ) * 1000;

$R = sqrt(pow($X - $Xs,2) + pow($Y - $Ys,2));
$G = atan(($X - $Xs) / ($Ys - $Y));
$longitude = $delta + $G / $n;
$lambert = -1 / $n * log(abs($R / $C));

$temp = abs($longitude / $PI * 180);
// Format NTF
$degres = floor($temp);
$minutes = floor( ($temp - $degres) * 60);
$secondes = round(($temp - $degres - $minutes / 60) * 3600);

// Format WGS84
$ret[1] = round(($degres + ($minutes/60) + ($secondes/3600)), 5);

if (!($temp > 0)) {
$ret[1] *= -1;
}

// Calcul de la longitude
$P = 42 / 180 * $PI;
$F = 0; $Q = 0; $V = 0; $O = 0;
while(abs($V-$P) > 0.00000000000001)
{
$F = $P;
$O = $lambert - (0.5 * log( (1+sin($F)) / (1-sin($F))) - $e / 2 * log( (1.0 + ($e * sin($F))) / (1.0 - ($e * sin($F)))));
$F = $P + 0.0001;
$Q = $lambert - (0.5 * log( (1+sin($F)) / (1-sin($F))) - $e / 2 * log( (1.0 + ($e * sin($F))) / (1.0 - ($e * sin($F)))));
$V = $P;
$P = $P - 0.0001 * $O / ($Q - $O);
}

$temp = abs($P / $PI * 180);
// Format NTF
$degres = floor($temp);
$minutes = floor( ($temp - $degres) * 60);
$secondes = round(($temp - $degres - $minutes / 60) * 3600);

// Format WGS84
$ret[0] = round(($degres + ($minutes/60) + ($secondes/3600)), 5);

if (!($temp > 0)) {
$ret[0] *= -1;
}

return $ret;
}
Cette fonction renvoie un tableau de type (x, y).