2013-04-18 9 views
6

d3.jsでChoroplethを作ろうとしていますが、最初はちょっと立ち往生しました。私はシェイプファイルを見つけ、hereのようにGeoJSONとTopoJsonファイルを生成しました。地図はAlbers-Siberia投影を使用しています。私は、この投影について見つけたもの:d3.jsとTopoJSON、Albersとのマップシベリア投影

プロジェクション:アルバース等積円錐

  • 単位:メートル
  • スフェロイド:Krasovsky
  • 中央子午線:105
  • 標準パラレル1:52
  • 標準パラレル2:64
  • 参照緯度:0
  • 偽東距:18500000
  • 偽北距:0

PROJ.4:+がproj = AEA + lat_1 = 52 + lat_2 = 64 + lat_0 = 0 + lon_0 = 105 + X_0 = 18500000 + Y_0 = 0 + ellps = krass + units = m + towgs84 = 28、-130、-95,0,0,0,0 + no_defs

MapInfo: "Albers-Siberia"、9,1001,7,105,0、 64、52、18500000、0

私はこのコードを最終的に手に入れました。それで何もしません(そしてフリーズアップする)、何が問題なのですか?

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title>Choropleth</title> 
    <script type="text/javascript" src="d3/d3.v3.js"></script> 
    <script type="text/javascript" src="d3/queue.v1.min.js"></script> 
    <script type="text/javascript" src="d3/topojson.v0.min.js"></script> 
</head> 
<body> 
    <h1>My Choropleth</h1> 
    <script type="text/javascript"> 

     var width = 960, 
      height = 500; 

     var svg = d3.select("body").append("svg") 
        .attr("width", width) 
        .attr("height", height); 

     var pr = d3.geo.albers() 
      .center([105,0]) 
      .parallels([52, 64]) 
      .scale(1000); 


     var path = d3.geo.path().projection(pr); 

     d3.json("map_rus_topo.json", function(error, map) { 
     svg.append("path") 
      .datum(topojson.object(map, map.objects.map_rus)) 
      .attr("d", path); 
     }); 

    </script> 
</body> 

あなたはすべてのJSONファイルhereを見つけることができます。
もう1つ質問:の領域のフィールドを TopoJsonファイルにどのように参照することができますか。

+0

コードを実行するとどうなりますか?あなたはどんな種類のエラーメッセージを出力しますか? –

+0

いいえ、コンソールにエラーはありません。 – KoGor

+0

JSONファイルのサイズに問題がある可能性があります。あなたはそれらを単純化しようとしましたか、ちょっと待ってみましたか? –

答えて

17

最初の問題は、GeoJSONファイルが度[経度°、緯度°]でないことです。それ以外の場合はEPSG:4326 or WGS 84として知られています。 GeoJSONファイルをWGS 84に変換するには、まず投影ファイルを作成する必要があります。例えば、albers.prjとすると、OGRにソース投影が何であるかを伝えることができます。

+proj=aea +lat_1=52 +lat_2=64 +lat_0=0 +lon_0=105 +x_0=18500000 +y_0=0 +ellps=krass +units=m +towgs84=28,-130,-95,0,0,0,0 +no_defs 

その後、WGS 84に変換することにより、「unproject」にGeoJSONファイルは:

ogr2ogr -f GeoJSON -s_srs albers.prj -t_srs EPSG:4326 map_rus_wgs84_geo.json map_rus_geo.json 

は今、あなたは、投影座標ではなく、WGS 84にTopoJSONに変換することができます。私はまた、いくつかの簡素化を行うことの自由を撮影した:

topojson -o map_rus_wgs84_topo.json -s 1e-7 -- russia=map_rus_wgs84_geo.json 

第二の問題は、D3であなたの投影の定義が間違っているということです。 d3.geo.albers投影には、米国中心の地図用に設計されたデフォルトの回転と中心があります。そのため、中心を定義するだけでなく、デフォルトの回転も上書きする必要があります。実際、+ lon_0(中央子午線)投影パラメータは、投影の中心ではなく投影の回転にマッピングされます。寄付:

var projection = d3.geo.albers() 
    .rotate([-105, 0]) 
    .center([-10, 65]) 
    .parallels([52, 64]) 
    .scale(700) 
    .translate([width/2, height/2]); 

を(私はビューポートの中心にロシアを置くために、中心パラメータでfudgedすることができますcompute this automaticallyご希望の場合。。)あなたは今、このようなものが表示されるはずです。

Albers Siberia

それが投影(デカルトと連携することも可能ですが)TopoJSON座標を、その後、ヌル(同一性)を投影してd3.geo.pathを定義しますが、私は別の質問のためにそれを残すでしょう。

+0

それはちょうどいいです!とても早くて完全な答えをありがとう、ありがとう。私はこのすべてのものには初めてです、初めて地図を使って作業しました。 – KoGor

+0

さらに、このコードでは--russia =をどのようなものにするか説明してください:> topojson -o map_rus_wgs84_topo.json -s 1e-7 - russia = map_rus_wgs84_geo.json。そして、私はセンター座標については得られません.Uのリンクは、オートコンピューティングのスケールとパラメタの翻訳についてのものです。 – KoGor

+1

詳しい説明は、[TopoJSONコマンドラインリファレンス](https://github.com/mbostock/topojson/wiki/Command-Line-Reference)を参照してください。上記では、出力ファイル名を指定するのに '-o'を使用し、ステラジアンで簡略化しきい値を指定する' -s 'を使用しています。入力ファイルは '--'区切り文字の後に続きます。入力ファイルは1つだけです( 'map_rus_wgs84_geo.json')。' russia = 'という接頭辞を付けることで、生成されたトポロジでオブジェクトの名前を設定できます。リンクされた例では、私は 'russia.objects.russia'を参照しています。 – mbostock

関連する問題