PostgreSQL中使用插件earthdistance进行经纬度距离计算,并进行排序返回结果集

news/2024/7/9 20:53:36 标签: postgresql, 数据库

PostgreSQL中使用插件earthdistance进行经纬度距离计算,并进行排序返回结果集

  • 安装 `earthdistance` 模块
  • 创建记录表
  • 添加测试数据
  • 计算北京和上海之间的距离
  • 按照距离远近对城市进行排序
  • 计算任意两个城市之间的距离,并按照距离远近对城市进行排序
  • 添加 GiST 索引

安装 earthdistance 模块

首先,我们需要在 PostgreSQL 中安装 earthdistance 模块,以便进行地理位置的计算。可以通过以下命令进行安装:


CREATE EXTENSION earthdistance;

-- CREATE EXTENSION IF NOT EXISTS cube;
-- CREATE EXTENSION IF NOT EXISTS earthdistance;

创建记录表

安装完成后,我们可以创建一个包含城市名称、经度和纬度信息的表,可以使用以下命令:

CREATE TABLE cities (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    location POINT
);

或者

CREATE TABLE cities (
  id SERIAL PRIMARY KEY,
  name TEXT,
  location POINT
);

添加测试数据

接下来,我们可以向表中插入一些数据,例如:

INSERT INTO cities (name, location) VALUES
    ('北京', POINT(116.4074, 39.9042)),
    ('上海', POINT(121.4737, 31.2304)),
    ('广州', POINT(113.2644, 23.1291)),
    ('深圳', POINT(114.0579, 22.5431)),
    ('成都', POINT(104.0665, 30.5723)),
    ('杭州', POINT(120.1551, 30.2741)),
    ('武汉', POINT(114.3054, 30.5931)),
    ('重庆', POINT(106.5507, 29.5647)),
    ('西安', POINT(108.9402, 34.3416)),
    ('南京', POINT(118.7969, 32.0603));

INSERT INTO cities (name, location) VALUES
  ('New York', '(40.7128, -74.0060)'),
  ('Los Angeles', '(34.0522, -118.2437)'),
  ('Chicago', '(41.8781, -87.6298)'),
  ('Houston', '(29.7604, -95.3698)'),
  ('Phoenix', '(33.4484, -112.0740)'),
  ('Philadelphia', '(39.9526, -75.1652)'),
  ('Dallas', '(32.7767, -96.7970)'),
  ('San Jose', '(37.3382, -121.8863)');

计算北京和上海之间的距离

接下来,我们可以计算任意两个城市之间的距离,并按照距离远近进行排序。例如,如果我们想要计算北京和上海之间的距离,可以使用以下命令:

SELECT earth_distance(ll_to_earth(39.9042, 116.4074), ll_to_earth(31.2304, 121.4737)) AS distance;

按照距离远近对城市进行排序

这将返回一个浮点数,表示两个城市之间的距离(单位为米)。如果我们想要按照距离远近对城市进行排序,可以使用以下命令:

SELECT name, earth_distance(location, POINT(116.4074, 39.9042)) AS distance
FROM cities
ORDER BY distance;

计算任意两个城市之间的距离,并按照距离远近对城市进行排序

可以计算任意两个城市之间的距离,并按照距离远近对城市进行排序

SELECT
  c1.name AS city1,
  c2.name AS city2,
  earth_distance(ll_to_earth(c1.location[1], c1.location[0]), ll_to_earth(c2.location[1], c2.location[0])) / 1000 AS distance_km
FROM
  cities c1
  CROSS JOIN cities c2
WHERE
  c1.id < c2.id
ORDER BY
  distance_km;

这将返回一个包含城市名称和距离的结果集,按照距离从近到远进行排序。

添加 GiST 索引

最后,我们可以为表中的 location 列添加 GiST 索引,以加速查询。可以使用以下命令:

CREATE INDEX idx_cities_location ON cities USING gist (location);

这将为 location 列创建一个 GiST 索引,从而加速距离计算和排序。

现在,我们可以使用索引来加速距离计算和排序操作:

SELECT
  c1.name AS city1,
  c2.name AS city2,
  earth_distance(ll_to_earth(c1.location[1], c1.location[0]), ll_to_earth(c2.location[1], c2.location[0])) / 1000 AS distance_km
FROM
  cities c1
  CROSS JOIN cities c2
WHERE
  c1.id < c2.id
ORDER BY
  c1.location <-> c2.location;

注意,这里我们使用了 <-> 运算符来计算两个点之间的距离,它利用了 GiST 索引的支持,可以更快地计算距离并排序。


http://www.niftyadmin.cn/n/458269.html

相关文章

ROS:结构

目录 前言一、设计者二、维护者三、系统架构四、ROS自身结构 前言 从不同的角度&#xff0c;对ROS架构的描述也是不同的&#xff0c;一般我们可以从设计者、维护者、系统结构与自身结构4个角度来描述ROS结构: 一、设计者 ROS设计者将ROS描述为“ROS Plumbing Tools Capab…

数据领域新宠——数据编织 | 趋势解读

最近在日常的工作和跟客户的交流中&#xff0c;频繁谈及“数据编织”这个词&#xff0c;我开始关注数据编织是源于对主动式数据治理和数据编排的研究&#xff0c;从现在的趋势来看&#xff0c;数据编织显然已经进入落地阶段。数据编织正在从一个概念、一个理念向一线生产场景演…

Godot 4 源码分析 - 代码自动补全流程

使用Godot 4过程中&#xff0c;有一点比较吸引我&#xff1a;代码自动补全 用RAD开发时&#xff0c;代码自动补全功能一直被吐槽&#xff0c;主要是速度慢 但我看Godot 4中的Script编写过程中&#xff0c;代码补全很快&#xff0c;这个可以研究一下。 研究代码可找到&#x…

浅析 GeoServer CVE-2023-25157 SQL注入

原创稿件征集 邮箱&#xff1a;eduantvsion.com QQ&#xff1a;3200599554 黑客与极客相关&#xff0c;互联网安全领域里 的热点话题 漏洞、技术相关的调查或分析 稿件通过并发布还能收获 200-800元不等的稿酬 更多详情&#xff0c;点我查看&#xff01; 简介 GeoServer是一个开…

电气综合自动化中“四遥”功能概述

“四遥”功能概述 在电力系统中&#xff0c;“四遥”通常指的是四个测量参数&#xff0c;分别是&#xff1a;遥测、遥信、遥控 和 遥调。这些参数用于远程监测、控制和调整电力系统的运行。 遥测&#xff08;Telemetry&#xff09;&#xff1a; 通过远程传输数据来监测电力系…

python yield 和return区别

if 开始分级日志 in message: #self.process_id_to_bus_seq.clear() #self.gapslist.clear() # 记录加到缓存 #self.gapslist.add(message) date_str datetime.now().strftime("%Y%m%d") …

EMC学习笔记(八)阻抗控制(二)

阻抗控制&#xff08;二&#xff09; 1.差分阻抗控制1.1 当介质厚度为5mil时的差分阻抗随差分线间距的变化趋势1.2 当介质厚度为13mil时的差分阻抗随差分线间距的变化趋势1.3 当介质厚度为25mil时的差分阻抗随差分线间距的变化趋势 2.屏蔽地线对阻抗的影响2.1 地线与信号线之间…

状态估计器

文章目录 [toc] 1.状态空间模型1.1.连续状态空间模型1.2.离散状态空间模型 2.矩阵微积分3.二次规划4.概率论4.1.期望与方差4.2.独立事件4.3.向量随机变量4.4.噪声与协方差矩阵4.5.条件概率 5.最小二乘估计5.1.加权最小二乘估计5.2.递推最小二乘估计5.3.状态向量和协方差随时间变…