• 背景:PostgreSQL 可以扩展PostGIS 模块,来完成地理空间计算方面的任务
  • 问题描述:使用内置函数 ST_Length来计算轨迹长度时,发现计算的结果和实际不太符合,查阅相关博客发现原来是坐标系的问题。(但是各个博客的内容可能不太准确,折腾了半天,最后找到官网,成功把问题解决,只能说,官网是个好东西
  • 问题解决:
    • 概念: geometry和geography的区别

      • geometry:planar 平面坐标系【supported by SQL Server conforms to the Open Geospatial Consortium (OGC) Simple Features for SQL Specification version 1.1.0.】
      • geography: terrestrial 地理坐标系【stores ellipsoidal (round-earth) data, such as GPS latitude and longitude coordinates.】
      • 也就是说,geometry是一个平面几何的概念,而geography是一个地球的地理的概念。所以当两个点形成一条轨迹时,输入经纬度直接采用geometry即几何的方法来算的话,会不准,因为地球是一个球体,而不是一个简单的平面
    • ST_Length函数的使用

      • 先来看看官网的描述(点击蓝色的两个字可以直达官网):

      ST_Length — Returns the 2D length of the geometry if it is a LineString or MultiLineString. geometry are in units of spatial reference and geography are in meters (default spheroid)

      输入LineString 或者 MultiLineString 格式的数据,然后返回二维的长度。对于geometry类型,返回对应空间参考系的单位,对于geography返回以为单位。

      • 再看看函数定义

      float ST_Length(geometry a_2dlinestring);
      float ST_Length(geography geog, boolean use_spheroid=true);

      很明显,是分为两种输入类型来的。两种不同的输入返回输入的结果。而对于geography 类型的use_spheroid这个参数,默认为true,用来指定是否使用参考面(因为地图是个不规则球体,有各种参考面),如果为false,则不使用参考面,把地球当做一个完美的球体来看待,因而精度会降低,但是能剩下不少计算的时间。

    • 具体解决办法
      回归到问题, 直接把LineString 或 MultiLineString输入函数,属于 geometry 类型,所以如果是计算地理上面的数据,是不准确的。因此,使用ST_GeographyFromText函数将数据从geometry 类型转换为geography ,然后再进行计算,调用的就是第二个方法,得到正确的结果。
      官网示例:

              SELECT ST_Length(the_geog) As length_spheroid,  ST_Length(the_geog,false) As length_sphereFROM (SELECT ST_GeographyFromText('SRID=4326;LINESTRING(-72.1260 42.45, -72.1240 42.45666, -72.123 42.1546)') As the_geog) As foo;
      

      结果:
      length_spheroid | length_sphere
      ------------------±-----------------
      34310.5703627288 | 34346.2060960742

      个人示例:

  1. 查看原始数据
SELECT gid,geom FROM bfmap_ways limit 10;


从上图可以看到,原始数据有两个字段,gid和geom,其中geom是二进制格式。

  1. 使用st_astext将二进制格式转换为文本格式,然后使用ST_GeographyFromText将数据转换为Geography格式,最后用st_length计算长度
SELECT gid, st_astext(geom) as geom,st_length(ST_GeographyFromText(st_astext(geom))) as length FROM bfmap_ways limit 10;


总结:不清楚的时候,尽可能去找官网!官网的描述最准确,最详细!最后再一次附上官网 http://postgis.net/docs/manual-2.3/ST_Length.html

PostgreSQL中的距离计算问题 ST_Length相关推荐

  1. mysql语句计算距离_mysql查询中的距离计算

    小编典典 选项1:通过切换到支持GeoIP的数据库对数据库进行计算. 选项2:使用如下存储过程对数据库进行计算: CREATE FUNCTION calcDistance (latA double, ...

  2. Box2D中的距离计算

    GDC 2010 Session:Physics for Programmers,Erin Catto:Computing Distance,pdf Erin Catto是二维物理库Box2D的开发者 ...

  3. 聚类算法中各种距离的计算与python的具体实现代码

    一.聚类算法和相似度 在机器学习中,有两类学习算法,一类是无监督学习,另一类是监督学习.聚类算法是无监督学习算法,一般构建用户兴趣属性画像等可应用聚类算法:而一般的分类算法是有监督学习,基于有标注的历 ...

  4. ITK:从二进制图像中的对象计算距离图

    ITK:从二进制图像中的对象计算距离图 内容提要 C++实现代码 内容提要 从二进制图像中的对象计算距离图 C++实现代码 #include "itkImage.h" #inclu ...

  5. 向量距离计算 java_在机器学习中扮演着极为重要角色的向量

    本章要点: 向量: 欧氏距离: 曼哈顿距离: 切比雪夫距离. 无论是在现实世界里,还是在人工智能领域中,"距离"都是一个相当重要的度量手段:在现实世界中,"距离" ...

  6. PostgreSQL中计算百分位数和中位数

    PostgreSQL9.4版本之后很容易对一组值计算百分位数,主要是用有序集合的聚集函数percentile_cont 和 percentile_disc. 这两个函数类似,但对合并结果有些差异: p ...

  7. 均方距离计算公式_Excel2013中通过公式计算方差与均方差来反映数据的偏移程度...

    说起方差.均方差,可能还要回想一下,毕竟那是很早以前接触的(初中数学里面就有的).方差(英文Variance)用来度量随机变量和其数学期望(即均值)之间的偏离程度,多用于零件测绘行业.均方差也叫标准差 ...

  8. Postgresql中,计算两个日期月份差值或年月日,实现Oracle中months_between、add_months的效果

    Oracle中存在months_between.add_months函数,用作计算年龄等,例如计算某个人的年龄:岁(age)-月(monthss)-天(days) SELECT rowid,a.fid ...

  9. 在H5中使用腾讯地图,实现定位,距离计算,实时搜索,地址逆解析

    在H5中使用腾讯地图,实现定位,距离计算,实时搜索,地址逆解析 1.创建应用 2.下载微信sdk包 3.安装`vue-jsonp` 4.使用 获取当前位置信息,逆解析地址 路线规划,距离计算 实时搜索 ...

最新文章

  1. Memcache面试题
  2. html双人台球游戏,使用h5和matter.js实现的简化版台球小游戏
  3. Linux简单安装Mysql+Apach+PHP+phpMyAdmin
  4. 乱想想关于捕获异常后继续执行的实现。
  5. html中websocket获取数据,如何使用websocket从数据库中获取数据来刷新视图
  6. 白盒测试之语句覆盖案例
  7. django进阶05中间件
  8. 二项分布python实现_初级概率分布的Python实现
  9. Alexa工具条遭清洗,其排名逐渐淡出中国(转)
  10. 四种PS蒙版的运用:快速蒙版、图层蒙版、矢量蒙版、剪切蒙版
  11. 使用同源建模预测蛋白质结构
  12. 大道至简:智能语义检测的武林
  13. 如何提高阅读源代码能力
  14. Java小游戏:模仿微信群发红包
  15. flink boardCast--广播变量
  16. Mybatis学习 association关联 和 collection集合
  17. 运维中的交换机堆叠是什么
  18. 数据库-20210719(随手记)
  19. 抽象语法树AST的全面解析(一)
  20. Vue.js中Twitter第三方登录api实现[亲测可用]

热门文章

  1. Word删除下划线上的文字
  2. Java购买火车票(初识并发)
  3. 上百本中文书籍中对《人月神话》的引用(8)
  4. linux内核TCP 滑动窗口,TCP滑动窗口和流控
  5. vue 实现强制类型转换 ,将数字变为字符串,字符串变为数字,数组数字变为字符串、js对象转数组
  6. 【图像配准】基于matab SAR-SIFT改进的SAR图像配准【含Matlab源码 2336期】
  7. 计算机在化学化工中的应用ppt绪论,化工原理_01概述全解课件.ppt
  8. 亚马逊跨境电商如何编辑产品详情页 亚马逊产品listing优化
  9. “五一”国际劳动节是怎么来的?
  10. 2w行C++代码制作网络入侵检测系统,网友直呼:666