Joindre un fichier CSV au fichier de formes à l'aide de gdal / ogr?

11

J'ai un shapefile avec plusieurs attributs, par exemple YEAR, COUNTYet AREA. J'ai également un fichier CSV avec plus de champs que je veux dans le fichier de formes, comme POPULATION. Le fichier de formes et le fichier CSV ont tous deux un champ GISJOIN. Je sais comment faire une jointure dans QGIS. Mais comment puis-je créer une jointure permanente et écrire dans un fichier de formes à l'aide de l' ogr2ogrun des autres outils de GDAL / OGR?

Lincoln Mullen
la source
Votre build GDAL / OGR a-t-il un support spatialite ou sqlite?
BradHards
@BradHards: Cela ne lui ressemble pas. Il s'agit de la version GDAL / OGR packagée d'Ubuntu 14.04.
Lincoln Mullen

Réponses:

23

L' utilitaire ogr2ogr prend en charge une syntaxe SQL limitée . Vous pouvez joindre votre CSV au fichier de formes en utilisant quelque chose comme ceci:

ogr2ogr -sql "select inshape.*, joincsv.* from inshape left join 'joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp inshape.shp
user2856
la source
8
Oh gdal / ogr - tu ne cesse de m'étonner ..
radek
@luke C'est génial, mais comment puis-je faire cela, si mon shapefile et csv sont situés dans un dossier de mon PC ... où dois-je inclure mon chemin d'accès à ce dossier?
@Luke que j'ai, MAIS je ne l'ai certainement pas fait correctement, ogr2ogr -sql "sélectionnez C: \ Path \ inshape. *, C: \ Pathjoincsv. * Dans C: \ Path \ inshape left join 'C: \ Path \ joincsv .csv'.joincsv sur C: \ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp inshape.shp
4
ogr2ogr -sql "select inshape. *, joincsv. * from inshape left join 'path / to / joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp path / to / inshape.shp
user2856
J'obtiens l'erreur suivante: "Avertissement 1: la valeur 1060008100 du champ inshape.MA de la caractéristique 86 n'a pas été écrite avec succès. Peut-être en raison d'un nombre trop grand par rapport à la largeur du champ" Des idées comment résoudre ce problème?
RutgerH
7

La réponse acceptée est vraiment utile, mais j'ai trouvé que c'était lent avec une base de données de grande taille. Je crois que cela limite également vos options lors de la jonction des données.

Ma méthode consiste maintenant à tout tirer dans SQLite (en utilisant une combinaison de csvkit et ogr2ogr):

csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv
ogr2ogr -append -f "SQLite" myjoindb.db myjoinshp.shp

Rejoignez ensuite tout et créez un fichier de formes à partir de celui-ci:

ogr2ogr -f "ESRI Shapefile" -sql "SELECT csv.*, shp.* FROM myjoinshp shp INNER JOIN myjoincsv csv ON csv.joinfield = shp.joinfield" joined_output.shp myjoindb.db
Eric Brelsford
la source
Hey Eric, je reçois une erreur que myjoindb.db existe déjà. Cette base de données de deuxième ligne est-elle censée être nommée comme la première?
GIS Danny
Ah bon point, sur la deuxième ligne, vous voudrez ajouter un -appendpour donner la ogr2ogrpermission d'ouvrir une base de données SQLite existante et de l'ajouter. J'ai édité la réponse pour le montrer.
Eric Brelsford
Merci! Fonctionne très bien. Encore une question, si tout va bien rapide. La première ligne, j'ai un géoïde de champ qui continue de se convertir étrangement en flottants négatifs. C'est un identifiant de recensement que je veux traiter comme une chaîne, j'ai essayé d'envelopper la chaîne avec des guillemets et cela n'a pas fonctionné. Y a-t-il une commande comme: csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)ou quelque chose?
GIS Danny
Ce qui est bizarre, c'est que la jointure se produit correctement sur le géoïde, mais la sortie a le géoïde avec -2147184982 au lieu de ce qui y est entré.
GIS Danny
Cela ressemble geoidà une conversion en nombre, mais le nombre est si grand qu'il déborde et devient négatif. Consultez la documentation de csvsql , vous pouvez essayer de spécifier une table dans laquelle vous dites explicitement qu'il geoids'agit d'une chaîne, sinon cela --no-inferencepourrait vous aider.
Eric Brelsford du