d3 墨卡托地理边界到像素边界

Posted

技术标签:

【中文标题】d3 墨卡托地理边界到像素边界【英文标题】:d3 mercator geo bounds to pixel bounds 【发布时间】:2014-05-09 16:59:03 【问题描述】:

我想知道在给定地图的宽度和高度的情况下,是否存在将 d3.geo.bounds() 数组转换为 path.bounds 像素数组的 D3-API 调用?

我在 API 文档中找不到这样的调用。我知道有一些预测应该可以解决问题,但是我未能从地理边界到达实际的像素边界。

另外,是否有计算一系列特征的经纬度质心的 API 实现?

感谢您的帮助!

示例

假设用户想要将德国和波兰缩放到全屏。我计算的经纬度边界是:

lat:47.27148371456806 long: 5.850585058505857
(1321.6041604160416,246.58117844670664)
lat:55.06843452896922 long: 24.140414041404142
(1451.6651665166517,157.87336991900156) 

用谷歌地图检查,经纬度坐标是正确的。然而,计算的像素值(使用https://***.com/a/14457180/974815 的方法)对我来说似乎很奇怪。屏幕分辨率为 2560x1258。

我想将经纬度边界转换为像素边界,以便计算墨卡托投影的偏移量:

var offset = [
               this.width - (bounds[0][0] + bounds[1][0])/2,
               this.height - (bounds[0][1] + bounds[1][1])/2
             ];   

return d3.geo.path().projection(
                                 d3.geo.mercator()
                                   .center(this.__computeCentroid(features))
                                   .scale(scale)                                
                                   .translate(offset)
                               );

最好, 塞巴斯蒂安

【问题讨论】:

【参考方案1】:

使用可用的投影之一将要素的地理坐标转换为像素(投影)坐标。您可以使用投影将地理边界转换为投影边界,或直接使用path.bounds() 获取该信息。也就是说,不是将特征传递给d3.geo.bounds(),而是将其传递给使用投影的d3.geo.path().bounds() 方法。

没有计算一系列特征的质心的函数。您可以将特征组合成一个(最好使用 GIS 程序)并获取其质心,或者获取所有特征的质心,然后通过平均坐标获得质心。

【讨论】:

感谢您的回复!我知道 path.bounds(),但我遇到的问题是,由于不丢失精度,我必须计算多个特征的统一界限,也就是说,我有地理界限,比如说两个特征,现在我需要将该绑定转换为像素边界,以便计算墨卡托投影的偏移量以适应屏幕分辨率的边界!这是否意味着我必须手动翻译特定(组合)? 您可以这样做或使用投影边界。无论如何,你最终都在投影,你不应该因此而失去精度——可能是这里或那里的一个像素,但这并不重要,除非你的屏幕真的很小。 例如,如果您想将仅在运行时已知的特征集合拟合到任何屏幕分辨率,您无法真正使用投影边界,因为对于初始投影,您必须先进行猜测有一些初始规模。当然,世界地图中有岛屿小于默认比例,因此投影边界将返回无穷大(因为单个像素可能太小而无法显示小于 150 比例的岛屿)。我想我必须手工完成。 好的,我明白你的意思了。在这种情况下,只需使用投影来投影计算的边界。 是的,我似乎无法做到这一点。假设我有两个带有经纬度坐标的边界点。我需要将它们转换为高度为 y_h 和宽度为 x_w 的屏幕中的像素坐标。我是否必须按照此处所述进行操作:***.com/a/14457180/974815(我已经检查过,我计算的经纬度边界是正确的,但是使用链接中的公式的像素边界很奇怪)?有 D3 方式吗?

以上是关于d3 墨卡托地理边界到像素边界的主要内容,如果未能解决你的问题,请参考以下文章

如何确定超像素的边界像素?

OpenCV在轮廓边界内获取黑色像素

Python - 删除源自图像边界的黑色像素

华为机试真题 C++ 实现图像物体的边界

JAVA代码根据经纬度范围计算WGS84与谷歌全球墨卡托包含的切片数目与拼接图像像素尺寸

D3:在 d3 中查找地理多边形的面积