F#中Plotly.Net离线使用地理地图时本地JSON未生效问题
解决Plotly.Net离线运行地理地图仍请求CDN的问题
问题根源
你当前的代码只是将本地GeoJSON传入Chart.PointGeo的GeoJson参数,但这个参数是用来关联数据与地理边界的,并非替换Plotly默认加载的基础底图。默认情况下,Plotly.js会自动从CDN拉取预定义的world_110m.json作为geo图表的底图,哪怕你替换了JS文件路径,这个默认的资源请求逻辑依然存在。
解决方案
1. 完全禁用默认底图,使用本地GeoJSON绘制底图
修改代码,关闭默认底图加载,将本地GeoJSON作为独立图层添加到图表中:
open Plotly.NET open Newtonsoft.Json // 读取本地GeoJSON文件 let geoJsonString = IO.File.ReadAllText("world_110m.json") let geoJsonData = JsonConvert.DeserializeObject(geoJsonString) let baseMapOnly = // 创建空的点图表作为基础 Chart.PointGeo(locations = []) // 关闭默认的陆地、海岸线等底图元素 |> Chart.withGeoStyle( ShowLand = false, ShowCoastlines = false, ShowFrame = false ) // 添加本地GeoJSON作为自定义底图图层 |> Chart.withGeoJson(geoJsonData, [ GeoJsonFeatureStyle( FillColor = "lightgray", LineColor = "white", LineWidth = 0.5 ) ]) |> Chart.withMarginSize(0,0,0,0) baseMapOnly |> Chart.show
2. 配置Plotly.js离线资源路径(可选,保留默认底图逻辑)
若想继续使用Plotly的默认底图逻辑,需在生成的HTML中添加配置,覆盖远程资源路径:
- 加载本地
plotly-2.6.3.min.js后,插入以下配置脚本:
Plotly.setPlotConfig({ mapboxAccessToken: '', // 离线模式无需token // 覆盖地图资源的加载路径,指向本地文件 mapUrl: { 'world_110m': './world_110m.json', 'world_50m': './world_50m.json' } });
- 确保
world_110m.json与HTML文件路径匹配。
3. 直接生成带离线配置的HTML文件
避免手动修改HTML,通过Chart.toHTMLFile直接生成包含本地资源配置的文件:
let htmlContent = baseMapOnly |> Chart.toHTML( includePlotlyJS = false, // 不嵌入CDN的Plotly.js htmlDocumentOptions = HtmlDocumentOptions( HeadContent = """ <script src="./require.min.js"></script> <script src="./plotly-2.6.3.min.js"></script> <script> Plotly.setPlotConfig({ mapUrl: { 'world_110m': './world_110m.json' } }); </script> """ ) ) IO.File.WriteAllText("offline_map.html", htmlContent)
内容的提问来源于stack exchange,提问作者RAh
相关产品推荐
相关产品推荐

