检索给定区域 x 距离内的所有经纬度点

Posted

技术标签:

【中文标题】检索给定区域 x 距离内的所有经纬度点【英文标题】:Retrieve all latitude longitude points within x distance given an area 【发布时间】:2015-04-05 04:25:40 【问题描述】:

给定一个由 x 个点定义的区域,我想将该区域分成 3 英里的块,并从每个块中检索中心纬度经度。这就是我的意思:

覆盖伦敦的区域:

将区域划分为 3 英里块(不完美):

然后打印出每个块中心的经纬度。这将为我提供覆盖伦敦地区的所有纬度经度点(3 英里以内)。

我需要以编程方式执行此操作,给定任何大小的任何区域,但不幸的是我不知道从哪里开始。数学不是我最擅长的科目,我在地理方面做得不多。我认为Universal Transverse Mercator coordinate system 可以帮助我,但我又不知道从哪里开始。

【问题讨论】:

你需要多精确,网格是否有起点 @JohnBarça 不一定要 100%,但要尽可能准确。可以从任何地方开始。 抱歉,回答有点长。希望它有所帮助,当我开始谈论预测时,我无法控制自己,悲剧,我知道。 【参考方案1】:

您实际上可以在 Postgis 中将其作为单个 SQL 查询来执行,即:

SELECT 
  ST_AsText(ST_Transform(ST_SetSrid(ST_MakePoint(
     500000 + x * 4828.03, 155000 + y * 4828.03), 27700), 4326)) 
FROM 
   generate_series(0, 12) x, 
   generate_series(0, 10) y;

一些解释是为了:

    使用 Postgres 非常有用的 generate_series function 在 x 和 y 方向创建网格 将创建的 x 和 y 值传递给 ST_MakePoint 以创建网格。我使用了British National Grid,它是投影的,以米为单位,来帮助计算。包含 M25 的边界框的左下角大致为 (500000, 155000),因此我将其用作锚点。右上角约为(560000, 205000),即60 x 50 公里。三英里是 4828.03 米,这解释了 ST_MakePoint 每次迭代中的偏移量。 generate_series 的限制是 12 和 10,或从 0 开始的 13 和 11 增量,这是 4828.03 米适合 M25 边界框的宽度/高度的次数。 使用ST_SetSRID 告诉 Postgis 这些坐标位于英国国家网格中,即 27700。 使用ST_Transform 转换为纬度/经度,其空间参考ID (SRID) 为4326。 ST_AsText 为您提供底层几何图形的文本表示。删除它以获取原始几何图形,即,如果您确实想要制作表格并将点存储为几何图形。

我使用英国国家网格 (27700) 创建 3 英里网格,然后转换为纬度/经度。您可以通过粗略计算伦敦的纬度和经度为 3 英里并执行相同的 generate_series 两次程序来直接执行上述操作,但直接使用 4326,从而跳过 ST_Transform。这样做的问题是,当您向北/向南行驶时,一分钟的纬度会发生变化。英国国家网格的设计采用了地球形状的基础模型(大地水准面),该模型特别适合英国,与 GPS 卫星中使用的 WGS84 不同。因此,逻辑是使用以米为单位的网格然后转换为纬度/经度会比直接使用纬度/经度产生更规律的失真,其中比例随着您向北/向南移动而变化。实际上,在一个伦敦大小的地区,你可能可以忽略所有这些,除非你正在建造一个核电站:D

您提到了球形墨卡托 (3857),它是 Google 地图(和其他人)用于全球覆盖的投影,以米为单位。您也可以使用上述过程,使用 3857 到 4326,但是当您向北移动时,此投影会保持不断增加的比例失真,而英国的网格基于横轴墨卡托,具有恒定的北/南比例,并且随着您向东移动,失真会增加/西。如果您想在谷歌地图或类似地图上绘制点,这可能适合您。我把它留作练习,找出 3857 的起点(提示使用 ST_Transform)。

【讨论】:

哇,我不敢相信它这么容易!惊人的。谢谢! 一旦你知道怎么做就很容易,但在其他方面有点不明显:D坐标系统可能很难理解。 我忘了补充一点,这将为您提供一个矩形内 3 英里网格上的所有点,该矩形是 M25 的最小边界矩形。如果要排除 M25 之外但在 mbr 中的那些点,则可以对输入几何图形使用 ST_Intersects。如果你愿意,我可以写出来。

以上是关于检索给定区域 x 距离内的所有经纬度点的主要内容,如果未能解决你的问题,请参考以下文章

使用经度和纬度查找给定距离内的所有附近客户

Laravel - 在给定用户的经度和纬度时检索距离时,我在所有模型上都得到相同的结果。为啥?

从给定位置(经度、纬度)的 Y 半径内查找 X 的所有值

C#查找一英里内的所有纬度和经度

从中心到给定点的纬度、经度和地理区域(NW、NE、SW、SE)

从用户地图上的 4 个角检索纬度和经度