给定一个由x个点数定义的区域,我想将该区域分成3英里的区块并从每个区块中检索中心纬度经度。这就是我的意思:
伦敦地区:
区域划分为3英里区块(不完美):
然后打印出每个街区中心的纬度经度。这将为我提供覆盖伦敦地区的所有纬度经度点(3mi内)。
我需要以编程方式执行此操作,给定任何大小的区域但不幸的是我不知道从哪里开始。数学不是我最强的主题,我对地理学没有太多帮助。我认为Universal Transverse Mercator coordinate system可以帮助我,但我不知道从哪里开始。
答案 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;
有些解释是有道理的:
我使用英国国家电网(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)。