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

时间:2015-02-05 10:44:26

标签: location gis latitude-longitude postgis geo

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

伦敦地区:

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

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

我需要以编程方式执行此操作,给定任何大小的区域但不幸的是我不知道从哪里开始。数学不是我最强的主题,我对地理学没有太多帮助。我认为Universal Transverse Mercator coordinate system可以帮助我,但我不知道从哪里开始。

1 个答案:

答案 0 :(得分:2)

您实际上可以在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以创建网格。我使用了预测的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边界框的宽度/高度的次数。
  3. 使用ST_SetSRID告诉Postgis这些坐标位于英国国家网格中,称为27700。
  4. 使用ST_Transform转换为lat / lon,它的空间参考ID(SRID)称为4326。
  5. ST_AsText为您提供了基础几何的文本表示。删除它以获得原始几何图形,即,如果您确实想要制作表格并将点存储为几何图形。
  6. 我使用英国国家电网(27700)创建3英里网格,然后转换为lat / lon。您可以通过大致计算伦敦的lat和lon中的3英里并执行相同的generate_series两次过程直接执行上述操作,但直接使用4326,从而跳过ST_Transform。这个问题是,当你走向北/南时,一分钟的纬度会发生变化。英国国家电网的设计具有地球形状的基础模型(大地水准面),特别适合英国,并且与GPS卫星中使用的WGS84不同。因此,逻辑是使用以米为单位的网格然后转换为纬度/经度将比直接使用纬度/经度产生更多的规则失真,其中当您向北/向南移动时,尺度会发生变化。实际上,在伦敦大小的地区,你可能会忽略所有这些,除非你正在建造核电站:D

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