Le responsable du folium nous fournit également des méthodes plus claires à utiliser. Tout comme le contrôle des calques. Le nom officiel de la méthode est FeatureGroup et la méthode d'importation provient de folium import FeatureGroup ou folium.FeatureGroup(). Je n'entrerai pas ici dans les détails des principes spécifiques, mais regarderai principalement les exemples :
import folium def map2png(map_data,out_file='pdf.png'): # 1.直接构造,默认底图 mo = folium.Map(location=[0, 0]) # 2.图层1-高德底图+数据 fg = folium.FeatureGroup() # 2.1 高德地图 fg.add_child(folium.TileLayer( tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}', attr="© <a href=http://ditu.amap.com/>高德地图</a>", min_zoom=0, max_zoom=19, control=True, zoom_control=False, show=True)) # 2.2添加一个点 fg.add_child(folium.Marker( location=[45.3311, -121.7113], popup="Timberline Lodge", icon=folium.Icon(color="green"))) # 2.3添加一个线形 fg.add_child(folium.PolyLine( locations=[[38.68,115.67], [38.85,115.48], [38.65,115.37], [38.68,115.67]], color='green', weight=2, opacity=1)) # 2.4添加一个面 fg.add_child(folium.Polygon( locations=[[38.68,115.67], [38.85,115.48], [38.65,115.37], [38.68,115.67]], color='green', weight=2, fill=True,fill_color = 'red')) # 2.5将我们的图层加入map mo.add_child(fg) # 3.图层2-重点数据+最上层 fg2 = folium.FeatureGroup() fg2.add_child(folium.Polygon( locations=[[38.68,115.67], [38.85,115.48], [38.65,115.37], [38.68,115.67]], color='green', weight=2, fill=True,fill_color = 'red')) mo.add_child(fg2) # 4.将图层fg2显示在最上层,keep_in_front的参数必须是FeatureGroup或TileLayer对象 mo.keep_in_front(fg2) # 5.根据范围缩放地图 mo.fit_bounds([[38.68,115.67], [38.85,115.48], [38.65,115.37], [38.68,115.67]]) root = mo.get_root() html = root.render() # 这个拿到的就是一个html的内容 # mo.save('text.html')
La fonction flèche nord n'est pas forcément nécessaire pour la carte, mais il est toujours bon de l'ajouter. L'utilisation de FloatImage peut réaliser cette fonction, bien que le contenu pertinent ne soit pas mentionné dans la documentation officielle et l'analyse du code source. Il existe de nombreux plug-ins fournis dans la documentation officielle, dont le plus utilisé est la méthode HeatMap appelée heat map.
La méthode FloatImage implémente le placement d'une image sur l'écran et la spécification de la taille de l'image et de la position sur l'écran. Les paramètres sont des entiers (la méthode FloatImage implémente la conversion en pourcentage). Sur la base du deuxième code, nous avons ajouté l'image dans le coin inférieur gauche.
fg.add_child(FloatImage(os.path.join(base, 'map_png', 'image', 'compass.png'), left=5, bottom=10, width=5))
folium ne fournit officiellement pas de méthodes pertinentes pour ajouter des js et des css. De nombreuses méthodes sur Internet doivent être extraites en fonction de l'interprétation du code source. Elles sont relativement simples et n'ont pas d'instructions spécifiques. . Ajoutez js et css pour les instructions pertinentes.
On peut savoir d'après le code source que la fonction de carte dans folium est implémentée via jinjia2 pour charger le HTML pour les données et la carte.
Il existe trois méthodes principales pour ajouter des données et des cartes utilisées dans le code source. Ces méthodes ont des défauts (ne peuvent être ajoutées qu'au début). Ces méthodes peuvent être utilisées dans la plupart des scénarios si elles n'impliquent pas d'opérations sur les objets cartographiques, ces trois méthodes peuvent répondre aux exigences.
1.header ajoute js et css
init_script = """ var mapsPlaceholder = []; L.Map.addInitHook(function () {mapsPlaceholder.push(this);}); """ # 加在header最上边 mo.get_root().header.add_child(folium.Element(init_script))
2.body ajoute js et css
init_script = """ var mapsPlaceholder = []; L.Map.addInitHook(function () {mapsPlaceholder.push(this);}); """ # 加在body中 mo.get_root().html.add_child(folium.Element(init_script))
3.script ajoute js et css
init_script = """ var mapsPlaceholder = []; L.Map.addInitHook(function () {mapsPlaceholder.push(this);}); """ # 加在script中 mo.get_root().script.add_child(folium.Element(init_script))
En une seule étape, la méthode d'ajout de js et de css à différents emplacements du fichier html est implémentée. Si cela implique le fonctionnement de l'objet cartographique, il peut y avoir des situations insatisfaisantes, comme l'ajout de lignes de grille de longitude et de latitude. Il est difficile de mettre en œuvre la fonction des lignes de grille de latitude et de longitude. Les principales difficultés sont les suivantes :
1 Il n'existe pas de méthodes et de plug-ins officiels pertinents (actuellement aucun)
2. bibliothèque qui s'appuie sur leadlet.js pour implémenter la latitude et la longitude. Vous devez être familier avec leaflet (un seul article connexe a été trouvé sur Internet
3. L'article ci-dessus est complété par le front-end). méthode d’implémentation back-end directe.
4. La méthode d'implémentation frontale consiste à construire directement la carte. Ici, l'objet de création de carte n'est pas disponible (l'objet carte est généré aléatoirement).
Comment déterminer les lignes du quadrillage de latitude et de longitude ?
Nous devons stocker l'objet lors de la création de l'objet cartographique, puis récupérer l'objet cartographique et implémenter les lignes de la grille en fonction du niveau de zoom. Une tâche importante consiste à s'assurer que le code JavaScript est correctement intégré dans la page HTML avant et après la création de l'objet cartographique.
Parmi eux, le stockage de l'objet en quatre a été implémenté lors de la création de l'objet cartographique. En étudiant le code source du folium, la méthode d'ajout de js a été réécrite pour ajouter des js après la création de l'objet cartographique.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" rel="external nofollow" /> <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script> <title>leaflet-经纬网格</title> <style> html, body { width: 100%; height: 100%; padding: 0; margin: 0; } .leaflet-div-icon { background: none; border: none; } </style> </head> <body> <div id="map" ></div> <script> let map = L.map("map", { renderer: L.canvas({ padding: 0.5 }) }).setView( [25.127879288597576, 118.37905883789064], 4 ); // 添加背景图层 L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { attribution: '© <a href="https://www.openstreetmap.org/copyright" rel="external nofollow" >OpenStreetMap</a> contributors', }).addTo(map); // 创建图层 let lonLatGridLineLayer = L.featureGroup().addTo(map); // 经纬网格生成方法 let addLonLatLine = () => { let zoom = map.getZoom(); let bounds = map.getBounds(); let north = bounds.getNorth(); let east = bounds.getEast(); // 经纬度间隔 let d = 90 / Math.pow(2, zoom - 1); // 经线网格 for (let index = -180; index <= 360; index += d) { // 判断当前视野内 if (bounds.contains([north, index])) { // 绘制经线 let lonLine = L.polyline( [ [-90, index], [90, index], ], { weight: 1, color: "blue" } ); lonLatGridLineLayer.addLayer(lonLine); // 标注 let text = index.toFixed(1) + "°"; // 动态计算小数位数 if (zoom > 10) { text = index.toFixed((zoom - 8) / 2) + "°"; } let divIcon = L.divIcon({ html: `<div >${text}</div>`, iconAnchor: [0, -5], }); let textMarker = L.marker([north, index], { icon: divIcon }); lonLatGridLineLayer.addLayer(textMarker); } } if(d>90)d=90; // 纬线网格 for (let index = -90; index <= 90; index += d) { if (bounds.contains([index, east])) { let lonLine = L.polyline( [ [index, -180], [index, 360], ], { weight: 1, color: "blue" } ); lonLatGridLineLayer.addLayer(lonLine); // 标注 let text = index.toFixed(1) + "°"; if (zoom > 10) { text = index.toFixed((zoom - 8) / 2) + "°"; } let divIcon = L.divIcon({ html: `<div >${text}</div>`, iconAnchor: [(text.length + 1) * 6, 0], }); let textMarker = L.marker([index, east], { icon: divIcon }); lonLatGridLineLayer.addLayer(textMarker); } } }; addLonLatLine(); map.on("zoomend move", () => { lonLatGridLineLayer.clearLayers(); addLonLatLine(); }); </script> </body> </html>
Grâce à la relation d'héritage de classe du code source, j'ai hérité de la classe MacroElement.
from branca.element import MacroElement, from jinja2 import Template from folium.vector_layers import path_options class Jwwg(MacroElement): """自定义经纬线网格""" _template = Template(""" {% macro script(this, kwargs) %} var map = mapsPlaceholder.pop(); // 创建图层 let lonLatGridLineLayer = L.featureGroup().addTo(map); // 经纬网格生成方法 let addLonLatLine = () => { let zoom = map.getZoom(); let bounds = map.getBounds(); let north = bounds.getNorth(); let east = bounds.getEast(); // 经纬度间隔 let d = 90 / Math.pow(2, zoom - 1); // 经线网格 for (let index = -180; index <= 360; index += d) { // 判断当前视野内 if (bounds.contains([north, index])) { // 绘制经线 let lonLine = L.polyline( [ [-90, index], [90, index], ], {weight: 1, color: "blue"} ); lonLatGridLineLayer.addLayer(lonLine); // 标注 let text = index.toFixed(1) + "°"; // 动态计算小数位数 if (zoom > 10) { text = index.toFixed((zoom - 8) / 2) + "°"; } let divIcon = L.divIcon({ html: `<div >${text}</div>`, iconAnchor: [0, -5], }); let textMarker = L.marker([north, index], {icon: divIcon}); lonLatGridLineLayer.addLayer(textMarker); } } if (d > 90) d = 90; // 纬线网格 for (let index = -90; index <= 90; index += d) { if (bounds.contains([index, east])) { let lonLine = L.polyline( [ [index, -180], [index, 360], ], {weight: 1, color: "blue"} ); lonLatGridLineLayer.addLayer(lonLine); // 标注 let text = index.toFixed(1) + "°"; if (zoom > 10) { text = index.toFixed((zoom - 8) / 2) + "°"; } let divIcon = L.divIcon({ html: `<div >${text}</div>`, iconAnchor: [(text.length + 1) * 6, 0], }); let textMarker = L.marker([index, east], {icon: divIcon}); lonLatGridLineLayer.addLayer(textMarker); } } }; addLonLatLine(); map.on("zoomend move", () => { lonLatGridLineLayer.clearLayers(); addLonLatLine(); }); {% endmacro %} """) def __init__(self, **kwargs): super(Jwwg, self).__init__() self._name = 'Jwwg' self.options = path_options(line=True, **kwargs)
import folium def map2png(map_data,out_file='pdf.png'): # 1.直接构造,默认底图 mo = folium.Map(location=[0, 0]) # 2.图层1-高德底图+数据 fg = folium.FeatureGroup() # 2.1 高德地图 fg.add_child(folium.TileLayer( tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}', attr="© <a href=http://ditu.amap.com/>高德地图</a>", min_zoom=0, max_zoom=19, control=True, zoom_control=False, show=True)) # 2.2添加一个点 fg.add_child(folium.Marker( location=[45.3311, -121.7113], popup="Timberline Lodge", icon=folium.Icon(color="green"))) # 2.3添加一个线形 fg.add_child(folium.PolyLine( locations=[[38.68,115.67], [38.85,115.48], [38.65,115.37], [38.68,115.67]], color='green', weight=2, opacity=1)) # 2.4添加一个面 fg.add_child(folium.Polygon( locations=[[38.68,115.67], [38.85,115.48], [38.65,115.37], [38.68,115.67]], color='green', weight=2, fill=True,fill_color = 'red')) # 2.5将我们的图层加入map mo.add_child(fg) # 5.根据范围缩放地图 mo.fit_bounds([[38.68,115.67], [38.85,115.48], [38.65,115.37], [38.68,115.67]]) # 网格线 init_script = """ var mapsPlaceholder = []; L.Map.addInitHook(function () {mapsPlaceholder.push(this);}); """ mo.get_root().script.add_child(folium.Element(init_script)) Jwwg().add_to(mo) root = mo.get_root() html = root.render() # 这个拿到的就是一个html的内容 # mo.save('text.html')
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!