2013-04-18 7 views
6

मैं d3.js के साथ चोरोप्लेथ बनाने की कोशिश कर रहा हूं लेकिन मैं शुरुआत में ही अटक गया था। मुझे एक आकार का ढांचा मिला और here की तरह से जियोज़सन और टॉपोज़सन फाइलें उत्पन्न हुईं। नक्शा अल्बर्स-साइबेरिया प्रक्षेपण का उपयोग करता है।d3.js और TopoJSON के साथ मानचित्र, अल्बर्स साइबेरिया प्रक्षेपण

प्रोजेक्शन: एल्बर्स समान-क्षेत्र शांकव

  • इकाइयों: मैं इस प्रक्षेपण के बारे में क्या पाया मीटर
  • उपगोल: 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 + इकाइयों = एम + towgs84 = 28, -130, -95,0,0,0,0 + no_defs

मैपइन्फो: "अल्बर्स-साइबेरिया", 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 पा सकते हैं।
और एक और सवाल: मैं क्षेत्र फ़ील्ड में TopoJson फ़ाइल के मूल्य का संदर्भ कैसे दे सकता हूं।

+0

कोड चलाने पर वास्तव में क्या होता है? क्या आपको किसी प्रकार का त्रुटि संदेश, आउटपुट मिलता है? –

+0

नहीं, कंसोल में कोई त्रुटि नहीं। – KoGor

+0

JSON फ़ाइलों का आकार एक समस्या हो सकती है। क्या आपने उन्हें सरल बनाने की कोशिश की है या बस थोड़ी देर प्रतीक्षा कर रहे हैं? –

उत्तर

17

पहली समस्या यह है कि आपकी GeoJSON फ़ाइल डिग्री [देशांतर °, अक्षांश °] में नहीं है, अन्यथा EPSG:4326 or WGS 84 के रूप में जाना जाता है। अपनी GeoJSON फ़ाइल को WGS 84 में कनवर्ट करने के लिए, आपको पहले प्रक्षेपण फ़ाइल बनाने की आवश्यकता है, albers.prj कहें ताकि आप ओजीआर को बता सकें कि स्रोत प्रक्षेपण क्या है।

+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 

फिर, "unproject" यह डब्ल्यूजीएस 84 को परिवर्तित करके GeoJSON फ़ाइल:

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

अब आप TopoJSON को डब्ल्यूजीएस 84 में नहीं बल्कि अनुमानित निर्देशांक से परिवर्तित कर सकते हैं,। मैं भी कुछ सरलीकरण करने की स्वतंत्रता लिया है:

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

दूसरी समस्या यह है कि डी 3 में अपने प्रक्षेपण परिभाषा गलत है। 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]); 

(मैं कर सकते हैं 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। और मुझे इसे केंद्र निर्देशांक के बारे में नहीं मिलता है, लिंक यू ने ऑटो कंप्यूटिंग स्केल के बारे में बताया है और पैराम का अनुवाद किया है, या मैं कुछ चूक गया। – KoGor

+1

पूर्ण स्पष्टीकरण के लिए [TopoJSON कमांड-लाइन संदर्भ] (https://github.com/mbostock/topojson/wiki/Command-Line-Reference) देखें। ऊपर, मैं steradians में सरलीकरण सीमा निर्दिष्ट करने के लिए आउटपुट फ़ाइल नाम, '-s' निर्दिष्ट करने के लिए '-o' का उपयोग कर रहा हूं, और फिर इनपुट फ़ाइलें' - 'विभाजक का पालन करती हैं। केवल एक इनपुट फ़ाइल ('map_rus_wgs84_geo.json') है, और' russia = 'के साथ उपसर्ग करके, मैं उत्पन्न टोपोलॉजी में ऑब्जेक्ट का नाम सेट कर सकता हूं। यही कारण है कि लिंक्ड उदाहरण में, मैं 'russia.objects.russia' का उल्लेख करता हूं। – mbostock