RSS

Insert or Update (upserts) avec SSIS

mardi 12 mai 2009


Il n'existe pas de composant permettant de réaliser des upserts avec SQL Server Integration Services.
Il existe cependant une méthode permettant de réaliser cette opération, certes coûteuse en terme de ressource, mais réalisable.

L'idée est d'utiliser un composant "Lookup" qui va aller vérifier l'existence de la clé dans une table.

On définit l'affichage des erreurs du composant à "réacheminer la ligne", on coche la case "clé primaire", et on trace la jointure entre les clés.

Sur la sortie d'erreur, il faut créer un composant OLEDB Insert classique, et sur la sortie standard, un composant OLEDB Command contenant une requête de type :

UPDATE ma_table SET champ1 = ?, champ2 = ?, champ3 = ? WHERE maclef = ?


Tracer ensuite les liens de mapping entre les champs.

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).

FreeAirport - Airtune à la portée de tous...

samedi 2 août 2008


Certaines personnes souhaitent en effet bénéficier d'Airtune sur une plateforme libre.

Airtune, kezako ?

Apple Airtune (©) permet de diffuser de la musique sur du matériel via une interface Wifi.

FreeAirport permet d'utiliser une Freebox (©) comme carte son distante avec une distribution Linux Ubuntu (testé sur une 7.10).

L'interface est similaire au Freeplayer (broadcast via VLC), à l'exception de la présence de plusieurs couches audio :

Alsa => PulseAudio => ESound => VLC + apache2 => Freebox



Il est ainsi possible de rediriger n'importe quel flux audio en streaming sur une Freebox.
Cela étant, le temps de latence (de l'ordre d'1 seconde) ne permet pas la visualisation d'une vidéo avec le son redirigé.
Le son est encodé en mp3 via ffmpeg et libmp3lame avant broadcast ; les paramètres sont réglables dans le script sh.

Note : Cet article a initialement été posté à l'adresse : http://forum.ubuntu-fr.org/viewtopic.php?pid=1969411

Pré-requis
Installation

Dans un premier temps, il est nécessaire d'installer quelques petites choses :

Esdmon
sudo apt-get install esd-utils
ffmpeg (version svn)
Le désinstaller si besoin :
sudo apt-get remove ffmpeg

Puis le réinstaller : choisir la méthode 'par compilation' qui est décrite dans le wiki ubuntu-fr : http://doc.ubuntu-fr.org/ffmpeg#par-compilation
En effet cela permettra d'installer la librairie libmp3lame.

Maintenant que tout est installé redémarrer la machine, il faut ouvrir le port 8080 pour apache2 :

sudo gedit /etc/apache2/ports.conf
Ajouter 'Listen 8080' en dessous de 'Listen 80'
Puis redémarrer apache2 :
sudo /etc/init.d/apache2 restart
Tout est prêt maintenant, il reste les scripts à implémenter (on suppose que la racine du serveur web apache2 se trouve dans /var/www, c'est à dire les paramètres par défaut).
Lancer un terminal :
$ wget http://seb.mizrahi.free.fr/freeairport/settings.html
$ mv setting.html /var/www
Le copier sur le bureau (à titre d'exemple) :
$ cd $HOME/Bureau
$ wget http://seb.mizrahi.free.fr/freeairport/FreeAirport.sh
$ chmod +x FreeAirport.sh
Il ne reste plus qu'à lancer le script :
$ ./FreeAirport.sh
Commandes

Quitter :
Presser les touches ctrl + c
Mise à jour automatique du script :
./FreeAirport.sh update