.. _`gdal.ogr.formats.geojson`:
========
GeoJSON
========
Ce pilote implémente la gestion en lecture et écriture pour l'accès aux géométries encodé au format `GeoJSON `_. Le GeoJSON est un langage basé sur `JavaScript Object Notation (JSON) `_. Le JSON est un format léger textuel pour l'échange de données et GeoJSON n'est rien d'autre que sa spécialisation pour le contenu géographique.
Au moment d'écrire ce texte, GeoJSON est géré comme format de sortie de services implémenté par `FeatureServer `_,
`GeoServer `_ et
`CartoWeb `_.
Le pilote GeoJSON d'OGR traduit une donnée encodée en GeoJSON vers des objets
du `model Simple Feature d'OGR `_ : jeu de
données, couche, objet, géométrie. L'implémentation est basée sur le
`brouillon de spécification de GeoJSON, v5.0 `_.
À partir de OGR 1.8.0, le pilote GeoJSON peut lire les sorties JSON des requêtes
de services de Feature qui suivent les `spécifications REST des GeoServices
`_, comme
implémenté par l'`API du serveur REST d'ArcGIS `_.
Source de données
==================
Le pilote GeoJSON d'OGR accepte trois types de sources de données :
* *Uniform Resource Locator* (`URL `_) - une
adresse web pour réaliser des requêtes
`HTTP `_
* des fichiers textuels avec des données GeoJSON - identifié à partir de
l'extension du fichier .geojson ou .json
* du texte passé directement et encodé en GeoJSON
Couche
=======
Un jeu de données GeoJSON est traduit à un objet *OGRLayer* simple avec un nom prédéfinie *OGRGeoJson* :
::
ogrinfo -ro http://featureserver/data/.geojson OGRGeoJSON
Il est également valide de faire l'hypothèse que
*OGRDataSource::GetLayerCount()* pour la source de données GeoJSON retourne
toujours 1.
Accéder un service Web comme source de données (par exemple FeatureServer),
chaque requête produira une nouvelle couche. Ce comportement se conforme à la
nature *stateless* des transactions HTTP et est similaire à la façon dont opère
les navigateurs : une requête = une page.
Si un membre de plus haut niveau des données GeoJSON est d'un autre type que
FeatureCollection,le pilote produira une couche avec seulement un objet.
Autrement, une couche consistera d'un ensemble d'objets.
Objet
=======
Le pilote GeoJSON d'OGR relie chaque objet des types suivants aux nouveaux
objets *OGRFeature* : Point, LineString, Polygon, GeometryCollection, Feature.
Selon les spécification GeoJSON, seul l'objet *Feature* doit avoir un
membre avec un nom de propriété. Chaque membre des propriétés est traduit
vers un objet OGR du type de *OGRField* et ajouté à l'objet *OGRFeature*
correspondant.
La spécification GeoJSON ne nécessite pas que tous les objets géométriques dans
une colection doivent avoir le même schéma de propriétés. Si les objets
géométriques dans un ensemble définie par un objet FeatureCollection ont
différents schéma de propriétés, il en résulte alors un schéma de champs dans
*OGRFeatureDefn* est généré comme
l'`union `_ de toutes les
propriétés géométriques.
Il est possible de dire au pilote de ne pas traiter les attributs en définissant
la variable d'environnement *ATTRIBUTES_SKIP=YES*. Le comportement par défaut
est de préserver tous les attributs (comme une union, voir paragraphe précédent),
ce qui est équivalent à définir *ATTRIBUTES_SKIP=NO*.
Géométrie
==========
Comme pour le problème des objets avec des propriétés mixtes, le brouillon de
la spécification GeoJSON ne nécessite pas que tous les objets géométriques dans
une collection doivent avoir une géométrie de même type. Heureusement le modèle
objet d'OGR permet d'avoir des géométries de plusieurs types dans une seule
couche - un couche hétérogène. Par défaut, le pilote GeoJSON préserve le type
de la géométrie.
Cependant, parfois il nécessite de générer une couche hétérogène à partir d'un
ensemble d'objet géométrique hétérogène. Pour cela, il est possible de dire au
pilote d'englober toutes les géométries avec un type *OGRGeometryCollection*
comme un dénominateur commun. Ce comportement peut être contrôler par la
variable d'environnement *GEOMETRY_AS_COLLECTION=YES* (NO par défaut).
Variables d'environnement
*************************
* *GEOMETRY_AS_COLLECTION* - utilisé pour contrôler la traduction des
géométries : YES - englobe les géométries avec le type *OGRGeometryCollection*
* *ATTRIBUTES_SKIP* - contrôle la traduction des attributs : YES - ignore les
attributs
Option de création de couche
=============================
* **WRITE_BBOX = YES/NO :** (OGR >= 1.9.0) définie à YES pour écrire une propriété
bbox avec la bounding box des géométries au niveau de la feature et de la
collection de feature. NO par défaut.
* **COORDINATE_PRECISION = int_number :** (OGR >= 1.9.0) nombre maximal de
chiffre à écrire après la virgule pour les coordonnées. 15 par défaut. Une
coupure intelligente permettra de supprimer les zéros en trop.
Gestion de l'API de Système de Fichier Virtuel
================================================
.. warning:: Certaines fonctionnalités ci-dessous peuvent nécessité OGR >= 1.9.0
Le pilote gère la lecture et l'écriture vers les fichiers géré par l'API du Système de Fichier Virtuel ce qui inclus
les fichiers "normaux", ainsi que les fichiers dans les domaines /vsizip/ (lecture-écriture), /vsigzip/ (lecture-écriture) , /vsicurl/ (lecture-seule).
L'écriture vers /dev/stdout ou /vsistdout/ est également gérée.
Exemples
==========
Comment faire un dump du contenu d'un fichier .geojson :
::
ogrinfo -ro point.geojson
Comment réaliser une requête sur les objets à partir un service distant avec un
filtre sur un attribut :
::
ogrinfo -ro http://featureserver/cities/.geojson OGRGeoJSON -where "name=Warsaw"
Comment traduire un certain nombre d'objets à partir d'une requête d'un
FeatureServer vers un shapefile d'ESRI :
::
ogr2ogr -f "ESRI Shapefile" cities.shp http://featureserver/cities/.geojson OGRGeoJSON
Lire le résultat d'une requête FeatureService en fonction d'un serveur GeoServices
REST :
::
ogrinfo -ro -al
"http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Hydrography/Watershed173811/FeatureServer/0/query?where=objectid+%3D+objectid&outfields=*&f=json"
.. seealso::
* `GeoJSON `_ - encoding geographic content in JSON
* `JSON `_ - JavaScript Object Notation
* `JSON-C `_ - Une implémentation JSON en C
* `[Gdal-dev] OGR GeoJSON Driver `_ - driver announcement
* `Spécification REST des GeoServices `_
.. yjacolin at free.fr, Yves Jacolin - 2013/04/03 (trunk 23022)