2013-04-18 16 views
6

Próbuję zrobić Choropleth z d3.js, ale utknąłem na samym początku. Znalazłem plik Shapefile i wygenerowałem z niego pliki GeoJSON i TopoJson, podobnie jak here. Mapa wykorzystuje projekcję Albers-Syberia. Co znalazłem o tym projekcji:Mapa z d3.js i TopoJSON, Albers Syberia projekcja

projekcyjne: Albers Equal-Area stożkowa

  • Units: Liczniki
  • sferoidalna: Krasowskiego
  • centralny południk: 105
  • standard Parallel 1: 52
  • Standardowa równoległa 2: 64
  • Szerokość geograficzna: 0
  • Fałsz Y: 18500000
  • Fałsz X: 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 + jednostki = m + towgs84 = 28, -130, -95,0,0,0,0 + no_defs

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

Więc dostałem ten kod w końcu i nic nie robi (a nawet freez), co jest nie tak?

<!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> 

można znaleźć wszystkie pliki JSON here.
I jeszcze jedno pytanie: Jak mogę odnieść się do wartości pola region w mój plik TopoJson.

+0

Co dokładnie dzieje się po uruchomieniu kodu? Czy otrzymujesz komunikat o błędzie, wyjście? –

+0

Nie, brak błędów w konsoli. – KoGor

+0

Rozmiar plików JSON może być problemem. Czy próbowałeś je uprościć lub po prostu trochę dłużej? –

Odpowiedz

17

Pierwszy problem polega na tym, że plik GeoJSON nie ma w stopniach [długość geograficzna °, szerokość geograficzna °], inaczej znany jako EPSG:4326 or WGS 84. Aby przekonwertować plik GeoJSON na WGS 84, najpierw musisz utworzyć plik projekcji, na przykład albers.prj, abyś mógł powiedzieć OGR, jaka jest projekcja źródłowa.

+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 

Następnie „unproject” plik GeoJSON poprzez przekształcenie go do WGS 84:

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

Teraz można przekonwertować do TopoJSON w WGS 84, zamiast przewidywanych współrzędnych. Podjąłem również pewne uproszczenia:

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

Drugi problem polega na tym, że definicja projekcji w D3 jest niepoprawna. Projekcja d3.geo.albers ma domyślny obrót i środek, który został zaprojektowany dla mapy w centrum USA, więc oprócz zdefiniowania centrum musisz również zastąpić domyślny obrót. W rzeczywistości parametr projekcji + lon_0 (środkowy południk) odwzorowuje ruch obrotowy rzutu, a nie środek rzutu. Nadanie:

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

(I fudged z parametrem środkowej Rosji umieścić na środku rzutni Można compute this automatically jeśli wolisz..) Powinieneś zobaczyć coś takiego:

Albers Siberia

Możliwe jest również do pracy z prognozowanych (kartezjańskie) Współrzędne w TopoJSON, a następnie zdefiniować d3.geo.path z zerowym (tożsamości) projekcji, ale Zostawię to na osobne pytanie.

+0

To po prostu świetne! Dziękuję, za tak szybką i pełną odpowiedź. Jestem nowy w tym wszystkim, po raz pierwszy pracuję z mapami. – KoGor

+0

Dodatkowo, możesz wyjaśnić proszę, co make --russia = w tym kodzie:> topojson -o map_rus_wgs84_topo.json -s 1e-7 - russia = map_rus_wgs84_geo.json. I nie rozumiem tego o współrzędnych środka, a link U podany jest o automatycznej skali obliczeniowej i tłumaczeniu parametrów, albo coś mi brakowało. – KoGor

+1

Aby uzyskać pełne wyjaśnienie, zapoznaj się z [odniesieniem do wiersza poleceń TopoJSON] (https://github.com/mbostock/topojson/wiki/Command-Line-Reference). Powyżej używam '-o', aby określić nazwę pliku wyjściowego,' -s', aby określić próg uproszczenia u steradianów, a następnie pliki wejściowe są zgodne z separatorem '- '. Jest tylko jeden plik wejściowy ('map_rus_wgs84_geo.json'), a poprzez prefiksowanie' russia = ', mogę ustawić nazwę obiektu w wygenerowanej topologii. Dlatego w powiązanym przykładzie odnosimy się do 'Russia.objects.russia'. – mbostock