免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 19342 | 回复: 2

PostGis 计算最近距离的点好慢呀 [复制链接]

论坛徽章:
0
发表于 2013-05-31 16:59 |显示全部楼层
本帖最后由 zhn158 于 2013-05-31 17:55 编辑

两张表,第一张表是grid,共28万多条记录如下:
  1. CREATE TABLE grid
  2. (
  3.   id serial NOT NULL,
  4.   x integer,
  5.   y integer,
  6.   closestdistance double precision,
  7.   geom geometry(Polygon,2335),
  8.   CONSTRAINT grid_pkey PRIMARY KEY (id)
  9. )

  10.   CREATE INDEX idx_grid_geom ON grid USING gist(geom);
复制代码
第二张表cell_p, 共2万多条记录,结构如下
  1. CREATE TABLE cell_p
  2. (
  3.   id character varying NOT NULL,
  4.   geom geometry(Point,2335),
  5.   CONSTRAINT cell_p_pkey PRIMARY KEY (id)
  6. )

  7.   CREATE INDEX idx_cell_p_geom ON cell_p USING gist(geom);


复制代码
要对表grid中的每个点,在表cell_p中找出最近的点,并用到该点的距离更新表grid 中closestdistance的值,试了很多中方法都很慢,最快的更新2500条记录差不多需要近5分钟,求教更好的办法

我试过的最快的方法如下:
  1. #distance.py
  2. import psycopg2

  3. def knnDistance3(geom):
  4.     dbname = 'postgis20'
  5.     conn = psycopg2.connect("dbname=%s user=postgres" % (dbname))
  6.     cur = conn.cursor()
  7.     ewkt = "'%s'::GEOMETRY" %(geom)
  8.     table = "cell_p"
  9.     sql = "SELECT ST_Distance(geom, %s) AS distance FROM %s \
  10.             ORDER BY geom<->%s limit 1" % (ewkt,table,ewkt)
  11.     cur.execute(sql)
  12.     return round(cur.fetchall()[0][0])
复制代码
  1. import distance
  2. import psycopg2

  3. conn = psycopg2.connect("dbname=postgis20 user=postgres")
  4. cur = conn.cursor()
  5. cur.execute("SELECT id, ST_AsEWKT(geom) FROM public.grid order by id")
  6. for id, geom in cur.fetchall():
  7.     l = distance.knnDistance3(geom)
  8.     cur.execute("UPDATE public.grid SET closestdistance=%f WHERE id=%s" % (l,id))
  9.     print id,l
  10. conn.commit()
复制代码

论坛徽章:
0
发表于 2013-06-01 07:31 |显示全部楼层
有点儿冷清呀

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-08-24 10:39 |显示全部楼层
没有研究过GIS,但这点数据,应该不会这么慢吧?
看你把GRID表的28万条数据,全部一次拉到前端来扫描,好像不是个好办法呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP