需求:
在a表中有1000个点,b表中有5000条线路,现在需要一次查询a表中1000个点的最近线路。
我知道在postgis中可以通过ST_Distance实现快速查询,但每次只能查询a表中的1个点,自己太菜了不能够把这1000点一次性全部查询出来。弄了好久都没成功。最终还是通过python和postgis结合的方式总算实现了目的。

1、postgis ST_Distance()的查询方法如下,能查询出a表中id=1的点它最近的线路。

SELECT a.id,a.点名称,b.id,b.线路名称,a.geom::geography<->b.geom::geography "Distance"
FROM "a_point" a, "b_road" b
WHERE a.id=1
ORDER BY ST_Distance(a.geom, b.geom)  asc
limit 1

上面为SQL语句,每次只能查询1个点,自己对SQL实在是太生疏了,没找到高级的方法来解决它。

2、通过python和postgis数据库相结合的方式也可以来解决查询需求。

import psycopg2
import datetime
import pandas as pdif __name__ == "__main__":st_time = datetime.datetime.now()connect_ = psycopg2.connect(database="postgis_33_sample",user="*****", password="*****",host="127.0.0.1",port="5432")cursor_ = connect_.cursor()  # 创建游标对象sql1 = '''select * from tqdian'''  # sql1查询该数据库一共有多少条数据cursor_.execute(sql1)  # 执行sql1命令numb = cursor_.rowcountdf2 = []  # 定义df2,用于存放查询结果for n in range(1, numb + 1):sql2 = '''SELECT a.id,a.点名称,b.id,b.线路名称,a.geom::geography<->b.geom::geography "Distance"FROM "a_point" a, "b_road" bWHERE a.id = %sORDER BY ST_Distance(a.geom, b.geom)  asclimit 1'''parameter_ = (n,)  # 这里使用变量参数%s查询的方法,利用id查询cursor_.execute(sql2, parameter_)  # 执行sql2count_ = cursor_.fetchone()  # 抓取结果connect_.commit()  # 事物提交df2.append(count_)print("查询进度:", "{:.2%}".format(n / (numb + 1)))print("恭喜,查询完成。")cursor_.close()connect_.close() # 关闭数据库连接ed_time = datetime.datetime.now()print("查询时长: ", ed_time - st_time)df2 = pd.DataFrame(df2)df2.to_excel(r'd:\查询结果_ST_Distance.xlsx', encoding='gb18030', index=None)

通过此方法可以在几十秒内完成查询,虽然有点慢,但总算还是实现了。
后面发现有更好的方法再更新吧。

通过python操作postsql的最近距离查询相关推荐

  1. python 操作mysql 返回字典_Python查询Mysql时返回字典结构的代码

    MySQLdb默认查询结果都是返回tuple,输出时候不是很方便,必须按照0,1这样读取,无意中在网上找到简单的修改方法,就是传递一个cursors.DictCursor就行. 默认程序: MySQL ...

  2. python获取数据库列名_python sqlite3 查询操作及获取对应查询结果的列名

    记录查询操作及获取查询结果列字段的方法 1.sqlite3 中获取所有表名及各表字段名的操作方法 SQLite 数据库中有一个特殊的表叫 sqlite_master,sqlite_master 的结构 ...

  3. python数据库模糊查询_Python操作mongodb数据库进行模糊查询操作示例

    本文实例讲述了Python操作mongodb数据库进行模糊查询操作.分享给大家供大家参考,具体如下: # -*- coding: utf-8 -*- import pymongo import re ...

  4. ES(Elasticsearch)基本查询总结(含docker安装,python操作)

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 官网:https://www.elastic.co/guide/index.html 搜索语法:https://www.elastic.co/guid ...

  5. 表操作,数据操作,单表查询,python操作数据库

    1.表操作 创建 create table 删除 drop table 查看表结构 desc 表/show create table 表 修改 alter table 表名 rename 新表名 al ...

  6. Docker selenium自动化 - 使用python操作docker,python运行、启用、停用和查询容器实例演示

    Docker selenium 自动化 - 使用 Python 操作 docker 运行.启用.停用和查询容器实例演示 第一章:Python 操作 docker ① python 运行 docker ...

  7. Python操作Mysql实例代码教程在线版(查询手册)_python

    实例1.取得MYSQL的版本 在windows环境下安装mysql模块用于python开发 MySQL-python Windows下EXE安装文件下载 复制代码 代码如下: # -*- coding ...

  8. Python操作Mysql实例代码教程(查询手册)

    2019独角兽企业重金招聘Python工程师标准>>> 本文介绍了Python操作MYSQL.执行SQL语句.获取结果集.遍历结果集.取得某个字段.获取表字段名.将图片插入数据库.执 ...

  9. 跟我学python之mysql操作详解 一、查询操作

    在python中,我们使用PyMySQL来操作mysql. 一.安装PyMySQL: 使用pip进行安装,命令为: pip install PyMySQL 二.在进行操作之前,首先要打开本机的mysq ...

最新文章

  1. 启明云端分享| sigmstar SSD201/SSD202D/SSD210/SSD212开机动画启动到底能做到多少
  2. Boost:双图bimap与property地图的测试程序
  3. LOL手游2.3版本终于来临,国服玩家满意新增的皮肤吗?
  4. mysql cmd链接不上数据库情况汇总
  5. 您的UX库不只是书籍
  6. LeetCode 1727. 重新排列后的最大子矩阵(前缀和+排序)
  7. dataAdapter与dataSet和dataTable的填充
  8. java虚拟机相同吗_Java虚拟机是否真的是与VMWare或Parallels文件相同的虚拟机?
  9. pytorch卷积模型定义
  10. python垃圾回收离职_垃圾回收gc.md
  11. 渗透测试工具——漏洞扫描工具
  12. Java堆栈的简单图示
  13. tomcat5下get请求中文乱码
  14. Jquery 对 身份证号码的验证 (15/18位)
  15. 1.5-20:球弹跳高度的计算
  16. 宇视摄像机巡航和自动跟踪哪个优先级高?
  17. 梳理学习技术的脉络,助你一臂之力
  18. (VKL系列)超低功耗LCD液晶显示驱动IC-VKL076 SSOP28,19*4 76点阵,超低工作电流约7.5微安,适用水电表/温湿度计/温控器/传感器等,FAE技术支持
  19. macos iTerm2 优化
  20. 物联网(IOT)之常见物联网通信技术概览-无线篇③

热门文章

  1. 响应式编程项目中总结
  2. layui-mini+spring boot实现table搜索操作传参
  3. Maven 如何处理传递性依赖
  4. linux如何用命令寻找环境变量?
  5. eNSP网络仿真软件配置局域网vlan
  6. 数字图像处理的数学变换(三)逻辑运算
  7. MATLAB函数var、std浅析
  8. 动手搭手脚架(一):后台管理系统(springcload)的思维导图
  9. 最好的在线SQL优化平台 - PawSQL Cloud来了
  10. (186)Verilog HDL:3位线性反馈移位寄存器