postgresql 计算距离的实例(单位直接生成米)

之前用的是ST_Distance 函数,但是貌似需要进行一次单位的转换,而且网上有说那种转换不是特别准确,现在暂时将该算法记录在此:

select st_distance(ST_GeomFromText('POINT(120.451737 36.520975)',900913),ST_GeomFromText('POINT(120.455636 36.520885)',900913))*60*1.852;

这里的计算方式倒是可以换坐标系,但是,测试了两个坐标系都没有起作用。而且该种方式转换过单位后跟arcgis计算出的结果相差甚远,最终决定使用下面的方式;

今天发现了另外一种方式来计算距离,这种方式可以直接生成单位为米的结果:

select ST_Length(Geography(ST_GeomFromText('LINESTRING(120.451737 36.520975,120.455636 36.520885)')));

这种方式的不便在于:

1.要把点转换成线或者其他的图形而不是点;

2.geography函数现在只支持4326坐标系,不能换成其他的。

追加:

上面的方式是计算点到点的距离,但是如果要想知道某一个点到某条线的距离是不是在某个范围内,又该如何计算呢;如下:

select ST_Contains(St_Astext(ST_Buffer(geography(geomfromtext('MULTILINESTRING((线的坐标点))')),25.00{以米为单位的距离})),st_astext(geography(geomfromtext('POINT(121.37805 37.54142)')))) as result

使用类似上面的方式,就可以输入以米为单位的距离判断某个点是否在某个距离范围内;

补充:postgresql 搜索指定距离内的记录 按近到远排序 并返回距离

实例如下:

CREATE TABLE mylocation (
 id SERIAL PRIMARY KEY,
 geom GEOMETRY(Point, 4326),
 name VARCHAR(128),
 x double precision,
 y double precision
); 

INSERT INTO mylocation (geom,name,x,y) VALUES (
 ST_GeomFromText('POINT(0.0001 0)', 4326),'zhangsan',0.0001,0
);
INSERT INTO mylocation (geom,name,x,y) VALUES (
 ST_GeomFromText('POINT(0.001 0)', 4326),'zhangsan',0.001,0
);
INSERT INTO mylocation (geom,name,x,y) VALUES (
 ST_GeomFromText('POINT(0.001 0)', 4326),'zhangsan',0.001,0
);
INSERT INTO mylocation (geom,name,x,y) VALUES (
 ST_GeomFromText('POINT(0.1 0)', 4326),'zhangsan',0.1,0
); 

SELECT id, name,geom,x,y,  ST_DistanceSphere(
           geom,
           ST_GeometryFromText('POINT(0 0)')) distance
FROM mylocation
WHERE ST_DWithin(
 geom,
 ST_GeomFromText('POINT(0 0)', 4326),
 0.001
)ORDER BY distance asc;;

查询语句 下面距离单位为m

SELECT id, name,geom,x,y,  ST_DistanceSphere(
           geom,
           ST_GeometryFromText('POINT(0 0)')) distance
FROM mylocation
WHERE ST_DWithin(
 geom::geography,
 ST_GeomFromText('POINT(0 0)', 4326)::geography,
 1000
) ORDER BY distance asc;

搜索结果

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Postgresql的select优化操作(快了200倍)

    对于庞大的数据,检索sql的编写要格外小心,有很多平时不注意的sql可能就会变成瓶颈. 比如, 我们有个系统, 其中t96_pd_log表,记录数8000w多,在开发阶段乃至用了那么多年都没问题, 最近却发生频繁死锁的问题, 查数据库后台发现问题出在一个select语句上, 它耗时高达2.4-2.7s,这对于一个需要高并发的系统来说当然是致命的. 数据表t96_pd_log有两条index, 一条的字段组成是f96_mgtbarcd,另一条的字段组成是f96_result_type, 检索sql

  • postgresql 除法保留小数位的实例

    我就废话不多说了,大家还是直接看代码吧~ \x select 8/(100-3) as c1, round(8/(100-3) ,4) as c2, round(8/(100-3)::numeric ,4) as c3, 8/(100-3)::numeric as c4 ; -[ RECORD 1 ]-------------- c1 | 0 c2 | 0.0000 c3 | 0.0825 c4 | 0.08247422680412371134 (1 row) 补充:PostgreSQL整数除法

  • postgreSql分组统计数据的实现代码

    1. 背景 比如气象台的气温监控,每半小时上报一条数据,有很多个地方的气温监控,这样数据表里就会有很多地方的不同时间的气温数据 2. 需求: 每次查询只查最新的气温数据按照不同的温度区间来分组查出,比如:高温有多少地方,正常有多少地方,低温有多少地方 3. 构建数据 3.1 创建表结构: -- DROP TABLE public.t_temperature CREATE TABLE public.t_temperature ( id int4 NOT NULL GENERATED ALWAYS

  • postgresql 计算两点距离的2种方法小结

    postgresql计算两点距离 下面两种方法: select ST_Distance( ST_SetSRID(ST_MakePoint(115.97166453999147,28.716493914230423),4326)::geography, ST_SetSRID(ST_MakePoint(106.00231199774656,29.719258550486572),4326)::geography ), ST_Length( ST_MakeLine( ST_MakePoint(115.

  • PostgreSQL 性能优化之服务器参数配置操作

    大家好!我是只谈技术不剪发的 Tony 老师.今天我们来聊聊 PostgreSQL 的性能优化:数据库优化是一个系统的工程,本文只专注于服务器的参数配置优化. 默认安装时,PostgreSQL 的配置参数通常都偏小,不太适合作为生产服务器使用.所以,安装 PostgreSQL 数据库之后首先需要执行的操作就是对服务器的配置参数进行调整. 查看/设置参数值 我们使用 PostgreSQL 12,服务器的配置参数有 300 多个,运行时的参数值可以使用 SHOW 命令查看: show server_

  • Postgresql 动态统计某一列的某一值出现的次数实例

    实例解析: select to_char(log.date, 'yyyy-MM-dd HH24') as hour, log.exten, sum(case log.grade when '1' then 1 else 0 end) as "1", sum(case log.grade when '2' then 1 else 0 end) as "2", sum(case log.grade when '3' then 1 else 0 end) as "

  • postgresql 计算距离的实例(单位直接生成米)

    之前用的是ST_Distance 函数,但是貌似需要进行一次单位的转换,而且网上有说那种转换不是特别准确,现在暂时将该算法记录在此: select st_distance(ST_GeomFromText('POINT(120.451737 36.520975)',900913),ST_GeomFromText('POINT(120.455636 36.520885)',900913))*60*1.852; 这里的计算方式倒是可以换坐标系,但是,测试了两个坐标系都没有起作用.而且该种方式转换过单位

  • android获取附近蓝牙设备并计算距离的实例代码

    需要用到本地蓝牙适配器 // 获取本地蓝牙适配器 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 判断是否支持蓝牙,并确认打开该功能. // 判断手机是否支持蓝牙 if (mBluetoothAdapter == null) { Toast.makeText(this, "设备不支持蓝牙", Toast.LENGTH_SHORT).show(); finish(); } // 判断是否打开蓝牙 if (!mBlueto

  • postgresql 计算时间差的秒数、天数实例

    处理时间时用到了,记录一下. 时间差天数 select '2017-12-10'::date - '2017-12-01'::date; 时间差秒数 select extract(epoch FROM (now() - (now()-interval '1 day') )); select trunc(extract(epoch FROM (now() - (now()-interval '1 day') ))::numeric); select trunc(extract(epoch FROM

  • PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法

    根据IP获取访客所在国家/城市/经纬度 安装GeoIP扩展: sudo apt-get install libgeoip-dev pecl install geoip-1.1.0 注意:Beta版要指定版本号.如果是apt安装的PHP,直接安装php5-geoip这个包即可. php.ini中加入: extension=geoip.so geoip.custom_directory="/usr/share/GeoIP" 免费下载GeoLiteCity数据库(解压后18MB): http

  • Android获取经纬度计算距离介绍

    经度指示南北方向,纵向纬度指示东西方向,横向 获取经纬度 使用GPS权限: 复制代码 代码如下: <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> Android提供LocationManager和Location,可以方便的获得经纬度.海拔等位置.使用LocationManager来获得位置管理类,从而可以获得历史GPS信息以及位

  • python计算auc指标实例

    1.安装scikit-learn 1.1Scikit-learn 依赖 Python (>= 2.6 or >= 3.3), NumPy (>= 1.6.1), SciPy (>= 0.9). 分别查看上述三个依赖的版本, python -V 结果:Python 2.7.3 python -c 'import scipy; print scipy.version.version' scipy版本结果:0.9.0 python -c "import numpy; print

  • PHP根据两点间的经纬度计算距离

    这是一个不错的示例,直接贴代码,首先要知道纬度值.经度值 /** * @desc 根据两点间的经纬度计算距离 * @param float $lat 纬度值 * @param float $lng 经度值 */ function getDistance($lat1, $lng1, $lat2, $lng2) { $earthRadius = 6367000; //approximate radius of earth in meters /* Convert these degrees to r

  • SQLSERVER 根据地图经纬度计算距离差示例

    SQL SERVER 根据地图经纬度计算距离的公式 复制代码 代码如下: go --创建经纬度距离计算函数 CREATEFUNCTION [dbo].[fnGetDistance] --LatBegin 开始经度 --LngBegin 开始维度 (@LatBegin REAL, @LngBegin REAL, @LatEnd REAL, @LngEnd REAL) RETURNSFLOAT AS BEGIN --距离(千米) DECLARE @Distance REAL DECLARE @EAR

  • vue超时计算的组件实例代码

    需要对预约单进行超时计算,但是后台和客户端时间不能保证一定一直,所以后台返回客户提交时间和请求结束时间的时间差进行计算. 效果如下(此处只是demo效果,所以有点丑.) 父页面 <template> <div> <div class="dateDiv" :key="index" v-for="(item,index) in TimeArray"> <p>{{item.name}}</p>

随机推荐