将Plotly散点图导出为kml - python

3

能否将Plotly散点图导出为kml文件?我有一个使用matplotlib的示例,但是否可能使用Plotly执行相同的输出?

Plotly图是散点图。它可以转换为kml输出吗?当尝试导出为kml时,我返回了一个错误。

import plotly.express as px
import geopandas as gpd
import simplekml
import matplotlib.pyplot as ppl
from pylab import rcParams

gdf = gpd.read_file(gpd.datasets.get_path("naturalearth_cities"))

gdf['LON'] = gdf['geometry'].x
gdf['LAT'] = gdf['geometry'].y

fig = px.scatter_mapbox(data_frame = gdf, 
                               lat = 'LAT', 
                               lon = 'LON',
                               zoom = 1,
                               mapbox_style = 'carto-positron', 
                               )

fig.show()

fig.write_image('test.kml')

输出:

ValueError: Invalid format 'kml'.
Supported formats: ['png', 'jpg', 'jpeg', 'webp', 'svg', 'pdf', 'eps', 'json']

您需要从Plotly创建一个地面叠加图像,还是只需将纬度/经度坐标和城市名称导出为KML中的矢量图层中的Placemarks? - CodeMonkey
我正在使用这个数据集作为示例。我所处理的数据是不同的。我还使用Plotly创建了不同的输出,包括热力图。我正试图将这些图形导出为kml文件。 - jonboy
2个回答

2

如果您想从“naturalearth_cities”数据集生成一组带有点几何的地标KML,则可以直接使用to_file()函数从GeoDataFrame创建KML。您可以跳过在plotly中显示数据。

请注意,默认情况下,Fiona(由geopandas使用)禁用KML,因此必须在使用之前启用它。

将GeoDataFrame写入KML输出的Python代码:

import geopandas as gpd

gdf = gpd.read_file(gpd.datasets.get_path("naturalearth_cities"))

# enable KML driver which is disable by default
gpd.io.file.fiona.drvsupport.supported_drivers['KML'] = "rw"

# With newer versions of Fiona, you might need to use libkml
gpd.io.file.fiona.drvsupport.supported_drivers['LIBKML'] = "rw"

gdf.to_file('test.kml', driver='KML')

输出:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document id="root_doc">
    ...
    <Placemark id="test.200">
        <name>Paris</name>
        <ExtendedData>
          <SchemaData schemaUrl="#test.schema">
            <SimpleData name="LON">2.33138946713035</SimpleData>
            <SimpleData name="LAT">48.8686387898146</SimpleData>
          </SchemaData>
        </ExtendedData>
        <Point>
          <coordinates>
            2.33138946713035,48.8686387898146,0
          </coordinates>
        </Point>
    </Placemark>
...

如果您想要为KML输出添加自定义样式,可以遍历GeoDataFrame并使用simplekml创建KML。


谢谢。那么,如果要将点数据添加到kml输出中,您会使用gpd文件吗? - jonboy
gpd 是 geopandas 包的别名。 - CodeMonkey
@jonboy 上面的代码会生成可用的KML输出吗? - CodeMonkey
“naturalearth_cities” 数据只是一个示例。我有自定义点数据和自定义 Plotly 图表。我希望复制相同的 matplotlib 过程(在问题中概述),但更换为 Plotly。 - jonboy

-1
理论上,您应该能够(借助其他库的帮助,如plotly.subplot)。
使用 plotly.subplot 的 plotly_figure_to_gdf() 函数,您可以将 Plotly 散点图转换为 GeoDataFrame
这将返回一个包含点数据的 GeoDataFrame,您可以使用它们来使用 simplekml 库创建 KML 文件。 也许您可以尝试类似这样的东西?
import plotly.subplots as sp
import plotly.graph_objs as go
import geopandas as gpd
import simplekml

# Example Plotly scatter figure
fig = go.Figure(go.Scattermapbox(
    latitude=["45.5231"],
    longitude=["-122.6765"],
    mode="markers",
    marker=go.scattermapbox.Marker(size=12),
))

# Convert Plotly figure to a GeoDataFrame
gdf = sp.plotly_figure_to_gdf(fig)

# Create the KML file
kml = simplekml.Kml()
for index, row in gdf.iterrows():
    kml.newpoint(name=str(index), coords=[(row['geometry'].x, row['geometry'].y)])
kml.save("scatter.kml")

我遇到了一个属性错误:模块'plotly.subplots'没有'plotly_figure_to_gdf'属性。 - jonboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接