首页 > 其他分享 >postgres-earthdistance模块使用

postgres-earthdistance模块使用

时间:2023-04-29 20:00:25浏览次数:54  
标签:box postgres point 模块 earthdistance path circle select polygon

一、快速安装pg+postgis

使用docker安装

docker pull mdillon/postgis:latest

docker run --name postgresql -d -p 5432:5432 -v /home/pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 -e ALLOW_IP_RANGE=0.0.0.0/0 mdillon/postgis:latest

##如果碰到ipv4未开启需要在
vim /etc/sysctl.conf 
##加入net.ipv4.ip_forward = 1

systemctl restart network

sysctl net.ipv4.ip_forward
##显示这个就对了net.ipv4.ip_forward = 1

二、安装地理扩展包

1.使用数据库连接工具连接postgresql,并创建一个库

CREATE DATABASE postgis_demo;

2.新增pg扩展包

CREATE EXTENSION cube;
CREATE EXTENSION earthdistance;

三、earthdistance使用

  • 计算两个点之间的距离-earth_distance,返回结果为米
earth_distance(ll_to_earth(lat1, lng1), ll_to_earth(lat2, lng2))

使用示例

SELECT earth_distance(ll_to_earth(38.915, 115.404), ll_to_earth(39.915, 116.404));

-----结果(单位,米)------
earth_distance
140669.428977229
  • 搜索某个中心点500m范围内的所有点数据,并返回距离。
SELECT lat,lng,earth_distance(ll_to_earth(lat, lng), ll_to_earth(39.915, 116.404)) as distance
FROM t_point
WHERE earth_box(ll_to_earth(39.915000, 116.4040000), 500/1.609) @> ll_to_earth(lat, lng);

四、postgresql几何类型和函数

postgresql支持的几何类型如下表:

名字	存储空间	描述	表现形式
point	16字节	平面上的点	(x,y)
line	32字节	直线	{A,B,C}
lseg	32字节	线段	((x1,y1),(x2,y2))
box	32字节	矩形	((x1,y1),(x2,y2))
path	16+16n字节	闭合路径	((x1,y1),...)
path	16+16n字节	开放路径	[(x1,y1),...]
polygon	40+16n字节	多边形	((x1,y1),...)
circle	24字节	圆	<(x,y),r> 

操作符

操作符	描述	示例	结果
+	平移	select box '((0,0),(1,1))' + point '(2.0,0)';	(3,1),(2,0)
-	平移	select box '((0,0),(1,1))' - point '(2.0,0)';	(-1,1),(-2,0)
*	伸缩/旋转	select box '((0,0),(1,1))' * point '(2.0,0)';	(2,2),(0,0)
/	伸缩/旋转	select box '((0,0),(2,2))' / point '(2.0,0)';	(1,1),(0,0)
#	交点或者交面	select box'((1,-1),(-1,1))' # box'((1,1),(-1,-1))';	(1,1),(-1,-1)
#	path或polygon的顶点数	select #path'((1,1),(2,2),(2,1))';	3
@-@	长度或周长	select @-@ path'((1,1),(2,2),(2,1))';	3.41421356237309
@@	中心	select @@ circle'<(0,0),1>';	(0,0)
##	第一个操作数和第二个操作数的最近点	select point '(0,0)' ## lseg '((2,0),(0,2))';	(1,1)
<->	间距	select circle '<(0,0),1>' <-> circle '<(5,0),1>';	3
&&	是否有重叠	select box '((0,0),(1,1))' && box '((0,0),(2,2))';	t
<<	是否严格在左	select circle '((0,0),1)' << circle '((5,0),1)';	t
>>	是否严格在右	select circle '((0,0),1)' >> circle '((5,0),1)';	f
&<	是否没有延伸到右边	select box '((0,0),(1,1))' &< box '((0,0),(2,2))';	t
&>	是否没有延伸到左边	select box '((0,0),(3,3))' &> box '((0,0),(2,2))';	t
<<|	是否严格在下	select box '((0,0),(3,3))' <<| box '((3,4),(5,5))';	t
|>>	是否严格在上	select box '((3,4),(5,5))' |>> box '((0,0),(3,3))';	t
&<|	是否没有延伸到上面	select box '((0,0),(1,1))' &<| box '((0,0),(2,2))';	t
|&>	是否没有延伸到下面	select box '((0,0),(3,3))' |&> box '((0,0),(2,2))';	t
<^	是否低于(允许接触)	select box '((0,0),(3,3))' <^ box '((3,3),(4,4))';	t
>^	是否高于(允许接触)	select box '((0,0),(3,3))' >^ box '((3,3),(4,4))';	f
?#	是否相交	select lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))';	t
?-	是否水平对齐	select ?- lseg '((-1,1),(1,1))';	t
?-	两边图形是否水平对齐	select point '(1,0)' ?- point '(0,0)';	t
?|	是否竖直对齐	select ?| lseg '((-1,0),(1,0))';	f
?|	两边图形是否竖直对齐	select point '(0,1)' ?| point '(0,0)';	t
?-|	是否垂直	select lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))';	t
?||	是否平行	select lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))';	t
@>	是否包含	select circle '((0,0),2)' @> point '(1,1)';	t
<@	是否包含于或在图形上	select point '(1,1)' <@ circle '((0,0),2)';	t
~=	是否相同	select polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))';	t

函数

函数	返回值类型	描述	示例	结果
area(object)	double precision	面积	select area(circle'((0,0),1)');	3.14159265358979
center(object)	point	中心	select center(box'(0,0),(1,1)');	(0.5,0.5)
diameter(circle)	double precision	圆周长	select diameter(circle '((0,0),2.0)');	4
height(box)	double precision	矩形竖直高度	select height(box '((0,0),(1,1))');	1
isclosed(path)	boolean	是否为闭合路径	select isclosed(path '((0,0),(1,1),(2,0))');	t
isopen(path)	boolean	是否为开放路径	select isopen(path '[(0,0),(1,1),(2,0)]');	t
length(object)	double precision	长度	select length(path '((-1,0),(1,0))');	4
npoints(path)	int	path中的顶点数	select npoints(path '[(0,0),(1,1),(2,0)]');	3
npoints(polygon)	int	多边形的顶点数	select npoints(polygon '((1,1),(0,0))');	2
pclose(path)	path	将开放path转换为闭合path	select pclose(path '[(0,0),(1,1),(2,0)]');	 ((0,0),(1,1),(2,0))
popen(path)	path	将闭合path转换为开放path	select popen(path '((0,0),(1,1),(2,0))');	[(0,0),(1,1),(2,0)]
radius(circle)	double precision	圆半径	select radius(circle '((0,0),2.0)');	2
width(box)	double precision	矩形的水平长度	select width(box '((0,0),(1,1))');	1

类型转换函数

函数	返回类型	描述	示例	结果
box(circle)	box	圆形转矩形	select box(circle '((0,0),2.0)');	(1.41421356237309,1.41421356237309),(-1.41421356237309,-1.41421356237309)
box(point)	box	点转空矩形	select box(point '(0,0)');	(0,0),(0,0)
box(point, point)	box	点转矩形	select box(point '(0,0)', point '(1,1)');	(1,1),(0,0)
box(polygon)	box	多边形转矩形	select box(polygon '((0,0),(1,1),(2,0))');	(2,1),(0,0)
bound_box(box, box)	box	将两个矩形转换成一个边界矩形	select bound_box(box '((0,0),(1,1))', box '((3,3),(4,4))');	(4,4),(0,0)
circle(box)	circle	矩形转圆形	select circle(box '((0,0),(1,1))');	<(0.5,0.5),0.707106781186548>
circle(point, double precision)	circle	圆心与半径转圆形	select circle(point '(0,0)', 2.0);	<(0,0),2>
circle(polygon)	circle	多边形转圆形	select circle(polygon '((0,0),(1,1),(2,0))');	<(1,0.333333333333333),0.924950591148529>
line(point, point)	line	点转直线	select line(point '(-1,0)', point '(1,0)');	{0,-1,0}
lseg(box)	lseg	矩形转线段	select lseg(box '((-1,0),(1,0))');	[(1,0),(-1,0)]
lseg(point, point)	lseg	点转线段	select lseg(point '(-1,0)', point '(1,0)');	[(-1,0),(1,0)]
path(polygon)	path	多边形转path	select path(polygon '((0,0),(1,1),(2,0))');	((0,0),(1,1),(2,0))
point(double precision, double precision)	point	点	select point(23.4, -44.5);	(23.4,-44.5)
point(box)	point	矩形转点	select point(box '((-1,0),(1,0))');	(0,0)
point(circle)	point	圆心	select point(circle '((0,0),2.0)');	(0,0)
point(lseg)	point	线段中心	select point(lseg '((-1,0),(1,0))');	(0,0)
point(polygon)	point	多边形的中心	select point(polygon '((0,0),(1,1),(2,0))');	(1,0.333333333333333)
polygon(box)	polygon	矩形转4点多边形	select polygon(box '((0,0),(1,1))');	((0,0),(0,1),(1,1),(1,0))
polygon(circle)	polygon	圆形转12点多边形	select polygon(circle '((0,0),2.0)');	
((-2,0),(-1.73205080756888,1),(-1,1.73205080756888),(-1.22460635382238e-16,2),(1,1.73205080756888),(1.73205080756888,1),(2,2.4492127
0764475e-16),(1.73205080756888,-0.999999999999999),(1,-1.73205080756888),(3.67381906146713e-16,-2),(-0.999999999999999,-1.73205080756
888),(-1.73205080756888,-1))

polygon(npts, circle)	polygon	圆形转npts点多边形	select polygon(12, circle '((0,0),2.0)');	
((-2,0),(-1.73205080756888,1),(-1,1.73205080756888),(-1.22460635382238e-16,2),(1,1.73205080756888),(1.73205080756888,1),(2,2.4492127
0764475e-16),(1.73205080756888,-0.999999999999999),(1,-1.73205080756888),(3.67381906146713e-16,-2),(-0.999999999999999,-1.73205080756
888),(-1.73205080756888,-1))
polygon(path)	polygon	将path转多边形	select polygon(path '((0,0),(1,1),(2,0))');	((0,0),(1,1),(2,0))

标签:box,postgres,point,模块,earthdistance,path,circle,select,polygon
From: https://www.cnblogs.com/linmt/p/17364423.html

相关文章

  • OverTheWire攻关过程-Bandit模块9
    我们打开lv8-lv9关卡,查看信息机器翻译下一级的密码存储在文件数据中。txt并且是唯一一行只出现一次的文本难度增大了我们登陆服务器我们查看提示uniq命令sort命令知识点:uniq命令Linuxuniq命令用于检查及删除文本文件中重复出现的行列,一般与sort命令结合使用。uniq可检查文本......
  • [oeasy]python0141_自制模块_module_reusability_复用性
    自制包内容回忆上次内容上次导入了外部的py文件importmy_module导入一个自己定义的模块 可以使用my_module中的变量不能直接使用my_module.py文件中的变量只要加my_module.作为前缀就可以  直接导入导入变量、函数frommy_mo......
  • Python模块之struct
    0背景在工作中,有些二进制文件,是通过结构体写入文件而形成,我们有时候想解析这些文件,那如何操作呢?python的struct模块和C语言的结构体是相对应的,这样,只要知道结构体的定义,我们就可以通过struct模块写出一些解析工具。1.strcut模块介绍class struct.Struct(format)......
  • Linux kernel 模块开发&构建学习
    主要是学习下kernel模块的玩法,代码来自社区简单kernel代码hello_world.c#include<linux/init.h>#include<linux/module.h>MODULE_LICENSE("DualBSD/GPL");staticinthello_init(void){printk(KERN_ALERT"Hello,world\n");......
  • PostgreSQL
    PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,版本4.2为基础的对象关系型数据库管理系统(ORDBMS)。PostgreSQL支持大部分SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、多版本并发控制。同样,PostgreSQL可以用许多方法扩展,比如,通过增......
  • PostgreSQL技术大讲堂 - 第15讲:数据文件与块存储结构
     PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUGPG技术大讲堂。Part15:数据文件与块存储结构内容1:表的OID与数据文件对应关系......
  • 两个Lora 模块通信
    Softwarepreparationhttps://www.waveshare.net/w/upload/6/68/SX126X_LoRa_HAT_Code.zipHardwareconnectionToremoveM1andM2,adjustthecapinB.CommunicationstepsAfterrunningtheprogram,RaspberryPiAwillnotmoveafterrunningtheprogram;Raspberry......
  • AntDB数据库再获奖,亚信安慧被评为“2022PostgreSQL中国最佳创新企业”
    “中国PostgreSQL数据库生态大会”由中国开源软件推进联盟PostgreSQL分会&中科院软件所&CSDN联合举办,旨在引入更多技术资源、人才资源及校企合作资源,推进PostgreSQL在各行业和区域的推广与应用能力。本次榜单评选表彰了对PostgreSQL中国生态起到重大推动与贡献作用的企业与技术专家......
  • Python-运行库报错“ImportError: DLL load failed: 找不到指定的模块。”
    1.看到这个报错的一瞬间,以为是Pycharm有问题,加上公司的电脑,对于2020以后的版本的不适用,以为是Pycharm需要有改动。但是大费周章(不断安装卸载Pycharm)以后,依旧没有任何的改变。百度以后,说是第三方库的某个模块没有,让卸载三方库,重新安装。尝试过以后没有用。2.思考了两天,突然想到,这......
  • 解决 Error querying database. Cause: org.postgresql.util.PSQLException: ��������: �û� "p
    最近做数据库作业做得很崩溃,本来就没学过java,结果还要用mybatis+servlet+jsp,,,,,没办法还是得学啊TT遇到个特别无语的报错:###Errorqueryingdatabase. Cause:org.postgresql.util.PSQLException:��������:�û�"postgres"Password��֤ʧ��###Theerrormayexistincom/test/entity/gra......