首页 > 编程问答 >如何在闪亮的应用程序中从geodataframe下载geopackage文件?

如何在闪亮的应用程序中从geodataframe下载geopackage文件?

时间:2024-07-30 05:29:39浏览次数:17  
标签:python geometry geopandas py-shiny geopackage

我有一个 shiny 应用程序,它使用 folium 在地图上显示多个图层。 我想让用户能够将其中一个图层(线串地理数据框)下载为地理包文件。 这是我到目前为止的代码:

# relevant imported packages
from shiny import App, render, ui, reactive
import pandas as pd
import geopandas as gpd

# code in the ui for the download button
ui.download_button(id="downloadRoute", label="Get the route file"),

# code in the server function
@output
@render.download
def downloadRoute():
    result_value = result()
    route = result_value['route_detailed']
    with io.BytesIO() as buffer:
        route.to_file(buffer, driver='GPKG')
        buffer.seek(0)
        return ui.download(filename="my_route.gpkg", file=buffer.read(), content_type="application/geopackage+sqlite3")

我已经验证 route 实际上是一个有效的地理数据框。如果我在闪亮之外下载它,它是一个有效的地理包。

在闪亮中,单击下载按钮不会在 UI 上执行任何操作。它只在控制台中打印此错误:

500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "pyogrio\_io.pyx", line 1268, in pyogrio._io.ogr_create
  File "pyogrio\_err.pyx", line 177, in pyogrio._err.exc_wrap_pointer
pyogrio._err.CPLE_OpenFailedError: sqlite3_open(<_io.BytesIO object at 0x000002494BFCE3E0>) failed: unable to open database file   

 

我做错了什么?我还有其他方法可以实现这一目标吗?


在闪亮应用程序中遇到错误是因为试图将 geopackage 写入存储在内存中的 BytesIO 对象,而不是文件系统上的实际文件。然后,当闪亮尝试读取此 BytesIO 对象以提供下载时,它会遇到问题,因为它预计文件路径是有效的。

以下是如何使用服务器端临时文件修复代码的方法:

from shiny import App, render, ui, reactive
import pandas as pd
import geopandas as gpd
import tempfile
import os

# ui 中的下载按钮代码
ui.download_button(id="downloadRoute", label="获取路线文件"),

# 服务器函数中的代码
@output
@render.download
def downloadRoute():
    result_value = result()
    route = result_value['route_detailed']

    # 创建一个临时文件
    with tempfile.NamedTemporaryFile(delete=False, suffix=".gpkg") as tmp:
        filepath = tmp.name
        # 将 geodataframe 保存到临时文件
        route.to_file(filepath, driver='GPKG')

    # 返回一个下载处理程序,该处理程序将在发送后删除临时文件
    return ui.download(
        filename="my_route.gpkg",
        content=lambda: open(filepath, "rb").read(),
        content_type="application/geopackage+sqlite3",
        on_done=lambda: os.remove(filepath),
    )

这个修改后的代码做了以下工作:

  1. 创建一个临时文件: 它使用 tempfile.NamedTemporaryFile() 创建一个唯一的临时文件,该文件在发送后将被删除。
  2. 将 geodataframe 保存到文件: 它使用 geopandas to_file() 方法将 route geodataframe 保存到创建的临时文件中。
  3. 返回下载处理程序: 它返回一个 ui.download 处理程序,该处理程序执行以下操作:
    • 将文件名设置为 my_route.gpkg
    • 使用 content 参数读取并提供临时文件的内容。
    • 设置正确的 content_type
    • 使用 on_done 参数确保在将文件发送到浏览器后删除临时文件。

通过这种方法,正在创建一个可以通过 ui.download 处理的有效文件,从而防止出现错误并允许用户下载 geopackage 文件。

标签:python,geometry,geopandas,py-shiny,geopackage
From: 78808868

相关文章

  • Python 3 写入 DBF(带有 Memo 的 dBase IV)
    我需要在Python3中写入带有备注字段的dBaseIVdbf文件,但找不到合适的模块来执行此操作。我尝试过的包:Simpledbf-只读dbf-不支持dBaseIVdbfpy-不支持Python3dbfpy3-不支持dBaseIVYDbf-不支持备注字段pyshp-无法仅使用dbf文件......
  • Robin-Stocks Python 中的 order_buy_fractional_by_price 问题
    我在Robin-StocksPython包中的order_buy_fractional_by_price函数中遇到问题。在正常市场交易时间内下达以美元为基础的买入订单时,该订单被错误地设置为限价订单。对我来说看起来有问题的代码似乎是导致此问题的原因。我尝试在包管理器中本地修改或删除有问题的代码,但遇......
  • 在python中使用turtle绘制图案(带点)
    我正在尝试使用python中的海龟制作一幅赫斯特画(点图案)。我设法实现了它。Hirst_painting_dot_pattern但是我的for循环没有按照我预期的方式工作。它省略了最后一次迭代。在下面的代码中,我的for循环没有生成最后一个点。因此,我在循环末尾添加了一行来制作最后......
  • 使用 Python 进行 QuantLib Vanilla 掉期定价 - 错误
    我真的需要帮助...我有一个使用QuantLib构建自己的VanillaSwapPricer的项目。我想根据ois掉期的市场价格进行计算以进行贴现,并根据Euribor6M掉期+FRA进行预测固定。总而言之,我的目标是尽可能接近彭博社对标准Euribor6M掉期的定价(贴现ois)-fwdEuribor6M)。......
  • 我正在制作一个可以打开wav文件的python程序,我想知道wav文件的格式是什么
    因此,我已经通过此网站的研究编写了验证并读取wav标头的代码。但我想知道,data段中的数据是如何存储的?它们位于16位部分中,彼此相邻放置。我认为在Audacity中制作440hz正弦波,然后导出它,会显示一些结果,并且字节确实看起来更整齐,但仍然像废话一样接缝。相信我,我已经......
  • python - 面板库 - PasswordInput 不会对回车做出反应
    我试图避免需要提交按钮。以下代码当前正在远程jupyter实验室运行。仅当光标焦点从密码小部件中移除后,才会打印该消息。我想要回车来触发消息打印。有什么线索吗?frompanel.widgetsimportPasswordInput,TextInputpn.extension()defon_enter(event=None):message_p......
  • 即使安装了软件包,也找不到 python 模块句子转换器
    对于我的python脚本(如下所示),我使用句子转换器包,其中包含SBERT模型。即使在执行“piplist”时明确列出该软件包,并且还安装了torch,所有内容都更新到最新版本,但仍然找不到该模块。脚本:importnumpyasnpimportpandasaspdfromsentence_transformersimportSenten......
  • 有没有办法在 python 中返回类实例的布尔属性?
    我想组织我玩的游戏中的汽车数据。为此,我创建了一个“Car”类。我希望将此类实例的一些属性作为布尔值,这样我就可以将此类的所有实例放入列表中并过滤它们。我当前的解决方案不起作用,因为,我收到以下错误消息:TypeError:__repr__returnednon-string(typeCar)我使用......
  • python 正则表达式匹配一行中的多个单词而不转到下一行
    我正在编写一个解析器来解析以下输出:admin@str-s6000-on-5:~$showinterfacestatusEthernet4InterfaceLanesSpeedMTUAliasVlanOperAdminTypeAsymPFC------------------------------------------......
  • 使用 Python 平滑和对称不规则形状和曲线
    我需要完成三项任务:正则化曲线曲线的对称性完成不完整的曲线例如,这里是输入和预期的输出图像:输入输出|||在一般设置中,形状可以由任何SVG曲线基元(贝塞尔曲线、直线、弧线)表示。为了统一表示,示例包含曲线的折线近似。这些折线保存为......