当前位置: 首页 > 知识库问答 >
问题:

PostGis地理空间查询比自定义python脚本慢

钱展
2023-03-14

我在PostGis中很新,我正在使用它来执行地理空间查询,但它在返回所需结果时似乎很慢。

在此之前,我使用了一个python脚本,该脚本通常在大约5秒钟内返回结果(搜索120万个元素)。

为了更快地得到这个结果,我将问题转移到postgis上,但是,正如我之前所写的,同样的工作需要20秒以上的时间。

更准确地说,每个元素由一个点(lat lon)和一个字符串(点的标签)组成

我正在使用一个停靠的postgis(https://hub.docker.com/r/mdillon/postgis)在我的I7 16 gb内存上(ubuntu 18.04)

我用以下方式创建了数据库:

CREATE DATABASE demo;
\c demo
create extension postgis;
CREATE TABLE mypoints ( id serial primary key, name varchar(50), the_geom geometry(POINT,4326) );

并通过python脚本以这种方式插入点(1,2M)

INSERT INTO cities (the_geom, name) VALUES (ST_GeomFromText('POINT(-3.782 40.4351)',4326), 'point_label');

我使用的查询是:

select name from cities where ST_Distance_Sphere(the_geom,ST_GeomFromText('POINT(-3.713 40.4321)',4326))<500;

我做错什么了吗?我的python代码怎么可能比针对地理空间问题优化的查询更快?

共有1个答案

阎晋
2023-03-14

您没有充分利用PostGis,因为您还没有使用空间索引。

要在表中创建索引:

create index my_index_points_gist on mypoints using gist(the_geom);

然后在您的表上运行clusteranalyze

cluster mypoints using my_index_points_gist;
analyze mypoints;

我看到您使用的是球面距离,如果您使用的是地理类型,则会更好:

CREATE TABLE mypoints ( id serial primary key, name varchar(50), geog geography );

以通常的方式插入数据,向Geograhy类型添加强制转换:

INSERT INTO cities (geog, name) VALUES (ST_GeomFromText('POINT(-3.782 40.4351)',4326)::geography, 'point_label');

或者,只需添加一个额外的地理柱:

alter table mypoints add column geog::geography;
update table mypoints set geog = the_geom::geography;

创建索引,但这次使用geog

create index my_index_points_gist_geog on mypoints using gist(geog);
cluster mypoints using my_index_points_gist_geog;
analyze mypoints;

对于查询,您可以使用:

select name from cities
where ST_Distance(geog,ST_GeomFromText('POINT(-3.713 40.4321)',4326)::geog)<500;

或者更好:

select name from cities
where ST_DWITHIN(geog,ST_GeomFromText('POINT(-3.713 40.4321)',4326)::geog,500);

供参考:postgis地理类型

 类似资料:
  • 我有一个包含许多文档集合,其结构如下: 纬度范围为[25;55] 该收藏包含大约60万条记录。 我设置了2D_Sphere索引:db.myCollection.createIndex({location:“2DSphere”}) 我获得了所有的记录,但我只期望有几个记录(靠近我的坐标!) 有什么建议吗?提前致谢

  • 我在一个csv文件中有很多纬度/经度点,我创建了一个表,其中包含4326投影中的一个点(表邮政编码,字段位置) 我正在构建这样的数据:- 并将p存储在位置字段中。 问题是,我想找到一个给定点的“接近”记录。我在以下位置看到了一些有前途的代码:- https://github.com/rgeo/activerecord-postgis-adapter/blob/master/test/spatial

  • 有没有想过为什么使用Dociety的ODM会在同一个查询上返回零结果? 更新#1看起来教义\MongoDB\Query\Builder::near()L363有问题。方法参数忽略第二个值($Y)。因此只传递要执行的第一个值。

  • 1. 简介 分析云作为企业进行全域用户行为数据分析的数据中台,需要满足企业不同业务角色的各类差异化分析需求。 其中,对于企业深度结合业务模式的定制化需求,分析云平台提供了“自定义SQL查询”的功能,支持业务人员自行编辑复杂的 SQL 查询语言,实现对平台数据仓库中最底层的细粒度用户行为数据进行分析操作,以获取当前分析云平台既有数据模型无法覆盖的个性化分析需求的结果。 2. 使用说明 当前 sql

  • 我需要一些帮助。我试图创建一个自定义查询我在Wordpress中创建的自定义帖子,并使用Elementor Pro。 在我的帖子中,我添加了一个带有数字值的自定义字段“排序”,我想用它来手动排序帖子。 然而,我似乎无法让它发挥作用。 我正在使用最新的Elementor pro版本。 我试着按照他们页面上的说明:https://developers.elementor.com/custom-quer

  • 1. 简介 分析云作为企业进行全域用户行为数据分析的数据中台,需要满足企业不同业务角色的各类差异化分析需求。 其中,对于企业深度结合业务模式的定制化需求,分析云平台提供了“自定义SQL查询”的功能,支持业务人员自行编辑复杂的 SQL 查询语言,实现对平台数据仓库中最底层的细粒度用户行为数据进行分析操作,以获取当前分析云平台既有数据模型无法覆盖的个性化分析需求的结果。 2. 使用说明 当前 sql