首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在不将其写入磁盘的情况下从GeoDataframe,GeoPandas返回shp文件?

如何在不将其写入磁盘的情况下从GeoDataframe,GeoPandas返回shp文件?
EN

Stack Overflow用户
提问于 2022-01-24 12:18:14
回答 1查看 238关注 0票数 2

我在烧瓶中有一个小服务,它是一个geoJson,并返回一个带有.shp、.dbf和.shx文件的zip。我可以使用函数gdf.to_file('file.shp')返回这个压缩文件,但是我不想在磁盘中写入,因为它将花费更多的时间并缩短设备的寿命(我的服务将在一天内被调用超过一千次)。我该怎么做?下面是我使用的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask, request, send_file
import json
import geopandas as gpd
import io
from zipfile import ZipFile
import os

app = Flask(__name__)
@app.route('/geojson2shp', methods=['POST'])
def result():
    geojson = json.loads(request.values['geojson'])
    gdf = gpd.GeoDataFrame.from_features(geojson['features'])

    currentPath = os.path.dirname(os.path.abspath(__file__))

    gdf.to_file(currentPath+'/tmp/file.shp',  driver='ESRI Shapefile')

    zipObj = ZipFile(currentPath+'/tmp/sample.zip', 'w')
    zipObj.write(currentPath+'/tmp/file.shp')
    zipObj.write(currentPath+'/tmp/file.dbf')
    zipObj.write(currentPath+'/tmp/file.shx')
    zipObj.close()

    return send_file(currentPath+'/tmp/sample.zip', attachment_filename='sample.zip')

编辑:

我一直在寻找一种在Fiona中使用BytesIO的方法,多亏了@matthew-borish链接和@marat提示,我找到了它。通过下面的代码,我只使用内存创建了一个.shp文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def resultWithMemory():
    geojson = json.loads(request.values['geojson'])
    gdf = gpd.GeoDataFrame.from_features(geojson['features'])

    shp = io.BytesIO()
    gdf.to_file(shp,  driver='ESRI Shapefile')

    zip_buffer = io.BytesIO()
    with ZipFile(zip_buffer, 'w') as zf:
        zf.writestr("file.shp", shp.getbuffer())
    zip_buffer.seek(0)
    
    return send_file(zip_buffer, attachment_filename='sample.zip', as_attachment=True)

但是它有一个小问题:.shx和.dbf文件没有出现在"shp“BufferIO对象中。为什么?稍后我将研究Fiona源代码,并尝试找到它。

EN

回答 1

Stack Overflow用户

发布于 2022-01-24 18:41:36

您可以以时间戳作为密钥,将gdfs存储在一个小块中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import datetime
gdf_dict = {}

def result():
    # geojson = json.loads(request.values['geojson'])
    # gdf = gpd.GeoDataFrame.from_features(geojson['features'])
    
    # dummy df for demo purposes
    gdf = gpd.GeoDataFrame(geometry=[LineString([(1, 1), (4, 4)]),
                                            LineString([(1, 4), (4, 1)]),
                                            LineString([(6, 1), (6, 6)])])

    return gdf

每次调用服务时,都可以将结果存储在gdf_dict中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gdf_dict[datetime.datetime.now()] = result()

如果你愿意,你可以保存到光盘偶尔用泡菜。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with open('gdf.pickle', 'wb') as handle:
    pickle.dump(gdf_dict, handle)

反之亦然。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with open('gdf.pickle', 'rb') as handle:
    from_pickle = pickle.load(handle)

如果您愿意的话,可以按时间戳进行搜索。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_gdfs(gdf_dict, from_date_str, to_date_str):
    return sorted((k, v) for k, v in gdf_dict.items() if from_date_str <= k <= to_date_str)


gdfs_by_date = get_gdfs(gdf_dict, datetime.datetime(2022, 1, 21, 17, 46, 30, 408735), datetime.datetime(2023, 1, 22, 17, 48, 30, 408735))

或者,或者结合上面的一些内容,您可以使用pd.concat()组合gdfs和任何查询的datetimeindex。如果你对此很好奇,请留言,我可以提供更新。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70839961

复制
相关文章
为什么Handler会导致内存泄漏?
最近在思考关于内存泄露的问题,进而想到了关于我们最常见和熟知的Handler在Activity内导致的内存泄漏的问题,这个问题相信作为开发都是很熟悉的,但是这背后更多的细节和导致泄漏的不同的情况,可能很多人就没有那么了解和清楚了,因此这次和大家分享一下什么情况下会导致内存泄漏,以及内存泄漏背后的故事。
没关系再继续努力
2021/11/22
1.3K0
360导致内存泄漏
360安全卫士导致内存泄漏,这点肯定,已得到360技术人员确认。其他安全软件是否会导致,未验证,maybe,只有你自己亲测一下了。
Windows技术交流
2022/03/01
3.1K1
关于presenter一直持有Activity对象导致的内存泄漏问题
public abstract class BasePresenter<T> { /** * 当内存不足释放内存 */ protected WeakReference<T> mViewRef; // view 的弱引用 /** * bind p with v * @param view */ public void attachView(T view){ mViewRef = new WeakReferenc
用户4458175
2020/02/12
1.4K0
ThreadLocal导致内存泄漏排查小记
公司sso域名变动,所有涉及的产品都要修改相关的配置。配置修改好之后,运行期间发现业务系统不稳定,出现了很多json解析异常。但是随着sso那边问题得到修改,我们自己的产品也逐渐稳定起来,但查看日志发现多条内存泄露的日志,于是本着学习的心态,对具体的原因进行了粗略的分析,最终得出的结论是异常导致threadLocal.remove()方法没有执行,最后内存泄漏了,以下是本人定位问题的过程。
写一点笔记
2022/08/11
9550
ThreadLocal导致内存泄漏排查小记
ThreadLocal真的会造成内存泄漏吗?
ThreadLoca在并发场景中,应用非常多。前几天有位小伙伴问我一个问题,说ThreadLocal是不是真的会造成内存泄漏?今天给大家做一个分享,个人见解,仅供参考。如果大家有其他见解可以在评论区讨论。
Tom弹架构
2022/08/22
6280
ThreadLocal真的会造成内存泄漏吗?
对象数组的内存图解
对象数组的概述和案例(掌握) (1)对象数组的概述     数组既可以存储基本数据类型,也可以存储引用类型。它存储引用类型的时候的数组就叫对象数组。 (2)对象数组的案例     我有5个学生,请把这个5个学生的信息存储到数组中,并遍历学生数组,获取得到每一个学生的信息。
黑泽君
2018/10/12
1.7K0
动态/静态数组内存布局
上一节 简单介绍了结构体作为函数参数和返回值的情况。本文准备介绍一下数组的内存布局,即静态数组/动态数组和一维数组/二维数组,顺便介绍一下0长度数组的妙用。
chinchao.xyz
2022/04/25
7740
动态/静态数组内存布局
笔记——安卓优化(十八)
一、优化 1.布局优化:尽量减少布局文件层级嵌套,由于RelativeLayout会onMeasure两次,减慢绘制时间,所以,简单布局使用LinearLayout,复杂的用RelativeLayout。使用include标签,merage标签,ViewStub控件加大布局控件的复用率。 2.绘制优化:尽量避免在onDraw方法内做大量的操作。比如不要创建新的局部对象,不要做耗时操作。 3.内存泄漏优化:非静态内部类默认持有外部引用,静态内部类默认不持有外部引用;单例模式导致的内存泄漏,单例的生命周期与application保持一致,由于创建单例时的activity无法被及时释放;属性动画导致的,无限循环动画没有在onDestroy中终止和释放,应该调用animator.cancle()停止动画。 内存泄漏与解决总结
木溪bo
2019/07/26
4730
笔记——安卓优化(十八)
2021年Android面试题及答案收集(不断更新中)
如何招聘人,搜集了一些知识点。如何做好应聘准备,也收集了一些主要知识点,供你参考。
全栈程序员站长
2022/07/28
9070
Android中导致内存泄漏的竟然是它----Dialog
一. 内存泄漏的 Bug 猛增 最近在 App 进行 mokey 测试的时候检测到一些内存泄漏问题。在前天的测试中,楼主一瞬间收到了4个这样的 Bug 单,瞬间心理无比纠结,真有千万只羊驼向我奔来。 登录页面出现内存泄漏??!!楼主的代码是如此的完美而无懈可击,这么可能出现这么多泄漏的问题? 插播什么是 Activity 泄漏:Android 中 Activity 代表一个页面,拥有一段生命周期,生命周期结束后,Activity 对象应当在之后某个合适的时机被 VM 回收内存。出现了泄漏就意味着 Ac
腾讯Bugly
2018/03/23
3.4K0
Android中导致内存泄漏的竟然是它----Dialog
Java中当对象不再使用时,不赋值为null会导致什么后果 ?
点击上方蓝色“程序猿DD”,选择“设为星标” 回复“资源”获取独家整理的学习资料! 作者 | zhantong 来源 | https://www.polarxiong.com 前言 许多Java开发者都曾听说过“不使用的对象应手动赋值为null“这句话,而且好多开发者一直信奉着这句话;问其原因,大都是回答“有利于GC更早回收内存,减少内存占用”,但再往深入问就回答不出来了。 鉴于网上有太多关于此问题的误导,本文将通过实例,深入JVM剖析“对象不再使用时赋值为null”这一操作存在的意义,供君参考。本文尽量
程序猿DD
2023/04/17
6400
Java中当对象不再使用时,不赋值为null会导致什么后果 ?
数组访问越界_数组越界会导致什么问题
所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语言程序中最常见的错误之一。
全栈程序员站长
2022/11/11
1.6K0
Hive语法内关于With as 的数据是否会缓存到内存分析
  WITH AS短语,也叫做子查询部分(subquery factoring),可以定义一个SQL片断,该SQL片断可以被后面的SQL语句引用,从而使SQL语句的可读性更高。
挽风
2021/12/07
1.3K0
记一次使用Zookeeper C API导致的内存泄漏
可以看到 definitely lost: 24 bytes in 1 blocks
扫帚的影子
2018/09/05
1.7K0
内存泄漏
这个笔记是记录一下,关于内存泄漏的知识,之前我们就知道了,如果要用堆必须要释放堆的内存,如果不释放会产生很多的内存垃圾和碎片,影响系统运行效率,甚至出错。
用户7272142
2023/10/11
2990
内存泄漏
面试造火箭,看下这些大厂Android中高级岗面试原题
面试造火箭,工作拧螺丝,虽然我只想拧螺丝,可是我需要用造火箭的技术去寻找拧螺丝的工作,如何能在面试过程中让自己处于不败的地步呢,刷题是一个比较好的捷径,今天就汇总了一些比较经典的面试题进行了汇总,分享给大家。
Android技术干货分享
2021/06/15
6380
面试造火箭,看下这些大厂Android中高级岗面试原题
内存管理:判断对象是否存活
在堆里面存放着 Java 世界中几乎所有的对象实例,垃圾收集器在对 Java 堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)。
真正的飞鱼
2023/04/03
4320
Android 知识简记:资深架构师带你快速回顾Android各种知识!
1.网络 2.Java 基础&容器&同步&设计模式 3.Java 虚拟机&内存结构&GC&类加载&四种引用&动态代理 4.Android 基础&性能优化&Framwork 5.Android 模块化&热修复&热更新&打包&混淆&压缩 6.音视频&FFmpeg&播放器
Android技术干货分享
2019/08/06
8880
Android 知识简记:资深架构师带你快速回顾Android各种知识!
Android性能优化之内存优化
Tips:本篇是《深入探索Android内存优化》的基础篇,如果没有掌握Android内存优化的同学建议系统学习一遍。
做个快乐的码农
2021/11/23
2.6K0
Android性能优化之内存优化
Android系统性能优化
快,稳,省,小,这四点很形象的代表了性能的四个方面,同时也让我们知道我们App现在是否是款性能良好的APP,如果有一项不达标,那么说明我们的应用有待优化。
用户9253515
2021/12/22
6180

相似问题

对静态属性的引用是否会导致内存泄漏

12

定义静态列表会导致内存泄漏吗?

45

静态Stack<Activity>会导致内存泄漏吗?

12

在非静态方法中使用静态成员是否会导致内存泄漏?

10

C++静态数组导致内存泄漏?

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文