Skip to content

Commit

Permalink
Merge branch 'master' into article/nouvelle-fenetre-qitribu
Browse files Browse the repository at this point in the history
  • Loading branch information
Guts authored Sep 3, 2024
2 parents 8d6cce8 + af7568d commit eaaea6e
Show file tree
Hide file tree
Showing 10 changed files with 253 additions and 9 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/manual_new_rdp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ jobs:

- name: Notification Slack
id: slack
uses: slackapi/slack-github-action@v1.26
uses: slackapi/slack-github-action@v1.27
if: "${{ github.event.inputs.notify-slack == 'true' }}"
with:
payload: '{"blocks":[{"type":"section","text":{"type":"mrkdwn","text":":newspaper: La GeoRDP du ${{ env.DATE_FR_LONG }} a été créée et attend vos contributions :writing_hand: !"}},{"type":"section","fields":[{"type":"mrkdwn","text":"Créée par *${{ github.actor }}* via GitHub Action."}]},{"type":"actions","elements":[{"type":"button","text":{"type":"plain_text","emoji":true,"text":":squid: Voir la PR (GitHub)"},"url":"${{ steps.cpr.outputs.pr_url }}"},{"type":"button","text":{"type":"plain_text","emoji":true,"text":":eye: Voir la preview (Netlify)"},"style":"primary","url":"https://preview-pullrequest-${{steps.cpr.outputs.pr_number}}--geotribu-preprod.netlify.app/"}]}]}'
Expand Down
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ repos:
- "--py39-plus"

- repo: https://github.com/astral-sh/ruff-pre-commit
rev: "v0.5.6"
rev: "v0.6.3"
hooks:
- id: ruff
args:
Expand Down
4 changes: 4 additions & 0 deletions config/plugins_redirections.yml
Original file line number Diff line number Diff line change
Expand Up @@ -914,8 +914,12 @@ redirects:

# divers (typos, changement de date...)
articles/2010/2010-12-13_imagemap_baselayers_v2.md: articles/2010/2010-12-13_imagimap_baselayers_v2.md
rdp/2013/rdp_2013-02-02.md: rdp/2013/rdp_2013-02-01.md
rdp/2015/rdp_2015-03-16.md: rdp/2015/rdp_2015-03-13.md
rdp/2015/rdp_2015-05-16.md: rdp/2015/rdp_2015-05-15.md
rdp/2015/rdp_2015-09-21.md: rdp/2015/rdp_2015-09-25.md
rdp/2013/rdp_2013-07-13.md: rdp/2013/rdp_2013-07-12.md
rdp/2015/rdp_2015-11-30.md: rdp/2015/rdp_2015-12-11.md
articles/2024/2024-07-16_de-la-tolerance-en-sig-geometrie-01-annonce.md: articles/2024/2024-07-16_de-la-tolerance-en-sig-geometrie-00-annonce.md
articles/2024/2024-07-18_de-la-tolerance-en-sig-geometrie-02-calculs-intersects-qgis-pas-bons.md: articles/2024/2024-07-18_de-la-tolerance-en-sig-geometrie-01-calculs-intersects-qgis-pas-bons.md
articles/2010/2010-08-25_interroger_geoserver_en_python_grace_a_gconfig.md: articles/2010/2010-08-25_interroger_geoserver_en_python_grace_a_gsconfig.md
3 changes: 2 additions & 1 deletion content/articles/2010/2010-02-02_ski_iphone_cartographie.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ categories:
comments: true
date: 2010-02-02
description: "Ski, iPhone et cartographie"
icon: material/ski
tags:
- cartographie
- iPhone
Expand All @@ -21,7 +22,7 @@ tags:

![icône ski](https://cdn.geotribu.fr/img/logos-icones/divers/ski.png "icône ski"){: .img-thumbnail-left }

Bon je ne vais pas vous raconter mes vacances, ce n'est pas le but de ce site - bonne neige ceci dit :-) , mais en tant qu'utilisateur d'iPhone je me suis décidé à tester des applications carto gratuites pour le ski. En effet, l'iPhone possède un récepteur GPS et on peut se servir dans l'AppleStore pour essayer différents produits.
Bon je ne vais pas vous raconter mes vacances, ce n'est pas le but de ce site - bonne neige ceci dit :slight_smile:, mais en tant qu'utilisateur d'iPhone je me suis décidé à tester des applications carto gratuites pour le ski. En effet, l'iPhone possède un récepteur GPS et on peut se servir dans l'AppleStore pour essayer différents produits.

----

Expand Down
3 changes: 2 additions & 1 deletion content/articles/2021/2021-02-09_statistiques_twitter.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ categories:
- article
comments: true
date: 2021-02-09
description: 'Récupérer des données sociales de Twitter, les préparer et les représenter est assez simple, grâce à trois bibliothèques Python : Twint, Pandas et Plolty. L''exemple développé ici s''appuie sur les statistiques autour des GeoRDP et articles parus dans GeoTribu en 2020'
description: "Récupérer des données sociales de Twitter, les préparer et les représenter est assez simple, grâce à trois bibliothèques Python : Twint, Pandas et Plolty. L'exemple développé ici s'appuie sur les statistiques autour des GeoRDP et articles parus dans GeoTribu en 2020"
icon: material/twitter
image: https://cdn.geotribu.fr/img/articles-blog-rdp/articles/stats_twitter/geotribu_stats_twitter.png
tags:
- Geotribu
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ Dans les chapitres suivants, nous explorerons ensemble :
- [Et dans les bases de données ? Comparaisons de SQL Server, Oracle et PostGIS](./2024-08-08_de-la-tolerance-en-sig-geometrie-04-postgis-oracle-ms-sql-server.md).
- [Utilisation de la topologie : est-ce que la topologie peut nous sauver ?](./2024-08-15_de-la-tolerance-en-sig-geometrie-05-topologie-forces-et-limites.md)
- [Approche alternative : utilisation de SFCGAL pour des calculs plus robustes.](./2024-08-22_de-la-tolerance-en-sig-geometrie-06-sfcgal.md)
- Et chez la concurrence, ça se passe comment ?
- [Et chez la concurrence, ça se passe comment ?](./2024-08-29_de-la-tolerance-en-sig-geometrie-07-esri-fme.md)
- Algorithmes et code : comment cela fonctionne-t-il ? Cette partie sera optionnelle, pour ceux ne voulant pas voir de code.
- La conclusion : comment arrêter de trop penser et vivre une vie meilleure !

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ Ainsi, nous allons passer de :

![GRASS line overlay clean](https://cdn.geotribu.fr/img/articles-blog-rdp/articles/2024/geometrie_tolerance_sig/grass_select_line_clean_points.svg){: .img-center loading=lazy }

Maintenant, on regarde si notre fonction v.select avec `intersects` fonctionne.
Maintenant, on regarde si notre fonction `v.select` avec `intersects` fonctionne.

Hourra !

Expand Down Expand Up @@ -210,6 +210,9 @@ En réalité, pas totalement, mais j'ai volontairement arrondi à trois chiffres
Pourquoi ai-je fait ça ? Marre de me trimbaler autant de chiffres.
Et, puis, est-ce vraiment utile d'avoir autant de chiffres après la virgule ? :wink:

[6 : _beyond the comma_ avec SFCGAL :fontawesome-solid-forward-step:](./2024-08-22_de-la-tolerance-en-sig-geometrie-06-sfcgal.md "SFCGAL pour des calculs géométriques robustes"){: .md-button }
{: align=middle }

<!-- geotribu:authors-block -->

{% include "licenses/beerware.md" %}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ categories:
comments: true
date: 2024-08-22
description: "Sixième partie du tour d'horizon des SIG sur les dessous des calculs géométriques : utilisation de SFCGAL pour des calculs plus robustes"
icon: material/vector-polygon-variant
icon: material/decimal-comma-decrease
image: https://cdn.geotribu.fr/img/articles-blog-rdp/articles/2024/geometrie_tolerance_sig/splash_serie_geometrie_06_sfcgal.png
license: beerware
robots: index, follow
Expand All @@ -29,8 +29,21 @@ Pour cela, laissez-moi introduire [SFCGAL](https://sfcgal.gitlab.io/SFCGAL/).

![Série d'été 2024 de Loïc Bartoletti - Les Géométries et les SIG : SFCGAL - Crédits : Sylvain Beorchia](https://cdn.geotribu.fr/img/articles-blog-rdp/articles/2024/geometrie_tolerance_sig/splash_serie_geometrie_06_sfcgal.png){: .img-center loading=lazy }

[Le dossier :octicons-move-to-start-16:](./2024-07-16_de-la-tolerance-en-sig-geometrie-00-annonce.md "De la tolérance en SIG : le dossier"){: .md-button }
[5 : topologie vs spaghetti :fontawesome-solid-backward-step:](./2024-08-15_de-la-tolerance-en-sig-geometrie-05-topologie-forces-et-limites.md "Topologie ; forces et limites"){: .md-button }
{: align=middle }

[Commenter cet article :fontawesome-solid-comments:](#__comments "Aller aux commentaires"){: .md-button }
{: align=middle }

----

## SFCGAL ?

Il s'agit d'une bibliothèque logicielle C++ sous licence [LGPL2+](https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html) construite comme une surcouche de [CGAL](https://www.cgal.org/) avec pour objectif de supporter l'[ISO 19107:2013](https://www.iso.org/fr/standard/26012.html) et la norme OGC [Simple Features Access](https://www.opengeospatial.org/standards/sfa/) 1.2 de l'OGC pour les opérations en 3D.

![logo SFCGAL](https://cdn.geotribu.fr/img/logos-icones/logiciels_librairies/sfcgal.webp){: .img-center loading=lazy }

Concrètement, SFCGAL fournit des types de géométries et des opérations conformes aux normes, auxquels on accède via ses API [C](https://sfcgal.gitlab.io/SFCGAL/doxygen/group__capi.html) ou [C++](https://sfcgal.gitlab.io/SFCGAL/doxygen/group__public__api.html).

Par exemple, PostGIS utilise l'API C pour exposer certaines fonctions de SFCGAL dans les bases de données spatiales (cf. [manuel de PostGIS](https://postgis.net/docs/reference.html#reference_sfcgal)).
Expand All @@ -45,6 +58,8 @@ On utilisera SFCGAL de deux façons, pour comparer leurs résultats :
- avec Python
- et avec PostGIS.

----

## Python avec PySFCGAL

[PySFCGAL](https://gitlab.com/sfcgal/pysfcgal) est une interface Python pour la bibliothèque SFCGAL, en cours de développement et de packaging. À défaut d'avoir une application `sfcgalop` à la `geosop` (au moment de la publication de l'article, celle-ci est en cours de développement) l'interface Python permet de faire des calculs plus facilement qu'en C ou C++. Promis, c'est « lisible » comme code.
Expand Down Expand Up @@ -147,6 +162,9 @@ Il existerait une façon de rendre le calcul correct dans PostGIS avec SFCGAL, m

Malgré les problèmes potentiels de précision dans son utilisation dans PostGIS, SFCGAL reste un outil précieux. Son principal atout réside dans ses fonctionnalités avancées en 2D et 3D, absentes de GEOS/PostGIS natif. Par ailleurs, ces erreurs ne sont pas systématiques et dépendent des données et opérations effectuées.

[7 : Esri et FME :fontawesome-solid-forward-step:](./2024-08-29_de-la-tolerance-en-sig-geometrie-07-esri-fme.md "Gestion de la précision géométrique dans Esri et FME"){: .md-button }
{: align=middle }

<!-- geotribu:authors-block -->

{% include "licenses/beerware.md" %}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
---
title: ESRI et FME
subtitle: "Série : De la tolérance en SIG - chapitre 7"
authors:
- Loïc Bartoletti
categories:
- article
comments: true
date: 2024-08-29
description: "Septième et avant-dernière partie du tour d'horizon des SIG sur les dessous des calculs géométriques : un petit tour chez ESRI et FME"
icon: simple/esri
image: https://cdn.geotribu.fr/img/articles-blog-rdp/articles/2024/geometrie_tolerance_sig/splash_serie_geometrie_07_esri_fme.png
license: beerware
robots: index, follow
tags:
- analyse
- ArcGIS
- ESRI
- FME
- géométrie
---

# Et chez la concurrence, ça se passe comment ?

On ne va pas tous les faire, mais seulement deux un peu connus et installés parfois à côté de QGIS comme logiciels SIG secondaires :wink:.

Le premier sera FME, une sorte de boîte à outils de QGIS et l'autre ArcGIS Pro, le concurrent payant de GRASS/QGIS.

![Série d'été 2024 de Loïc Bartoletti - Les Géométries et les SIG : ESRI & FME - Crédits : Sylvain Beorchia](https://cdn.geotribu.fr/img/articles-blog-rdp/articles/2024/geometrie_tolerance_sig/splash_serie_geometrie_07_esri_fme.png){: .img-center loading=lazy }

Cet article est la septième partie de la série d'été sur la gestion de la géométrie dans les SIG.

[Le dossier :octicons-move-to-start-16:](./2024-07-16_de-la-tolerance-en-sig-geometrie-00-annonce.md "De la tolérance en SIG : le dossier"){: .md-button }
[6 : SFCGAL pour les calculs robustes :fontawesome-solid-backward-step:](./2024-08-22_de-la-tolerance-en-sig-geometrie-06-sfcgal.md "SFCGAL"){: .md-button }
{: align=middle }

[Commenter cet article :fontawesome-solid-comments:](#__comments "Aller aux commentaires"){: .md-button }
{: align=middle }

----

## FME

![logo FME](https://cdn.geotribu.fr/img/logos-icones/logiciels_librairies/FME.png){: .img-thumbnail-left }

Pour FME, pas de blabla. J'insère les WKB[^wkt_wkb], je fais un test d'intersection et je regarde si les points intersectent `line` et `base`.

Vous pouvez trouver le fichier [fmw sur mon github](https://github.com/lbartoletti/lbartoletti.github.io/blob/master/assets/2024_intersection_intersects/data/fme_test_intersects.fmw)

Et le résultat :

![FME test intersects](https://cdn.geotribu.fr/img/articles-blog-rdp/articles/2024/geometrie_tolerance_sig/fme_test_intersects.png){: .img-center loading=lazy }

KO !

FME utilise, et contribue, aux outils open source. Néanmoins, même si le résultat est le même qu'avec GEOS, ce n'est pas cette bibliothèque qui est utilisée, mais une de leur conception. Encore une fois, le problème n'est donc pas GEOS.

----

## ESRI ArcGIS Pro

![logo ArcGIS Pro](https://cdn.geotribu.fr/img/logos-icones/logiciels_librairies/arcgis_pro.png){: .img-thumbnail-left }

Comme pour QGIS, nous allons tester notre problème de deux façons : par les traitements via une couche SIG et directement avec le WKB[^wkt_wkb].

### Utilisation du ShapeFile

Sauf erreur de ma part, ArcGIS ne sait pas ouvrir les fichiers GeoPackage. Qu'importe, nous utiliserons le bon vieux ShapeFile qui sera importé dans une GeoDatabase.

Afin de réaliser le calcul de l'intersection, nous utilisons l'outil [Pairwise Intersect](https://pro.arcgis.com/en/pro-app/latest/tool-reference/analysis/pairwise-intersect.htm).

Contrairement à ce que j'ai pu faire pour QGIS, je ne montre pas les formulaires graphiques, mais le code qu'exécute ArcGIS.

En entrée `in_features`, on donne nos deux couches `line` et `base`. On sait que l'on va avoir des points, donc on déclare le type de sortie comme `POINT`.

```python
arcpy.analysis.PairwiseIntersect(
in_features="line;base",
out_feature_class=r"C:\Users\xxx\AppData\Local\Temp\ArcGISProTemp37912\Sans titre\Default.gdb\line_PairwiseIntersect",
join_attributes="ALL",
cluster_tolerance=None,
output_type="POINT"
)
```

Je passe les étapes pour l'extraction du WKB et WKT[^wkt_wkb], dont voici les résultats :

- `0104000000020000000101000000e034efc8c83c3e4120166a8166d55341010100000040a4df9e8f3c3e416054525379d55341`
- `MultiPoint ((1981640.78490000218153 5199258.02210000157356262),(1981583.62060000002384186 5199333.30189999938011169))`

ArcGIS nous sort un résultat légèrement différent. Testons avec l'autre outil pour les intersections : [Intersect](https://pro.arcgis.com/en/pro-app/latest/tool-reference/analysis/intersect.htm)

```python
arcpy.analysis.Intersect(
in_features="line #;base #",
out_feature_class=r"C:\Users\xxx\AppData\Local\Temp\ArcGISProTemp37912\Sans titre\Default.gdb\line_Intersect1",
join_attributes="ALL",
cluster_tolerance=None,
output_type="POINT"
)
```

- `01040000000200000001010000008016d99e8f3c3e416054525379d553410101000000e034efc8c83c3e4120166a8166d55341`
- `MultiPoint ((1981583.62049999833106995 5199333.30189999938011169),(1981640.78490000218153 5199258.02210000157356262))`

Un résultat également légèrement différent, mais proche de celui que nous obtenons avec les autres SIG.
Que se passe-t-il ici ?

ArcGIS utilise, pour tous les calculs, une notion que l'on retrouve parfois dans les SIG OpenSource, celui de résolution et tolérance.
On peut la modifier en passant en paramètres des valeurs XY. Voici les requêtes et les résultats avec une valeur de 0.00001 mm.

```python
with arcpy.EnvManager(XYResolution="0.00001 Millimeters", XYTolerance="0.00001 Millimeters"):
arcpy.analysis.PairwiseIntersect(
in_features="line;base",
out_feature_class=r"C:\Users\xxx\AppData\Local\Temp\ArcGISProTemp37912\Sans titre\Default.gdb\line_PairwiseIntersect1",
join_attributes="ALL",
cluster_tolerance=None,
output_type="POINT"
)
```

- `MultiPoint ((1981640.78490600734949112 5199258.02208840474486351),(1981583.6205737441778183 5199333.30187807604670525))`
- `0104000000020000000101000000a099efc8c83c3e417ce5698166d553410101000000c0ebdd9e8f3c3e416cf8515379d55341`

Ah, on retrouve nos petits ! Du moins, l'écart a été réduit.

L'équivalent de notre sélection par localisation se fait comme suit :

```python
arcpy.management.SelectLayerByLocation(
in_layer="line_PairwiseIntersect1;pariwiseIntersect_tolerance;lineIntersect",
overlap_type="INTERSECT",
select_features="line",
search_distance=None,
selection_type="NEW_SELECTION",
invert_spatial_relationship="NOT_INVERT"
)
```

Avec une distance de recherche (tolérance)

```python
arcpy.management.SelectLayerByLocation(
in_layer="line_PairwiseIntersect1;pariwiseIntersect_tolerance;lineIntersect",
overlap_type="INTERSECT",
select_features="line",
search_distance="0.000000001 Millimeters",
selection_type="NEW_SELECTION",
invert_spatial_relationship="NOT_INVERT"
)
```

Dans les deux cas, ArcGIS sélectionne les points d'intersection. C'est donc un bon point pour eux.

### Via le WKB et ArcPy

Dans la partie suivante, nous allons regarder comment cela se passe, en utilisant directement les fonctions de base.

```python
import binascii
# on importe le WKB de base
base = arcpy.FromWKB(binascii.unhexlify('0102000000050000007997c6b68d3c3e4139eb62c260d55341ac9ea7316a3c3e41cbeb40e073d55341403e0bfbc33c3e41b3fc06f380d55341387a2a800c3d3e41f256b8176dd553417997c6b68d3c3e4139eb62c260d55341'))
# on importe le WKB de line
line = arcpy.FromWKB(binascii.unhexlify('010200000002000000ea9c6d2b873c3e41a03d941b7cd5534133db7796ce3c3e413fba569864d55341'))
# calcul du point d'intersection en WKT
base.intersect(line, 1).WKT
# 'MULTIPOINT ((1981583.6207275391 5199333.3018798828), (1981640.7850952148 5199258.0220947266))'
# en WKB
base.intersect(line, 1).WKB
# bytearray(b'\x01\x04\x00\x00\x00\x02\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\xe8\x9e\x8f<>A\x00\x00RSy\xd5SA\x01\x01\x00\x00\x00\x00\x00\xfc\xc8\xc8<>A\x00\x00j\x81f\xd5SA')
# avec la conversion pour l'afficher en hexa
binascii.hexlify(base.intersect(line, 1).WKB)
# b'01040000000200000001010000000000e89e8f3c3e410000525379d5534101010000000000fcc8c83c3e4100006a8166d55341'
```

Maintenant, regardons les relations spatiales entre notre résultat `result` et les [géométries](https://pro.arcgis.com/en/pro-app/latest/arcpy/classes/geometry.htm) `base` et `line`.
On utilisera : disjoint, contains, crosses, equals, overlaps, touches et whitin ; ce dernier étant notre intersects.

Base :

```python
result.disjoint(base)
# False
```

```python
result.contains(base), result.crosses(base), result.equals(base), result.overlaps(base), result.touches(base), result.within(base)
# (False, False, False, False, False, True)
```

Line :

```python
result.disjoint(line)
# False
```

```python
result.contains(line), result.crosses(line), result.equals(line), result.overlaps(line), result.touches(line), result.within(line)
# (False, False, False, False, False, True)
```

On obtient bien le résultat souhaité. En fait, vous l'aurez peut-être compris en filigrane, ArcGIS ne propose pas un calcul "strict" comme les autres, mais bien quelque chose de particulier. Il est "tolérant".

<!-- geotribu:authors-block -->

{% include "licenses/beerware.md" %}

<!-- Notes de bas de page -->
<!-- markdownlint-disable MD007 MD032 -->
[^wkt_wkb]: formats standards de représentation des géométries :

- **WKB (Well-Known Binary)** : Le WKB est un format binaire utilisé pour représenter des objets géométriques de manière compacte et efficace, couramment utilisé dans les bases de données géospatiales pour le stockage et l'échange de données géographiques.
- **WKT (Well-Known Text)** : Le WKT est un format texte utilisé pour représenter des objets géométriques de manière lisible par l'humain. Il est souvent utilisé pour le partage et l'affichage de données géographiques.

Pour plus d'informations, consultez la page [Wikipedia](https://fr.wikipedia.org/wiki/Well-known_text).
<!-- markdownlint-enable MD007 MD032 -->
Loading

0 comments on commit eaaea6e

Please sign in to comment.