web-dev-qa-db-fra.com

Tracer des polygones colorés avec des géodonnées dans le folium

J'essaie de tracer des données radar dans le folium, et j'y suis presque. J'ai suivi cet exemple ( données de tracé de contour (lat, lon, valeur) dans les limites et exportation GeoJSON ) pour obtenir mes données dans un format GeoJson.

nb_class = 20 
collec_poly = plt.contourf(lons,lats,np.array(poshdata), nb_class,alpha=0.5)

gdf = collec_to_gdf(collec_poly) # From link above
gdf.to_json()
colors = [p.get_facecolor().tolist()[0] for p in collec_poly.collections]
gdf['RGBA'] = colors

gdf

Cela génère deux colonnes: géométrie et RGBA.

    RGBA    geometry
0   [0.0, 0.0, 0.713903743316, 1.0] (POLYGON ((-71.57032079644679 42.2775236331535...
1   [0.0, 0.0960784313725, 1.0, 1.0]    (POLYGON ((-71.56719970703125 42.2721176147460...
2   [0.0, 0.503921568627, 1.0, 1.0] (POLYGON ((-71.55678558349609 42.2721176147460...
3   [0.0, 0.896078431373, 0.970904490829, 1.0]  (POLYGON ((-71.52552795410156 42.2849182620049...
4   [0.325743200506, 1.0, 0.641998734978, 1.0]  (POLYGON ((-71.49427795410156 42.2939676156927...
5   [0.641998734978, 1.0, 0.325743200506, 1.0]  (POLYGON ((-71.47344207763672 42.3003084448852...
6   [0.970904490829, 0.959331880901, 0.0, 1.0]  (POLYGON ((-71.26508331298828 42.3200411822557...
7   [1.0, 0.581699346405, 0.0, 1.0] (POLYGON ((-71.15048217773438 42.3333218460720...

De là je fais ma carte folium:

import folium    

# Picked location between Sudbury and Somerville:
maploc = folium.Map(location=[42.377157,-71.236088],zoom_start=11,tiles="Stamen Toner")

folium.GeoJson(gdf).add_to(maploc)

Cela crée ma carte Nice folium, mais les polygones ne sont pas du tout colorés. Comment puis-je remplir les contours avec les bonnes couleurs? Et fixer l'opacité?

enter image description here

12
edub

Je pense que je l'ai compris. Dans mon code précédent, polygon.get_facecolor () renvoie une liste de valeurs RGBA allant de 0 à 1. J'ai ajouté cette fonction (modifiée depuis this post):

def convert_to_hex(rgba_color) :
    red = str(hex(int(rgba_color[0]*255)))[2:].capitalize()
    green = str(hex(int(rgba_color[1]*255)))[2:].capitalize()
    blue = str(hex(int(rgba_color[2]*255)))[2:].capitalize()

    if blue=='0':
        blue = '00'
    if red=='0':
        red = '00'
    if green=='0':
        green='00'

    return '#'+ red + green + blue

pour le convertir en une chaîne hexadécimale. Ensuite:

gdf['RGBA'] = convert_to_hex(colors)

Ensuite, pour tracer les couleurs du folium, je fais:

maploc = folium.Map(location=[42.377157,-71.236088],zoom_start=10,tiles="Stamen Toner")

colors = []
folium.GeoJson(
    gdf,
    style_function=lambda feature: {
        'fillColor': feature['properties']['RGBA'],
        'color' : feature['properties']['RGBA'],
        'weight' : 1,
        'fillOpacity' : 0.5,
        }
    ).add_to(maploc)

et cela a créé une intrigue vraiment sympa! (Le nom de la propriété est un peu trompeur - il ne s'agit pas en fait de valeurs RGBA, mais de chaînes hexadécimales.)

6
edub

Pas un expert ... Je viens de commencer avec le folium et le jupyter et j'ai eu un problème similaire mais avec des lignes. Vous dites que vous avez GeoJson et des polygones et que la couleur est incluse dans le json, je suppose.

La fonction style_function pourrait vous aider à obtenir ce que vous voulez?

L'exemple ci-dessous est produit avec cette page: http://geojson.io/ Tout ce que j'avais à faire était un "mapping" avec le style_function. Il est également possible d'utiliser une fonction auto-définie, voir: https://github.com/python-visualization/folium/blob/master/examples/Colormaps.ipynb

import folium
geoJsonData = {
    "features": [
        {
            "geometry": {
                "coordinates": [
                    [
                        12.98583984375,
                        56.70450561416937
                    ],
                    [
                        14.589843749999998,
                        57.604221411628735
                    ],
                    [
                        13.590087890625,
                        58.15331598640629
                    ],
                    [
                        11.953125,
                        57.955674494979526
                    ],
                    [
                        11.810302734375,
                        58.76250326278713
                    ]
                ],
                "type": "LineString"
            },
            "properties": {
                "stroke": "#fc1717",
                "stroke-opacity": 1,
                "stroke-width": 2
            },
            "type": "Feature"
        },
        {
            "geometry": {
                "coordinates": [
                    [
                        14.9468994140625,
                        57.7569377956732
                    ],
                    [
                        15.078735351562498,
                        58.06916140721414
                    ],
                    [
                        15.4302978515625,
                        58.09820267068277
                    ],
                    [
                        15.281982421875002,
                        58.318144965188246
                    ],
                    [
                        15.4852294921875,
                        58.36427519285588
                    ]
                ],
                "type": "LineString"
            },
            "properties": {
                "stroke": "#1f1a95",
                "stroke-opacity": 1,
                "stroke-width": 2
            },
            "type": "Feature"
        }
    ],
    "type": "FeatureCollection"
}
m = folium.Map(location=[ 56.7, 12.9], zoom_start=6)
folium.GeoJson(geoJsonData,
    style_function=lambda x: {
        'color' : x['properties']['stroke'],
        'weight' : x['properties']['stroke-width'],
        'opacity': 0.6,
        'fillColor' : x['properties']['fill'],
        }).add_to(m)
m

Le code source de folium sur git hub comprend également plusieurs exemples Nice:
https://github.com/python-visualization/folium/tree/master/examples
Vous trouverez ici les options pour jouer avec:
http://leafletjs.com/reference.html#path-options

J'espère que cela vous fera avancer!

3
volt