postgresql 中postgis的使用,查看一个点是否在矩形范围内

本文详细介绍了在PostgreSQL数据库中利用PostGIS进行空间数据管理的技巧,包括如何创建并操作几何对象,如点、线、多边形等,以及如何判断点是否位于特定的多边形范围内。通过示例代码展示了如何使用ST_Contains函数实现这一功能。

http://www.jsjtt.com/shujuku/postgresql/12.html


postgresql 中postgis的使用,查看一个点是否在矩形范围内

查看某一个点是否在某个多边形内  使用ST_Contains函数

--LINESTRING ( 121.312350 30.971457 , 121.156783 31.092221 , 121.353250 31.278195 , 121.509125 31.157431 , 121.312350 30.971457 )  是把连续的点围成一个多边形

--st_point(a,b) 表示为一个点

--查看某一个点是否在某个多边形内 返回t表示在范围内
SELECT  ST_Contains( ST_MakePolygon(ST_GeomFromText('LINESTRING ( 121.312350 30.971457 , 121.156783 31.092221 , 121.353250 31.278195 , 121.509125 31.157431 , 121.312350 30.971457 ) ')) ,st_point(121.332378,31.07106) )
--查看某一个点是否在某个多边形内 返回f表示不在范围内
SELECT  ST_Contains( ST_MakePolygon(ST_GeomFromText('LINESTRING ( 121.312350 30.971457 , 121.156783 31.092221 , 121.353250 31.278195 , 121.509125 31.157431 , 121.312350 30.971457 ) ')) ,st_point(121.632378,31.07106) )

 

----------------

PostgreSQL 是一种对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大、特性最丰富和最复杂的自由软件数据库系统。它起源于伯克利(BSD)的数据库研究计划,目前是最重要的开源数据库产品开发项目之一, 有着非常广泛的用户。PostGIS在对象关系型数据库PostgreSQL上增加了存储管理空间数据的能力,相当于Oracle的spatial部分。PostGIS最大的特点是符合并且实现了OpenGIS的一些规范,是最著名的开源GIS数据库。

PostGIS特性

  PostGIS支持所有的空间数据类型,这些类型包括:点(POINT)、线 (LINESTRING)、多边形(POLYGON)、多点(MULTIPOINT)、多线(MULTILINESTRING)、多多边形 (MULTIPOLYGON)和集合对象集(GEOMETRYCOLLECTION)等。PostGIS支持所有的对象表达方法,比如WKT和WKB。   PostGIS支持所有的数据存取和构造方法,如GeomFromText()、AsBinary(),以及GeometryN()等。   PostGIS提供简单的空间分析函数(如Area和Length)同时也提供其他一些具有复杂分析功能的函数,比如Distance。   PostGIS提供了对于元数据的支持,如GEOMETRY_COLUMNS和SPATIAL_REF_SYS,同时,PostGIS也提供了相应的支持函数,如AddGeometryColumn和DropGeometryColumn。   PostGIS提供了一系列的二元谓词(如Contains、Within、Overlaps和Touches)用于检测空间对象之间的空间关系,同时返回布尔值来表征对象之间符合这个关系。   PostGIS提供了空间操作符(如Union和Difference)用于空间数据操作。比如,Union操作符融合多边形之间的边界。两个交迭的多边形通过Union运算就会形成一个新的多边形,这个新的多边形的边界为两个多边形中最大边界。


SQL中计算两地经纬度是否在50米范围内,需要先根据经纬度计算出两地的距离,然后比较该距离是否小于等于50米。不同的数据库系统实现方式有所不同,以下以常见的数据库为例进行说明。 ### MySQL 在MySQL中,可以使用自定义函数来计算两点间的距离。根据引用[2],在城市范围内(距离一般不超过200多千米),可认为经线和纬线垂直,通过计算南北方向距离和东西方向距离,再求矩形对角线距离。以下是示例代码: ```sql -- 创建自定义函数计算两点间距离 DELIMITER // CREATE FUNCTION GetDistance(lon1 DOUBLE, lat1 DOUBLE, lon2 DOUBLE, lat2 DOUBLE) RETURNS DOUBLE DETERMINISTIC BEGIN DECLARE x DOUBLE; DECLARE y DOUBLE; DECLARE distance DOUBLE; -- 假设地球半径(单位:米) SET @R = 6371000; -- 计算南北方向距离(单位:米) SET x = @R * RADIANS(lat2 - lat1); -- 计算东西方向距离(单位:米) SET y = @R * RADIANS(lon2 - lon1) * COS(RADIANS((lat1 + lat2) / 2)); -- 计算两点间距离(单位:米) SET distance = SQRT(x * x + y * y); RETURN distance; END // DELIMITER ; -- 查询两地经纬度是否在50米范围内 SELECT CASE WHEN GetDistance('121.506656', '31.245087', '121.508883', '31.243481') <= 50 THEN '是' ELSE '否' END AS within_50_meters; ``` ### PostgreSQLPostgreSQL中,可以使用PostGIS扩展来处理地理空间数据,计算两点间的距离。以下是示例代码: ```sql -- 安装PostGIS扩展(如果未安装) CREATE EXTENSION IF NOT EXISTS postgis; -- 创建示例表 CREATE TABLE locations ( id SERIAL PRIMARY KEY, point1 GEOGRAPHY(POINT, 4326), point2 GEOGRAPHY(POINT, 4326) ); -- 插入示例数据 INSERT INTO locations (point1, point2) VALUES ( ST_GeographyFromText('POINT(121.506656 31.245087)'), ST_GeographyFromText('POINT(121.508883 31.243481)') ); -- 查询两地经纬度是否在50米范围内 SELECT CASE WHEN ST_Distance(point1, point2) <= 50 THEN '是' ELSE '否' END AS within_50_meters FROM locations; ```
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值