簡體   English   中英

使用d3渲染geoJSON

[英]Render geoJSON with d3

我有一個geoJSON文件,我正在嘗試使用d3渲染,但我很難針對投影的正確功能。

目前我已經在許多d3示例中找到的us.json文件中工作了很多,但我正在使用的地圖使用美國“通勤區域”(CZ's)而不是土地,州或縣。

我習慣打電話

topojson.feature(us, us.objects.states)

顯示正確的圖層,但我的文件沒有組織成對象,也沒有多個圖層。 以下是我試圖使用的geoJSON文件的摘錄:

{"type":"FeatureCollection","bbox":[-120.30602148510043,6.667736880597216,-70.95829310710806,34.46308750538215],"features":[{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-83.802805983004,22.64602264051764],[-83.8080569412408,22.638128812605782],

這是我在渲染時失敗的代碼:

d3.json("CZ90.zip.geojson", function(error, us) {
    if (error) throw error;

    d3.select("svg").append("path")
        .datum(topojson.feature(us, us.CZ90))
        .attr("d", d3.geo.path());
});

由於沒有對象,我省略了“.object”,當我將文件放入Mapshaper時,它正確地渲染了一個標題為“CZ90”的圖層,這就是我寫“us.CZ90”而不是“us.objects”的方法。 。狀態”

我意識到我正在調用“topojson.feature”而不是特定於geoJSON的東西,但我也無法在不丟失投影類型/信息的情況下將文件成功轉換為Mapshaper中的topoJSON。

在.datum調用中定位此圖層的正確方法是什么?

如果我能找到包含通勤區域層的us.json這樣的topoJSON文件,那么整個問題也將得到解決!

結束了我的開發者朋友的幫助,答案比我的問題簡單得多。

好像d3.json()本身適合讀取我的geoJSON文件的結構而不使用datum()所需要的只是調用:

d3.json("CZ90.zip.geojson", function(error, geoData) {
    d3.select("svg").append("path")
        .attr("d", path(geoData));
}

注意:這是使用d3.v4

以下是能夠成功渲染地圖的完整腳本:

<!DOCTYPE html>
<meta charset="utf-8">
<style>
    path {
      fill: #ccc;
      stroke: #fff;
      stroke-linejoin: round;
    }
</style>

<svg width="960" height="500"></svg>
<script src="//d3js.org/d3.v4.min.js"></script>

<script>

var width = 960;
var height = 620;

var chosenProjection = d3.geoMercator()
  .scale(600)
  .translate([1300, 450])

  var path = d3.geoPath()
    .projection(chosenProjection);

d3.json("CZ90.zip.geojson", function(error, geoData) {

  d3.select("svg").append("path")
      .attr("d", path(geoData));
});

</script>

希望這有助於其他人堅持這么簡單的障礙!

我可能在這里遺漏了一些東西,但是如果你看一下topojson文檔,你會注意到topojson.feature:

返回給定拓撲中指定對象的GeoJSON Feature或FeatureCollection。 如果指定的對象是GeometryCollection,則返回FeatureCollection,並且集合中的每個幾何都映射到Feature。 否則,返回一個功能。

在d3文檔中,您將注意到d3 geopath:

呈現給定對象,可以是任何GeoJSON功能

所以關於:

我意識到我正在調用“topojson.feature”而不是特定於geoJSON的東西

您已經使用了geoJSON特定的東西,您只能使用topojson.js將topoJSON轉換回geoJSON,以便可以在D3地圖中使用它。 所以回答你的問題:

在.datum調用中定位此圖層的正確方法是什么?

正確的方法是簡單地使用:

.datum(us) // feature collection or single feature

這將附加單個路徑,但是如果要附加具有相同數據集的多個路徑(例如,用於不同的着色或鼠標交互):

.data(us.features) // feature collection

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM