查询附近500米的餐厅

前言

查询附近500米数据,第一反应是用ST_Buffer,但是ST_Buffer文档写了一句话,使用ST_DWithin效率更高。

ST_Buffer (postgis.net)

ST_DWithin (postgis.net)

数据取点

        我有一种坐标系4326的表ne_10m_admin_0_boundary_lines_land,取gid=1的这条数据,geom是个线串,我们取第一个点-124.75886592699995 48.49401784300004

我们把x坐标-1度,只在这个点附近-125.75886592699995 48.49401784300004

知识科普

3857坐标系单位是米。也叫投影、平面、墨卡托

4326坐标系单位是度。也叫WGS 84,球面坐标,大地2000是4490,相同原理

在地球表面,线性距离的计算会受到地球的曲率影响。在赤道附近,一度的经度对应的线性距离大致为111千米。然而,随着你向极地区域移动,每度经度的线性距离会减小。在极地附近,经度线会收缩成一个点,所以在极地附近的地理坐标系下,1度经度的线性距离会变得非常小。

如图所示,坐标系不同,所以单位也不同 

查询方案1

方案1用的ST_DWithin第1个构造

boolean ST_DWithin(geometry , geometry , double precision g1g2distance_of_srid)

对于几何图形:距离以几何图形的空间参考系统定义的单位指定。 为了使此函数有意义,源几何图形必须位于同一坐标系中(具有相同的 SRID)。需要把坐标系转成3857。如果用4326,他会按照度去计算。

比如-125,使用4326,最后1个参数是1,那么他会按照-125+1去处理。

如果使用3857,他会按照1度约等于110KM去处理。

--查询附近1000*120米附近的数据
SELECT gid,geom
FROM ne_10m_admin_0_boundary_lines_land nmlolp
WHERE ST_DWithin(ST_Transform(geom,3857), ST_Transform('SRID=4326;POINT(-125.75886592699995 48.49401784300004)',3857), 1000 * 120)  
ORDER by gid
limit 10

因为这张表是4326坐标系,由于插入的是几何数据,所以需要坐标系的转换。

如果使用距离<1000 * 120,是查不到这条数据。从而也验证了度和米的转换。

查询方案2

方案2用的ST_DWithin第2个构造

boolean ST_DWithin(geography , geography , double precision , boolean gg1gg2distance_metersuse_spheroid = true);

对于地理:距离测量默认为,单位为米。 为了更快地进行评估,请使用在球体上进行测量。

--查询附近500米附近的数据
select gid,geom
from ne_10m_admin_0_boundary_lines_land nmlolp 
where ST_DWithin(geom::geography,'POINT(-125.75886592699995 48.49401784300004)'::geography,500)

用地理构造的好处是,不需要进行坐标系转换,虽然强转地理类型之后是4326,但是不影响后面米的计算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 用例名称:查询会员信息 参与者:餐厅管理员 前置条件: - 餐厅管理员已经登录到餐厅管理系统 - 餐厅管理员已经进入到“会员管理”模块 基本流程: 1. 餐厅管理员进入“查询会员信息”页面。 2. 餐厅管理员输入会员的手机号、会员卡号、姓名等信息进行查询。 3. 系统根据餐厅管理员输入的信息,在数据库中查找匹配的会员信息。 4. 系统将查找到的会员信息展示给餐厅管理员。 5. 餐厅管理员查看会员信息,包括会员的姓名、手机号、会员卡号、会员等级、积分等信息。 扩展流程: - 如果系统未能找到匹配的会员信息,系统提示“未找到该会员信息,请确认输入信息是否正确”。 - 如果餐厅管理员发现会员信息有误,可以选择修改会员信息。 后置条件: - 餐厅管理员可以根据查询结果进行会员信息的相关操作。 ### 回答2: 用例名称:查询会员信息 用例编号:UC01 参与者:餐厅管理员 目标:餐厅管理员能够通过管理系统查询到会员信息 前置条件:管理员已登录系统 主成功场景: 1. 餐厅管理员进入管理系统后,点击菜单选择会员管理。 2. 系统显示会员管理界面。 3. 管理员输入待查询会员的会员号码或姓名等信息。 4. 管理员点击搜索按钮。 5. 系统根据输入的信息在会员数据库中查找匹配的会员信息。 6. 系统显示查找到的会员信息列表,包括会员号码、会员姓名、手机号码、积分等。 7. 管理员从列表中选择一个会员。 8. 系统显示该会员的详细信息,包括会员号码、会员姓名、手机号码、积分、生日等。 9. 管理员可以选择编辑该会员信息或执行其他操作。 扩展成功场景: 1. 如果管理员输入的会员号码或姓名在数据库中无匹配结果,系统提示“未找到相关会员信息”。 异常路径: 1. 如果管理员未登录系统,系统提示“请先登录系统”。 2. 如果管理员输入的待查询信息格式不符合要求,系统提示“输入格式错误,请重新输入”。 特殊需求: 1. 管理员可以按照不同条件进行会员信息的查询,如按会员等级、生日等多个条件进行筛选。 2. 管理员可以根据会员的积分情况对会员进行排序。 备注: 餐厅管理员可以通过查询会员信息,了解会员的消费习惯和积分情况,进而为会员提供更优质的服务和个性化的推荐,同时也能对会员信息进行编辑、删除等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值