Ce matin, la nouvelle version de PostGIS 1.4.1 a été annoncée par Paul Ramsey, le lien pour télécharger cette version est ici.
La version 1.4.1 de PostGIS est maintenant disponible. C'est une version mineure qui permet de résoudre certain problèmes rencontrés depuis la version 1.4.0.
- #241, problème avec
ST_LineCrossingDirection
- #210, erreur de segmentation dans
ST_Union
pour les valeurs NULLs
- #277, problème lors de l'utilisation de grandes valeurs numériques en entrée
- #179,
ST_MakeLine
crash coté serveur avec des valeurs NULL
- #253, resultat inconsistents lors de l'utilisation de l'opérateur
~=
- #276,
ST_AsGML
produisant des chaînes GML non compatibles
- #239, problème mémoire avec les fonctions
ST_As*
- #272,
ST_LineCrossingDirection
- #316, problème de récupération des géométries invalides avec une plus grande dimension
Posted in 2 commentaires | 5578 lectures
Posté par djay le 17 Décembre, 2009 - 13:22.
La liste des présentations acceptées par le comité de sélection du prochain FOSS4G qui se tiendra à Sydney a été publiée aujourd'hui. Une quantité impressionnante de présentations a été proposée cette année, plus de 183 présentations pour seulement 85 sélectionnées, sans compter les 52 articles scientifiques proposés dont seulement 12 ont été retenus.
Au passage, cous constaterez sans doute que bon nombre de présentations mentionnent l'utilisation de PostGIS dans les solutions développées et qui seront présentées lors du FOSS4G 2009.
Autre point qui me semble important : le retour du grand Paul Ramsey à cette conférence pour la présentation intitulée The State of PostGIS, il sera aussi responsable de workshop mais ce n'est pas le sujet ici...
Posted in 2 commentaires | 4284 lectures
Posté par djay le 20 Juillet, 2009 - 11:50.
Lors de migration de vos serveur de bases de données PostgreSQL vers une version 8.3, un problème survient avec les versions de MapServer mises à disposition dans MS4W. Pour une couche de type PostGIS, vous obtenez en effet une message d'erreur du type :
Warning: [MapServer Error]: msDrawMap(): Failed to draw layer named 'layer1'. in D:\MapJaxDist\ms4w\apps\mapjax\interface\gestion\update\index.php on line 297
Warning: [MapServer Error]: prepare_database(): Error declaring cursor: ERROR: current transaction is aborted, commands ignored until end of transaction block With query string: DECLARE mycursor BINARY CURSOR FOR SELECT asbinary(force_collection(force_2d(wkb_geometry)),'NDR'),OID::text from septolis_departements_l93 WHERE wkb_geometry && setSRID('BOX3D(-109363.162923348 5996601,1450962.16291935 7163567)'::BOX3D, find_srid('','septolis_departements_l93','wkb_geometry') ) in D:\MapJaxDist\ms4w\apps\mapjax\interface\gestion\update\index.php on line 297
Warning: [MapServer Error]: msPOSTGISLayerRetrievePGVersion(): Error executing POSTGIS statement (msPOSTGISLayerRetrievePGVersion():select substring(version() from 12 for (position('on' in version()) - 13)) in D:\MapJaxDist\ms4w\apps\mapjax\interface\gestion\update\index.php on line 297
Fatal error: Call to a member function saveImage() on a non-object in D:\MapJaxDist\ms4w\apps\mapjax\interface\gestion\update\index.php on line 298
La partie importante de ces messages d'erreur mentionne l'erreur MapServer dans la fonction msPOSTGISLayerRetrievePGVersion
. La requête utilisée pour récupérer le numéro de version de PostgreSQL ne fonctionne pas. Si on regarde de plus prêt, rien de très compliqué ici, on utilise la chaine retournée par la fontion version()
de PostgreSQL.
Dans notre cas, la fonction version()
renvoit : PostgreSQL 8.3.7, compiled by Visual C++ build 1400
. Ainsi il n'est pas possible d'utiliser la position de la chaîne 'on' dans ce résultat étant donnée qu'elle n'y est pas.
La solution la plus simple est d'utiliser le script SQL ci-dessous qui se contente de renommer la fonction version()
intiallement présente dans PostgreSQL en initial_version_func
puis de déclarer une fonction version qui renvoie une chaîne correcte pour ce cas d'utilisation :
; Renommage de la fonction version
ALTER FUNCTION version() RENAME TO initial_version_func;
; Définition de la nouvelle fonction version
CREATE OR REPLACE FUNCTION version() RETURNS VARCHAR AS
$$
DECLARE
vers text;
rec record;
BEGIN
FOR rec in EXECUTE $q$ SELECT 'PostgreSQL 8.3.7 on win32, compiled Visual C++ build 1400' as version$q$
LOOP
RETURN rec.version;
END LOOP;
RETURN '';
END
$$ LANGUAGE plpgsql;
Le problème est ainsi corrigé.
Il est à noté que, grâce aux corrections de Paul Ramsey, cette erreur ne devrait plus être présente dans les versions de MapServer sorties depuis le 11 avril 08 (cf. changeset 8003).
Posted in 4 commentaires | 3885 lectures
Posté par djay le 3 Juin, 2009 - 08:52.
Avec MapServer 5.4.0, l'affichage des extrémités des couches linéaires est maintenant facilité et possible à l'aide d'une seule couche.
Plus besoin donc de pré-traitement pour récupérer le début et la fin de la ligne requêtes suivantes, qui se faisait néanmoins très facilement avec des couches PostGIS. En utilisant, par exemple, les définitions de couches (1 et 2) ci-dessous ( la définition de la couche ligne de base est omise), respectivement pour le point de départ et le point final (on suppose que la table est <table>):
Définition de couche 1 :
LAYER
CONNECTION ""
CONNECTIONTYPE POSTGIS
DATA "wkb_geometry1 from (SELECT startPoint( <table>.wkb_geometry) as wkb_geometry1,<table>.ogc_fid, CASE WHEN plus(pow((y(e)-y(s)),2),pow((x(e)-x(s)),2)) = 0 THEN 1 ELSE (180*(acos((x(e)-x(s))/sqrt(plus(pow((y(e)-y(s)),2),pow((x(e)-x(s)),2))))/pi()))-90 END as angle FROM (select ogc_fid, pointN(wkb_geometry,2) as e, startPoint(wkb_geometry) as s from <table>) as foo, <table> WHERE foo.ogc_fid=<table>.ogc_fid) as foo1 using unique ogc_fid using SRID=27572"
NAME "espt_start"
PROCESSING "CLOSE_CONNECTION=DEFER"
STATUS OFF
TOLERANCE 0
TYPE POINT
UNITS METERS
CLASS
NAME "espt_start1"
STYLE
ANGLE [angle]
COLOR 250 8 255
SIZE 10
SYMBOL "triangle_isocele"
WIDTH 1
END
END
END
Définition de couche 2 :
LAYER
CONNECTION ""
CONNECTIONTYPE POSTGIS
DATA "wkb_geometry1 from (SELECT endPoint( <table>.wkb_geometry) as wkb_geometry1,<table>.ogc_fid, CASE WHEN plus(pow((y(e)-y(s)),2),pow((x(e)-x(s)),2)) = 0 THEN 1 ELSE (180*(acos((x(e)-x(s))/sqrt(plus(pow((y(e)-y(s)),2),pow((x(e)-x(s)),2))))/pi()))-270 END as angle FROM (select ogc_fid, pointN(wkb_geometry,numPoints(wkb_geometry)-1) as s, endPoint(wkb_geometry) as e from <table>) as foo, poisson.total_especes2 WHERE foo.ogc_fid=<table>.ogc_fid) as foo1 using unique ogc_fid using SRID=27572"
NAME "espt_end"
PROCESSING "CLOSE_CONNECTION=DEFER"
STATUS OFF
TOLERANCE 0
TYPE POINT
UNITS METERS
CLASS
NAME "espt_end1"
STYLE
ANGLE [angle]
COLOR 250 8 255
SIZE 10
SYMBOL "triangle_isocele"
WIDTH 1
END
END
END
L'astuce consistait donc simplement à ajouter deux couches supplémentaires, l'une pour le point de départ et l'autre pour le point final (si votre symbol est orienté) en plus de la couche de la ligne elle-même. Avec la nouvelle version de MapServer 5.4.0, on peut utiliser l'option GEOMTRANSFORM
d'une balise STYLE
qui, comme son nom l'indique, permet de réaliser une opération sur une géométrie (end, start, buffer ...). Par exemple, si vous souhaitez afficher une barre perpendiculaire aux extrémités d'une ligne, voilà la définition d'une couche MapServer qui utilise ce nouveau paramètre :
LAYER
CONNECTION ""
CONNECTIONTYPE POSTGIS
DATA "wkb_geometry FROM <table>"
NAME "espt"
PROCESSING "CLOSE_CONNECTION=DEFER"
STATUS OFF
TOLERANCE 0
TYPE LINE
UNITS METERS
CLASS
NAME "1"
STYLE
ANGLE 360
COLOR 250 8 255
SYMBOL 0
WIDTH 2
END
STYLE
ANGLE 360
ANTIALIAS TRUE
COLOR 0 0 255
SIZE 5
SYMBOL "l_oant_01_line"
WIDTH 2
END
STYLE
ANGLE AUTO
ANTIALIAS TRUE
COLOR 250 8 255
MAXSIZE 100
SIZE 10
SYMBOL "openoffice_137"
WIDTH 1
GEOMTRANSFORM "end([wkb_geometry])"
END
STYLE
ANGLE AUTO
ANTIALIAS TRUE
COLOR 250 8 255
MAXSIZE 100
SIZE 10
SYMBOL "openoffice_137"
WIDTH 1
GEOMTRANSFORM "start([wkb_geometry])"
END
END
END
Il est donc maintenant possible de facilement afficher un symbole quelconque au début, à la fin ou pour les plus gourmands les deux
Attention, lors d'une interrogation de données, vous constaterez sans doute le même résultat que l'image ci-dessous, le trait horizontal est répété tout au long de la ligne :
Lors de la sauvegarde des mapfiles à l'aide de l'API mapscript avec cette nouvelle version, j'ai rencontré un problème pour les couches ayant un STYLE
utilisant ANGLE AUTO
. Cette partie de la définition de la couche était remplacée par ANGLE 360
. Du coup, j'ai créé le "patch" qui suit (applicable à l'aide de la commande patch -P0 mapserver.patch
depuis le répertoire des sources de MapServer) pour corriger ce problème :
diff -ru ./mapfile.c ./mapfile.c
--- ./mapfile.c 2009-04-07 22:30:23.000000000 +0200
+++ ./mapfile.c 2009-04-28 23:52:43.000000000 +0200
@@ -1911,7 +1911,7 @@
style->minscaledenom=style->maxscaledenom = -1.0;
style->offsetx = style->offsety = 0; /* no offset */
style->antialias = MS_FALSE;
- style->angle = 360;
+ style->angle = 0;
style->autoangle= MS_FALSE;
style->opacity = 100; /* fully opaque */
style->_geomtransformexpression = NULL;
@@ -2127,7 +2127,9 @@
fprintf(stream, " STYLE\n");
if(style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_ANGLE].item)
fprintf(stream, " ANGLE [%s]\n", style->bindings[MS_STYLE_BINDING_ANGLE].item);
- else if(style->angle != 0) fprintf(stream, " ANGLE %g\n", style->angle);
+ else if(style->angle != 0 && style->autoangle!=MS_TRUE)
+ fprintf(stream, " ANGLE %g\n", style->angle);
+ else if(style->autoangle==MS_TRUE) fprintf(stream, " ANGLE AUTO \n");
if(style->antialias) fprintf(stream, " ANTIALIAS TRUE\n");
writeColor(&(style->backgroundcolor), stream, "BACKGROUNDCOLOR", " ");
On utilise donc la propriété autoangle
de style
pour vérifier si l'angle doit être ajouté ou non. Au passage, vous noterez que l'on n'ajoute plus un angle de 360 par défaut si aucun angle n'est spécifié pour la couche en question (ref. #2991).
Un autre détail, en passant, concernant cette nouvelle version 5.4.0 de MapServer : la nécessité d'avoir le mot clef SYMBOLSET
au début du fichier symbols.sym
(la balise END
n'est pas requise).
Posted in 5 commentaires | 4638 lectures
Posté par djay le 28 Avril, 2009 - 14:41.
Le 1er septembre 2008, Frank Warmerdam annonçait qu'une nouvelle version de PROJ été sortie : PROJ-4.6.1
.
Au programme :
- Mise à jour de nad/epsg à la version EPSG 6.17. Correction du problème de précision introduit dans la version précédente.
- Ajout de la logique pour la projection
tmerc
afin qu'elle échoue plutôt que renvoiyer des résultats éronés dans des zones éloigné de plus de 90° du méridien centre (#5). Cette modification est temporaire et restera le temps qu'une meilleure solution soit trouvée.
- Correction de gestion de texte supplémentaire dans cs2cs
- Renommage de INSTALL en INSTALL.txt
- La projection
egc
a été généralisée pour inclure la latitude de l'origine.
- Ajout de la projection
glabsgm
(Gauss Laborde / Sphere Geometric Mean), et sa variation gstmerc
.
- Création du catalogue d'initialisation nad/IGNF.
- Ajout du fichier ntf_r93.gsb
- Ajout de l'option de compilation
/Op
dans nmake.opt
pour éviter le bug d'optimisation de VC7 (#12)
- Correction de plusieurs scripts de test qui fonctionneront lorsque les fichiers grid seront disponibles.
Posted in 4 commentaires | lire plus | 5558 lectures
Posté par djay le 5 Septembre, 2008 - 09:57.