在topojson的美国地图上标注坐标值

5
我正在使用react-d3-map-bubble库绘制美国地图。 React库 - https://github.com/react-d3/react-d3-map-bubble 使用的美国地图JSON文件 - https://d3js.org/us-10m.v1.json 我的目标是在该地图上绘制点。
在当前的JavaScript文件中,县对象使用弧线并在美国地图上绘制不同的点。请参见此处的图片描述 - https://bl.ocks.org/mbostock/9943478 我有经度和纬度,而不是弧线/多边形。
因此,在JSON文件中,我将使用以下示例更改'countries'对象:
      {
        "type": "GeometryCollection",
        "geometries": [
            {
                "type": "Point",
                "properties": {
                    "name": "Some place in New Mexico",
                    "population": 54590
                },
                "arcs": [
                    []
                ],
                "coordinates":[33.500142,-111.929818]
            }
         ]
       }

使用美国json中给定的转换函数,我无法将给定的坐标放置在地图上的正确位置。

转换函数

"transform": {
    "scale": [0.09996701564084985, 0.058373467440357915],
    "translate": [-56.77775821661018, 12.469025989284091]
}

因此,

  1. 我如何获取使用topojson的坐标的正确转换函数?

或者

  1. 我如何将所有坐标转换为弧线/多边形,以便直接放置在“counties”对象中?
1个回答

6

Topojson和坐标

我认为有些人对topojson的作用存在一些困惑:“我有经纬度而不是弧线/多边形”。

Topojson通过应用“整数坐标的量化增量编码”来节省空间,但真正的空间节省可以来自于使用弧线(geojson会将两个要素的相互边界重复表示,每个要素都表示一次)。但是d3实际上并不绘制topojson,数据会被转换回geojson(如您链接的示例中所见):

topojson.feature(us, us.objects.counties).features

如果从geojson转换到topojson再转回来,原始坐标系统保持不变。因此,如果您起始坐标是经纬度,最终也将是经纬度。弧线和多边形不是替代坐标系统,它们是使用任何给定坐标系统中的坐标构建的形状。

问题

问题在于你的topojson编码的坐标不是经纬度对 - 在这种情况下,它们是像素值,因此该要素在svg坐标空间中从[0,0][960,600]的坐标平面上绘制。为什么会出现这种奇怪的坐标空间而不是经纬度?这样你就不需要使用投影来绘制它们,这对于像Mike Bostock可能试图在链接的块中演示的示例来说在浏览器中更快和更简单。

topojson使用投影坐标空间(位于二维笛卡尔平面上)。您的经纬度使用地理坐标空间(是三维椭球体上的点)。

解决方案

如果您希望将要素对齐,则需要将您的点转换为投影坐标空间并应用相同的投影。

或者,您可以获取未投影的美国数据,并使用相同的投影对其进行投影以及对您的经纬度点进行投影。

  1. 对每个点应用用于美国的相同投影
通常情况下,如果geojson或topojson(或shapefile)已经被投影,你很难轻易地找出使用的是哪种投影方式(如果没有.prj文件的话)。在这种情况下,我们知道它是一个复合投影d3.geoAlbersUsa(),但是我们不知道投影的参数,因此我们无法使用它,除非我们可以访问有关文件的其他数据,或者我们自己制作并且因此知道我们使用了哪些参数。
即使我们有这些信息,我们可能会发现为不同的SVG / Canvas大小缩放地图很麻烦,因为我们需要以不同的比例缩放投影数据和未投影数据,因为我们将使用两个不同的坐标系。
2. 获取美国的未投影数据
这并不是在网上查找美国各州/县等地理数据很难。如果您找到shapefile文件,可以使用如mapshaper.org等工具轻松转换,不过geojson或topojson文件也很容易找到。您只需要确保坐标使用纬度经度对(顺序为[long,lat],您问题中的示例坐标使用[lat,long],这是不行的),而不是其他任何坐标系统。
一旦您拥有了这些数据,就需要确保将相同的投影应用于所有要素。 为什么比例和平移无济于事 此外,topojson的比例和平移也不涉及投影参数,而是topojson中使用的量化增量编码。

感谢您详细的回复。我从中学到的主要一点是,如果我不知道源文件是如何创建的,就不应该使用它。您能否推荐一篇文章,帮助我创建自己的US.json文件? - Siddharth
通常情况下,如果数据合理地呈现为未投影状态(坐标全部在[+/-180,+/-90]度之内),则存在例外。我想我有这个文件的参数,一旦回家我会找一下,不过像这个这样的来源可以获取未投影的数据,然后您可以使用相同的d3投影在飞行中对其进行投影和点的处理。 - Andrew Reid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接