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

Retrieve all latitude longitude points within x distance given an area

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

覆盖伦敦的区域:

区域分成 3 英里块(不完美):

然后打印出每个街区中心的经纬度。这将给我覆盖伦敦地区的所有纬度经度点(3mi 以内)。

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

您实际上可以在 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;

一些解释是为了:

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

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

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