Ce package Php implémente les primitives géométriques GeoJSON
et OGC WKT sous la forme de classes Php.
Il comprend une classe abstraite Geometry ainsi que les 7 sous-classes suivantes correspondant
aux différentes primitives géométriques :
- 3 types géométriques élémentaires: Point, LineString et Polygon
- 3 types de collections homogènes de géométries élémentaires: MultiPoint, MultiLineString et MultiPolygon
- 1 type de collection hétérogène de géométries élémentaires: GeometryCollection
Il comprend en outre :
- la classe CoordSys qui implémente des changements de coordonnées simples,
- la classe BBox qui implémente les boites englobantes,
- la classe statique Wkt2GeoJson qui implémente une transformation optimisée d'une primitive WKT en GeoJSON.
La classe abstraite Geometry permet de gérer a minima une géométrie sans avoir à connaître son type. Elle comporte les méthodes suivantes.
- 2 méthodes statiques de construction d'objet à partir respectivement d'un WKT ou d'un GeoJSON :
static fromWkt(string $wkt, int $nbdigits=null): Geometry
- crée une géométrie à partir d'un WKTstatic fromGeoJSON(array $geometry, int $nbdigits=null): Geometry
- crée une géométrie à partir d'une géométrie GeoJSON
- la méthode générique
geojson(): array
qui génère comme Array Php qui, encodé en JSON, correspondra à la geometry GeoJSON - la méthode
wkt(): string
qui fabrique une représentation WKT - la méthode
bbox(): BBox
qui fabrique le BBox de l'objet
La classe statique CoordSys implémente les changements simples entre coordonnées en projection et coordonnées géographiques, et vice-versa, définis sur l'elliposide IAG_GRS_1980. Les systèmes de coordonnées suivants sont gérés :
- 'geo' pour coordonnées géographiques WGS 84 en degrés décimaux dans l'ordre longitude, latitude
- 'L93' pour Lambert 93
- 'WM' pour web Mercator
- UTM-ddX où dd est le numéro de zone et X est soit 'N', soit 'S'
static detect($opengiswkt)
- detecte le système de coord exprimé en Well Known Text d'OpenGISstatic chg(string $src, string $dest, number $x, number $y): array
- chg de syst. de coord. de $src vers $dest renvoie un tableau de 2 coordonnées. Les couples acceptés sont 'geo',proj et proj,'geo'
La classe Point implémente la primtive Point en 2D ou 3D ; pour certaines méthodes l'objet est considéré comme un vecteur.
__construct($param)
- construction à partir d'un WKT ou d'un array [number, number {, number}]x(): number
- accès à la première coordonnéey(): number
- accès à la seconde coordonnéez(): number
- accès à la troisième coordonnée ou nullisValid(): bool
- renvoie vrai ssi l'objet est valideround(int $nbdigits): Point
- arrondit un point avec le nb de chiffres indiquésfilter(int $nbdigits): Point
- synonyme de round()proj2D(): Point
- projection 2D, supprime l'éventuelle 3ème coordonnée__toString(): string
- affichage des coordonnées séparées par un blancwkt($nbdigits=null): string
- retourne la chaine WKTbbox(): BBox
- renvoie la bboxdrawCircle(Drawing $drawing, $r, $fill): void
- dessine un cercle centré sur le point de rayon r dans la couleur indiquéedistance(): float
- retourne la norme du vecteur, cad la distance euclidienne entre 2 pointschgCoordSys(string $src, string $dest): Point
- crée un nouveau Point en changeant le syst. de coord. de $src en $destcoordinates(): array
- renvoie les coordonnées sous la forme [ number, number {, number} ]length(): float
- renvoie la norme du vecteurstatic substract(Point $p0, Point $p): Point
- différence $p - $p0, fournit un vecteurdiff(Point $v): Point
- différence $this - $v, fournit un vecteuradd(Point $v): Point
- somme $this + $vscalMult(float $u): Point
- multiplication de $this par le scalaire $upvect(Point $v): float
- produit vectoriel $this * $vpscal(Point $v): float
- produit scalaire $this * $vdistancePointLine(Point $a, Point $b): float
- distance signée du point courant à la droite définie par les 2 points
La distance est positive si le point est à gauche de la droite AB et négative s'il est à droiteprojPointOnLine(Point $a, Point $b): float
- projection du point sur la droite A,B,
renvoie u / P' = A + u * (B-A). u == 0 <=> P'== A, u == 1 <=> P' == B Le point projeté est sur le segment ssi u est dans [0 .. 1].
La classe Segment implémente un segment de droite constitué de 2 points.
__construct(Point $pt0, Point $pt1)
- construction à partir de 2 pointsinters(Segment $seg): array
- intersection entre 2 segments
Si les segments ne s'intersectent pas alors retourne []
S'il s'intersectent, retourne le pt ainsi que les abscisses u et v
Si les 2 segments sont parallèles, alors retourne [] même s'ils sont partiellement confondus
La classe BBox gère les boites englobantes définies par 2 points min et max.
Une boite peut ne contenir aucun point ; dans ce cas min et max contiennent la valeur null.
On dit qu'elle est indéterminée.
Si une boite n'est pas indéterminée alors min et max contiennent chacun un point.
__construct($param=null)
- initialise une boite en fonction du paramètre.
Sans paramètre la boite est initialisée indéterminée.
Si le paramètre est une chaine de la forme "nombre,nombre" alors min et max valent le point indiqué.
Si la chaine est de la forme "nombre,nombre,nombre,nombre" alors min correspond aux 2 premières valeurs et max aux deux suivantes..__toString(): string
- affiche les 2 points entourées de []min(): ?Point
- renvoie le point minmax(): ?Point
- renvoie le point maxbound(Point $pt): BBox
- agrandit la boite pour contenir le point et la renvoieunion(BBox $bbox): BBox
- Agrandit la boite courante pour contenir la boite en paramètre et la renvoiesize(): float
- longueur de la diagonalearea(): float
- surface de la boitemindist(BBox $r1): float
- calcul du minimum les distances entre les points de 2 boitesinters(BBox $bbox1): float
- calcul du rapport de l'intersection des 2 boites sur le maximum des surfaces des 2 boitesisIncludedIn(BBox $bbox1):bool
- teste si this est inclus dans bbox1asPolygon(): Polygon
- renvoie la bbox comme PolygonasArray(): array
- renvoie [xmin, ymin, xmax, ymax] ou nullchgCoordSys(string $src, string $dest): BBox
- crée un nouveau BBox en changeant le syst. de coord. de $src en $destpointInBBox(Point $pt): bool
- teste si un point est dans un BBoxedges(): array
- retourne les 4 côtés sous la forme de couple de pointscorner(int $no)
- retourne un des 4 coins : 0=>SW, 1=>SE, ...
La classe LineString implémente la primtive LineString en 2D ou 3D correspondant à une liste brisée.
__construct($param)
- construction à partir d'un WKT ou d'un [Point] ou d'un [[num, num {,num}]]__toString(): string
- affiche la liste des points entourées par des ()points(): array
- retourne la liste des points composant la lignepoint(int $i): Point
- retourne un point particulier numéroté à partir de 0isValid(): bool
- renvoie vrai ssi l'objet est valideproj2D(): LineString
- projection 2D, supprime l'éventuelle 3ème coordonnéefilter(int $nbdigits): LineString
- renvoie un nouveau LineString filtré supprimant les points successifs identiqueschgCoordSys($src, $dest): LineString
- créée un nouveau LineString en changeant le syst. de coord. de $src en $destcoordinates(): array
- renvoie un tableau de coordonnées sous la forme [ [ num ] ]draw($drawing, $stroke='black', $fill='transparent', $stroke_with=2)
- dessine la liste briséeisClosed(): bool
- teste la fermeture de la liste briséelength(): float
- renvoie la longueur de la liste briséearea(): float
- renvoie la surface dans le système de coordonnées courantdistancePointPointList(Point $pt): array
- distance minimum d'une liste de points au point pt
retourne la distance et le no du point qui correspond à la distance minimum sous la forme ['dist'=>$dist, 'n'=>$n]distancePointLineString(Point $pt): array
- distance minimum de la ligne brisée au point pt
retourne la distance et le point qui correspond à la distance minimum sous la forme ['dmin'=>$dmin, 'pt'=>$pt]simplify(float $distTreshold): ?LineString
- simplifie la géométrie de la ligne brisée
Algorithme de Douglas & Peucker Ne modifie pas l'objet courant. Retourne un nouvel objet LineString simplifié ou null si la ligne est fermée et que la distance max est inférieure au seuil.pointInPolygon(Point $pt): bool
- teste si un point pt est dans le polygone
La classe Polygon implémente la primtive Polygon correspondant à un extérieur défini par une ligne brisée fermée et d'éventuels trous chacun défini comme une ligne brisée fermée.
lineStrings(): array
- retourne la liste des LineStrings composant le polygone__construct($param)
- construction à partir d'un WKT ou d'un [LineString] ou d'un [[[num,num]]]addHole(LineString $hole): void
- ajoute un trou au polygonechgCoordSys($src, $dest): Polygon
- créée un nouveau Polygon en changeant le syst. de coord. de $src en $dest__toString(): string
- affiche la liste des LineString entourée par des ()toString($nbdigits=null)
- affiche la liste des LineString entourée par des () en précisant évent. le nbre de chiffres significatifsbbox(): BBox
- calcul du rectangle englobantisValid(): bool
- renvoie vrai ssi l'objet est valideproj2D(): Polygon
- projection 2D, supprime l'éventuelle 3ème coordonnée, renvoie un nouveau Polygonfilter($nbdigits): Polygon
- filtre la géométrie en supprimant les points intermédiaires successifs identiquescoordinates(): array
- renvoie les coordonnées comme [ [ [ num ] ] ]draw($drawing, $stroke='black', $fill='transparent', $stroke_with=2)
- dessine le polygonearea($options=[])
- renvoie la surface dans le système de coordonnées courant
Par défaut, l'extérieur et les intérieurs tournent dans des sens différents. La surface est positive si l'extérieur tourne dans le sens trigonométrique, < 0 sinon. Si l'option 'noDirection' vaut true alors les sens ne sont pas pris en compte.pointInPolygon(Point $pt): bool
- teste si le point pt est dans le polygoneinters(Geometry $geom): bool
- teste l'intersection entre les 2 polygones ou multi-polygones
La classe abstraite MultiGeom factorise des méthodes communes sur les listes de géométries élémentaires homogènes.
__toString(): string
- génère une chaine de caractère correspondant au WKT sans l'entetecoordinates(): array
- renvoie un tableau de coordonnéesisValid(): bool
- renvoie vrai ssi l'objet est valideproj2D(): MultiGeom
- projection 2D, supprime l'éventuelle 3ème coordonnée, renvoie un nouvel objetfilter(int $nbdigits): MultiGeom
- renvoie une nouvelle collection dont chaque élément est filtré supprimant les points successifs identiques
La classe MultiPoint implémente la primitive MultiPoint correspondant à une liste de Points.
__construct($param)
- initialise un MultiPoint à partir d'un WKT ou de [Point] ou de [[num,num]]wkt(): string
- génère la chaine de caractère correspondant au WKT avec l'entete
La classe MultiLineString implémente la primitive MultiLineString correspondant à une liste de lignes brisées.
__construct($param)
- initialise un MultiPoint à partir d'un WKT ou de [Point] ou de [[[num,num]]]wkt(): string
- génère la chaine de caractère correspondant au WKT avec l'entete
La classe MultiPolygon implémente la primitive MultiPolygon correspondant à une liste de polygones.
__construct($param)
- initialise un MultiPolygon à partir d'un WKT ou de [Polygon] ou de [[[[num,num]]]]wkt(): string
- génère la chaine de caractère correspondant au WKT avec l'enteteinters(Geometry $geom): bool
- teste l'intersection entre les 2 polygones ou multi-polygones
La classe GeometryCollection implémente la primitive GeometryCollection correspondant à une liste d'objets élémentaires.
__construct($param)
- initialise un GeomCollection à partir d'un WKT ou d'une liste de Geometry__toString(): string
- génère une chaine de caractère correspondant au WKT sans l'entetefilter(int $nbdigits)
- filtre la géométrie en supprimant les points intermédiaires successifs identiqueswkt(): string
- génère la chaine de caractère correspondant au WKT avec l'entetechgCoordSys($src, $dest)
- créée un nouveau GeomCollection en changeant le syst. de coord. de $src en $destwkt(): string
- génère une chaine de caractère correspondant au WKT avec l'entetegeojson(): array
- retourne un tableau Php qui encodé en JSON correspondra à la geometry GeoJSONfunction draw($drawing, $stroke='black', $fill='transparent', $stroke_with=2): void
- itère l'appel de draw sur chaque élément
La classe statique Wkt2GeoJson implémente une transformation optimisée d'une représentation WKT en GeoJSON, nécessaire pour les objets volumineux. La transformation ne crée aucune copie du $wkt afin d'optimiser la gestion mémoire. De plus, elle utilise ni preg_match() ni preg_replace().
static convert(string $wkt, float $shift=0.0): array
- prend un WKT et renvoie un array correspondant à un GeoJSON, $shift est un décalage à appliquer en latitude, il vaut normalement 0, -360.0 ou +360.0