Pegawai folium juga menyediakan beberapa kaedah yang lebih jelas untuk kita gunakan. Sama seperti kawalan lapisan. Nama kaedah rasmi ialah FeatureGroup, dan kaedah import adalah daripada folium import FeatureGroup, atau folium.FeatureGroup(). Saya tidak akan pergi ke butiran tentang prinsip khusus di sini, tetapi terutamanya melihat contoh:
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')
Fungsi North Pointer tidak semestinya diperlukan untuk peta, tetapi menambah Ia sentiasa baik untuk naik. Penggunaan FloatImage boleh mencapai fungsi ini, walaupun kandungan yang berkaitan tidak disebut dalam dokumentasi rasmi dan analisis kod sumber. Terdapat banyak pemalam yang disediakan dalam dokumentasi rasmi, yang paling banyak digunakan ialah kaedah HeatMap yang dipanggil peta haba.
Kaedah FloatImage melaksanakan meletakkan imej pada skrin dan menentukan saiz imej dan kedudukan pada skrin Parameter adalah integer (kaedah FloatImage melaksanakan penukaran peratusan). Berdasarkan kod kedua, kami menambahkan imej ke sudut kiri bawah.
fg.add_child(FloatImage(os.path.join(base, 'map_png', 'image', 'compass.png'), left=5, bottom=10, width=5))
folium official tidak menyediakan kaedah yang berkaitan untuk menambah js dan css Banyak kaedah di Internet harus diekstrak berdasarkan tafsiran kod sumber bercakap, Ia agak mudah, dan tiada arahan yang berkaitan tentang cara menambah js dan css.
Dapat diketahui daripada kod sumber bahawa fungsi peta dalam folium dilaksanakan melalui jinjia2 untuk memuatkan html untuk data dan peta.
Terdapat tiga kaedah utama untuk menambah data dan peta yang digunakan dalam kod sumber. Kaedah ini mempunyai kelemahan (hanya boleh ditambah di bahagian hadapan). Kaedah ini boleh digunakan dalam kebanyakan senario.
1.Header menambah js dan 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 menambah js dan 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 menambah js dan css
init_script = """ var mapsPlaceholder = []; L.Map.addInitHook(function () {mapsPlaceholder.push(this);}); """ # 加在script中 mo.get_root().script.add_child(folium.Element(init_script))
Langkah sebelumnya dilaksanakan penambahan js dan css di lokasi yang berbeza dalam. kaedah fail html, jika ia melibatkan operasi objek peta, mungkin terdapat situasi yang tidak memuaskan, seperti menambah garisan grid longitud dan latitud. Menyusahkan untuk melaksanakan fungsi garisan grid latitud dan longitud, terutamanya disebabkan oleh kesukaran berikut:
1 Tiada kaedah dan pemalam rasmi yang berkaitan (pada masa ini tiada); 2.folium bergantung pada leadlet.js untuk pelaksanaan Pustaka pihak ketiga, jika anda ingin melaksanakan garis longitud dan latitud, anda perlu biasa dengan risalah (hanya satu artikel berkaitan ditemui di Internet); >3. Artikel di atas dilengkapkan pada bahagian hadapan, dan tiada kaedah pelaksanaan bahagian belakang langsung.
4. Kaedah pelaksanaan bahagian hadapan adalah untuk membina peta secara langsung Di sini, objek penciptaan peta tidak tersedia (objek peta dijana secara rawak).
Bagaimana untuk menentukan garisan grid longitud dan latitud?
Kita perlu menyimpan objek semasa mencipta objek peta, kemudian dapatkan objek peta dan laksanakan garisan grid mengikut tahap zum. Tugas penting ialah memastikan kod JavaScript dibenamkan dengan betul ke dalam halaman HTML sebelum dan selepas mencipta objek peta.
Menyimpan objek dalam objek peta apabila ia dicipta telah dilaksanakan Dengan mengkaji kod sumber folium, kaedah menambah js telah ditulis semula untuk menambah js selepas objek peta dibuat.
halaman 1.html untuk melaksanakan grid latitud dan longitud<!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>
Melalui hubungan warisan kelas kod sumber, saya mewarisi kelas 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')
Atas ialah kandungan terperinci Cara menggunakan fungsi folium Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!