Power Query Retravailler un fichier JSON avec PQ

Staple1600

XLDnaute Barbatruc
Bonjour

Pour faire suite à ma discussion : Carte choroplèthe, je cherche à manipuler un fichier *.json avec PowerQuery

J'arrive bien à faire les 1ères étapes
PowerQuery:
let
    Source = Json.Document(File.Contents("C:\Users\STAPLE\Documents\communes-france.json")),
    #"Converti en table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Column1 développé" = Table.ExpandRecordColumn(#"Converti en table", "Column1", {"geo_point_2d", "geo_shape", "year", "reg_code", "reg_name", "dep_code", "dep_name", "arrdep_code", "arrdep_name", "ze2020_code", "ze2020_name", "bv2012_code", "bv2012_name", "epci_code", "epci_name", "ept_code", "ept_name", "com_code", "com_current_code", "com_name", "com_name_upper", "com_name_lower", "com_area_code", "com_type", "ze2010_name", "ze2010_code", "com_cataeu2010_code", "com_cataeu2010_name", "com_uu2010_code", "com_uu2010_status", "com_au2010_code", "com_cateaav2020_code", "com_cateaav2020_name", "com_uu2020_code", "com_uu2020_status", "com_aav2020_code", "com_cv_code", "com_in_ctu", "com_siren_code", "com_is_mountain_area"}, {"Column1.geo_point_2d", "Column1.geo_shape", "Column1.year", "Column1.reg_code", "Column1.reg_name", "Column1.dep_code", "Column1.dep_name", "Column1.arrdep_code", "Column1.arrdep_name", "Column1.ze2020_code", "Column1.ze2020_name", "Column1.bv2012_code", "Column1.bv2012_name", "Column1.epci_code", "Column1.epci_name", "Column1.ept_code", "Column1.ept_name", "Column1.com_code", "Column1.com_current_code", "Column1.com_name", "Column1.com_name_upper", "Column1.com_name_lower", "Column1.com_area_code", "Column1.com_type", "Column1.ze2010_name", "Column1.ze2010_code", "Column1.com_cataeu2010_code", "Column1.com_cataeu2010_name", "Column1.com_uu2010_code", "Column1.com_uu2010_status", "Column1.com_au2010_code", "Column1.com_cateaav2020_code", "Column1.com_cateaav2020_name", "Column1.com_uu2020_code", "Column1.com_uu2020_status", "Column1.com_aav2020_code", "Column1.com_cv_code", "Column1.com_in_ctu", "Column1.com_siren_code", "Column1.com_is_mountain_area"}),
    #"Column1.geo_point_2d développé" = Table.ExpandRecordColumn(#"Column1 développé", "Column1.geo_point_2d", {"lon", "lat"}, {"Column1.geo_point_2d.lon", "Column1.geo_point_2d.lat"}),
    #"Column1.geo_shape développé" = Table.ExpandRecordColumn(#"Column1.geo_point_2d développé", "Column1.geo_shape", {"type", "geometry", "properties"}, {"Column1.geo_shape.type", "Column1.geo_shape.geometry", "Column1.geo_shape.properties"}),
    #"Column1.geo_shape.geometry développé" = Table.ExpandRecordColumn(#"Column1.geo_shape développé", "Column1.geo_shape.geometry", {"coordinates", "type"}, {"Column1.geo_shape.geometry.coordinates", "Column1.geo_shape.geometry.type"})
in
    #"Column1.geo_shape.geometry développé"
Mais dans le tableau structuré, j'ai plusieurs colonnes avec comme valeurs : [List]

Je n'arrive pas à trouver quelles actions je dois choisir dans le ruban pour avoir dans le tableau Excel le fichier JSON correctement "interprété".

Ci-dessous le lien pour télécharger le fichier JSON ( 3 837 Ko)
fichier JSON
 
Dernière édition:

klin89

XLDnaute Accro
Re à tous, 🙂

Pour le fun, avec cette requête overpass, on obtient le contour du département, les éoliennes et le contour de leur commune d'implantation.
182 éoliennes réparties sur 33 communes.
VB:
[out:json][timeout:25];
area["ref:INSEE" = "89"]->.a;
//area["name" = "Côte-d'Or"]->.a;
rel(area.a)["boundary"="administrative"]["admin_level"="6"]->.d;
node(area.a)["power"="generator"]["generator:source"="wind"]["generator:method"="wind_turbine"]["generator:output:electricity"]->.b;
.b is_in->.c;
rel(pivot.c)["boundary"="administrative"]["admin_level"="8"]->.e;
(
  node.b;
  rel.d;
  rel.e;
);
out geom;
{{style:
node {width: 0;opacity:0;fill-opacity:0;}
node[power=generator] { icon-image: url("icons/maki/cross-18.png"); icon-width: 12;}
}}
//relation{text:name}

Parc_eolien_Yonne_89.jpg

.... pour ceux que ça intéresse.

Edit : pour le département de la Côte d'Or, j'utilise le name et non le code INSEE pour définir la zone sinon ça beugue comme signalé par mromain précédemment.
Faut que je teste avec le fichier du post #102

klin89
 

klin89

XLDnaute Accro
Re :)

J'ai testé le fichier du post #102 avec le fichier Geojson tiré de la requête overpass du post #107 et voilà ce que cela donne.
J'ai retiré les points représentant les éoliennes et fignolé les formes manuellement.
Yonne_Communes_Eoliennes.jpg

klin89
 
Dernière édition:

klin89

XLDnaute Accro
Re le forum ;)

Avec cette requête Overpass, je fais le chemin inverse : récuperer le contour des communes où il n'y a pas d'éoliennes, en jaune sur l'image.
CSS:
[out:json][timeout:25];
area[admin_level=6]["ref:INSEE" = "89"][boundary=administrative]->.searchArea;
// Echelle d'analyse la commune
rel(area.searchArea)[admin_level=8];
// map relations to their respective area
map_to_area -> .all_level_8_areas;
// chercher toutes les éoliennes
(node(area.searchArea)["power"="generator"]["generator:source"="wind"]["generator:method"="wind_turbine"]["generator:output:electricity"];>;);
// qui sont situées dans des communes
is_in;
area._[admin_level=8] -> .level_8_areas_avec_eolienne;
// Toutes les communes qui ne possédent pas d'éolienne
(.all_level_8_areas; - .level_8_areas_avec_eolienne;);
rel(pivot);
out geom;
rel(area.searchArea)[admin_level=6];
out geom;
{{style:
  node {
    width: 0;
    opacity:0;
    fill-opacity:0;
  }
}}
Yonne_Implantation_eolien.jpg

On peut aussi ressortir les éoliennes dans les zones vertes. (représentées par un point)

Pour mettre en forme les nombreuses formes, je me suis aidé de ces 2 macros, pas simple à le faire manuellement au vu du nombre de formes.
Enrichi (BBcode):
Option Explicit
Sub SupprimePoints()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    Set oSheet = ThisWorkbook.Worksheets("Feuil3")
    For Each oShape In oSheet.Shapes
        If oShape.Type = 28 Then
           oShape.Delete
        End If
    Next
End Sub
Sub ChercheYonne()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    Set oSheet = ThisWorkbook.Worksheets("Feuil3")
    For Each oShape In oSheet.Shapes
        If oShape.Name = "Yonne" Then
           oShape.Select
        End If
    Next
End Sub
Encore merci mromain, je m'amuse avec ton programme 🥰

klin89
 
Dernière édition:

Statistiques des forums

Discussions
311 733
Messages
2 082 019
Membres
101 872
dernier inscrit
Colin T