दिलचस्प पोस्ट
एक पायथन डायस को संशोधित करते हुए इसे ऊपर चलना जाँच करें कि कोई संपत्ति एक वर्ग में मौजूद है या नहीं कैसे पुनरावर्ती सी में काम करता है मैं कैसे जान सकता हूँ जब कोई संपादन टेक्स्ट फोकस खो देता है? प्लेयर बनाने में त्रुटि: CommandInvokationFailure: डेक्स प्रारूप में वर्गों को परिवर्तित करने में असमर्थ OS X पर Multiarch OpenSSL बनाएं क्या PHP को थ्रेड करना है? UNINSTALL_SHORTCUT की कोशिश कर रहा है, लेकिन शॉर्टकट नहीं चलेगा अच्छा एईएस प्रारंभिक वेक्टर अभ्यास वसंत वेब, सुरक्षा + वेब। एक्सएमएल + एमवीसी प्रेषक + बीन को दो बार बनाया जाता है मैं जावास्क्रिप्ट में एक तिथि तुलना कैसे करूं? शून्य लंबाई का सरणी पिपथॉन लूप के लिए और के बाद 'एफ़' का उपयोग क्यों करता है? जावा में स्ट्रिंग सरणी को ऑब्जेक्ट सरणी कैसे परिवर्तित करें आप प्रदर्शन परीक्षण जावास्क्रिप्ट कोड कैसे करते हैं?

डी 3 में एक नक्शा केंद्र को एक भौगोलिक तत्व दिया जाता है

वर्तमान में डी 3 में यदि आपके पास एक भौगोलिक तत्व है जो आप आकर्षित करने जा रहे हैं, तो आपको इसे स्केल करना होगा और इसका अनुवाद करने के लिए उस आकार को प्राप्त करने के लिए इसे अनुवाद करना होगा और इसे केंद्र में लाने के लिए इसका अनुवाद करना होगा। यह परीक्षण और त्रुटि का एक बहुत कठिन कार्य है, और मैं सोच रहा था कि किसी को भी इन मूल्यों को प्राप्त करने का बेहतर तरीका पता है?

इसलिए उदाहरण के लिए यदि मुझे यह कोड है I

var path, vis, xy; xy = d3.geo.mercator().scale(8500).translate([0, -1200]); path = d3.geo.path().projection(xy); vis = d3.select("#vis").append("svg:svg").attr("width", 960).attr("height", 600); d3.json("../../data/ireland2.geojson", function(json) { return vis.append("svg:g") .attr("class", "tracts") .selectAll("path") .data(json.features).enter() .append("svg:path") .attr("d", path) .attr("fill", "#85C3C0") .attr("stroke", "#222"); }); 

कैसे मैं नरक प्राप्त कर सकते हैं। स्केल (8500) और। ट्रांसस्लेट ([0, -1200]) छोटे से थोड़ा बिना जा रहे हैं?

वेब के समाधान से एकत्रित समाधान "डी 3 में एक नक्शा केंद्र को एक भौगोलिक तत्व दिया जाता है"

निम्न आपको लगभग क्या करना चाहते हैं स्केलिंग ठीक लगता है मेरे नक्शे पर इसे लागू करते समय एक छोटा ऑफसेट होता है यह छोटा ऑफसेट शायद इसलिए होता है क्योंकि मैं अनुवाद कमान का उपयोग मानचित्र के केंद्र में करने के लिए करता हूं, जबकि मुझे केंद्र आदेश का प्रयोग करना चाहिए।

  1. एक प्रक्षेपण और d3.geo.path बनाएँ
  2. वर्तमान प्रक्षेपण की सीमाओं की गणना करें
  3. पैमाने और अनुवाद की गणना के लिए इन सीमाओं का उपयोग करें
  4. प्रक्षेपण को फिर से बनाएं

कोड में:

  var width = 300; var height = 400; var vis = d3.select("#vis").append("svg") .attr("width", width).attr("height", height) d3.json("nld.json", function(json) { // create a first guess for the projection var center = d3.geo.centroid(json) var scale = 150; var offset = [width/2, height/2]; var projection = d3.geo.mercator().scale(scale).center(center) .translate(offset); // create the path var path = d3.geo.path().projection(projection); // using the path determine the bounds of the current map and use // these to determine better values for the scale and translation var bounds = path.bounds(json); var hscale = scale*width / (bounds[1][0] - bounds[0][0]); var vscale = scale*height / (bounds[1][1] - bounds[0][1]); var scale = (hscale < vscale) ? hscale : vscale; var offset = [width - (bounds[0][0] + bounds[1][0])/2, height - (bounds[0][1] + bounds[1][1])/2]; // new projection projection = d3.geo.mercator().center(center) .scale(scale).translate(offset); path = path.projection(projection); // add a rectangle to see the bound of the svg vis.append("rect").attr('width', width).attr('height', height) .style('stroke', 'black').style('fill', 'none'); vis.selectAll("path").data(json.features).enter().append("path") .attr("d", path) .style("fill", "red") .style("stroke-width", "1") .style("stroke", "black") }); 

मेरा जवाब जनवरी वैन डेर लायन के करीब है, लेकिन आप चीजों को थोड़ा सरल कर सकते हैं क्योंकि आपको भौगोलिक केंद्रक की गणना करने की आवश्यकता नहीं है; आपको केवल बाउंडिंग बॉक्स की आवश्यकता है और, एक अनसैलेटेड, अप्रभावी इकाई प्रक्षेपण का उपयोग करके, आप गणित को सरल बना सकते हैं।

कोड का महत्वपूर्ण हिस्सा यह है:

 // Create a unit projection. var projection = d3.geo.albers() .scale(1) .translate([0, 0]); // Create a path generator. var path = d3.geo.path() .projection(projection); // Compute the bounds of a feature of interest, then derive scale & translate. var b = path.bounds(state), s = .95 / Math.max((b[1][0] - b[0][0]) / width, (b[1][1] - b[0][1]) / height), t = [(width - s * (b[1][0] + b[0][0])) / 2, (height - s * (b[1][1] + b[0][1])) / 2]; // Update the projection to use computed scale & translate. projection .scale(s) .translate(t); 

यूनिट प्रक्षेपण में फ़ीचर के बाउंडिंग बॉक्स को सम्मिलित करने के बाद, आप बाउन्डिंग बॉक्स ( b[1][0] - b[0][0] और b[1][1] - b[0][1] के पहलू अनुपात की तुलना करके उपयुक्त पैमाने की गणना कर सकते हैं b[1][1] - b[0][1] ) कैनवास के पहलू अनुपात ( width और height ) इस मामले में, मैंने बाउंडिंग बॉक्स को 100% के बजाय कैनवास के 95% तक बढ़ाया है, इसलिए स्ट्रोक्स और आस-पास की विशेषताओं या पैडिंग के किनारों पर थोड़ा अतिरिक्त कमरा है।

फिर आप बाउन्डिंग बॉक्स के केंद्र का उपयोग करके अनुवाद की गणना कर सकते हैं ( (b[1][0] + b[0][0]) / 2 और (b[1][1] + b[0][1]) / 2 ) और कैनवास का केन्द्र ( width / 2 और height / 2 )। नोट करें कि चूंकि बाउंडिंग बॉक्स यूनिट प्रोजेक्शन के निर्देशांक में है, यह पैमाने ( s ) द्वारा गुणा किया जाना चाहिए।

उदाहरण के लिए, bl.ocks.org/4707858 :

बाउंडिंग बॉक्स के लिए प्रोजेक्ट

एक संबंधित प्रश्न है जहां प्रक्षेपण को समायोजित किए बिना एक संग्रह में एक विशिष्ट विशेषताओं के लिए ज़ूम करना है, यानी , ज़ूम इन और आउट करने के लिए ज्यामितीय रूपांतरण के साथ प्रक्षेपण का संयोजन। यह ऊपर के समान सिद्धांतों का उपयोग करता है, लेकिन गणित थोड़ा अलग है क्योंकि ज्यामितीय रूपांतरण (एसवीजी "रूपांतरण" विशेषता) भौगोलिक प्रक्षेपण के साथ जोड़ा जाता है।

उदाहरण के लिए, bl.ocks.org/4699541 :

बाउंडिंग बॉक्स में ज़ूम करें

मैं डी 3 के लिए नया हूँ – यह समझाने की कोशिश करेगी कि मैं इसे कैसे समझता हूं, लेकिन मुझे यकीन नहीं है कि मुझे सबकुछ ठीक हो गया।

यह रहस्य जानना है कि कार्टेशियन अंतरिक्ष (एक्स, वाई स्क्रीन पर) पर कार्टिंग स्पेस (अक्षांश, रेखांश) और अन्य पर कुछ तरीके काम करेंगे। कार्टोग्राफिक स्पेस (हमारे ग्रह) (लगभग) गोलाकार है, कार्टेशियन अंतरिक्ष (स्क्रीन) सपाट है – दूसरे पर एक को मानचित्रित करने के लिए आपको एल्गोरिदम की आवश्यकता होती है, जिसे प्रोजेक्शन कहा जाता है । यह अंतरिक्ष अनुमानों के आकर्षक विषय में गहराई से बहुत कम है और कैसे वे विमान में गोलाकार को बदलने के लिए भौगोलिक विशेषताओं को विकृत करते हैं; कुछ को कोणों के संरक्षण के लिए डिज़ाइन किया गया है, अन्य दूरीों का संरक्षण करते हैं और इतने पर- हमेशा एक समझौता होता है (माइक पॉसॉक में उदाहरणों का एक बड़ा संग्रह है )

यहां छवि विवरण दर्ज करें

डी 3 में, प्रक्षेपण ऑब्जेक्ट में केंद्र की संपत्ति / सेटर है, जो नक्शा इकाइयों में दी गई है:

projection.center ([स्थान])

यदि केंद्र निर्दिष्ट है, तो निर्दिष्ट स्थान पर प्रक्षेपण केंद्र सेट करता है, डिग्री में अक्षांश और अक्षांश के एक दो-तत्व सरणी और प्रक्षेपण देता है। यदि केंद्र निर्दिष्ट नहीं है, तो वर्तमान केंद्र जो ⟨0 डिग्री, 0 डिग्री⟩ से चूक जाता है

पिक्सेल में दिए गए अनुवाद भी है – जहां प्रोजेक्शन केंद्र कैनवास के सापेक्ष है:

projection.translate ([बिंदु])

यदि बिंदु निर्दिष्ट है, तो प्रक्षेपण के अनुवाद निर्दिष्ट दो-तत्व सरणी [x, y] को ऑफ़सेट करता है और प्रक्षेपण देता है। यदि बिंदु निर्दिष्ट नहीं है, तो वर्तमान अनुवाद ऑफसेट देता है जो [480, 250] के लिए डिफ़ॉल्ट है। अनुवाद ऑफ़सेट प्रक्षेपण केंद्र के पिक्सेल निर्देशांक निर्धारित करता है। डिफ़ॉल्ट अनुवाद ऑफसेट स्थान ⟨0 °, 0 °⟩ एक 960 × 500 क्षेत्र के केंद्र में।

जब मैं कैनवास में एक फीचर को केन्द्रित करना चाहता हूं, तो मुझे प्रोजेक्शन सेंटर को फ़ीचर बाउंडिंग बॉक्स के केंद्र में सेट करना है – मेरे देश (ब्राजील) के लिए Mercator (WGS 84, Google मानचित्र में उपयोग किया जाता है) का उपयोग करते समय यह मेरे लिए काम करता है, अन्य अनुमानों और गोलार्धों का उपयोग करके कभी भी परीक्षण नहीं किया गया आपको अन्य स्थितियों के लिए समायोजन करना पड़ सकता है, लेकिन यदि आप इन बुनियादी सिद्धांतों को नकारते हैं तो आप ठीक होंगे।

उदाहरण के लिए, एक अनुमान और पथ दिया गया है:

 var projection = d3.geo.mercator() .scale(1); var path = d3.geo.path() .projection(projection); 

path से bounds विधि पिक्सल में बाउंडिंग बॉक्स देता है नक्शा इकाइयों में आकार के साथ पिक्सल में आकार की तुलना करके, सही पैमाने पर खोजने के लिए इसका उपयोग करें (0.95 आपको चौड़ाई या ऊँचाई के लिए सर्वश्रेष्ठ फिट से 5% मार्जिन देता है)। यहां मूलभूत ज्यामिति, आयताकार चौड़ाई / ऊंचाई की गणना तिरछे विरोध वाले कोनों की गणना:

 var b = path.bounds(feature), s = 0.9 / Math.max( (b[1][0] - b[0][0]) / width, (b[1][1] - b[0][1]) / height ); projection.scale(s); 

यहां छवि विवरण दर्ज करें

नक्शा इकाइयों में बाउंडिंग बॉक्स को खोजने के लिए d3.geo.bounds विधि का उपयोग करें:

 b = d3.geo.bounds(feature); 

बाउंडिंग बॉक्स के केंद्र में प्रोजेक्शन का केंद्र सेट करें:

 projection.center([(b[1][0]+b[0][0])/2, (b[1][1]+b[0][1])/2]); 

मानचित्र के केंद्र को कैनवास के केंद्र में स्थानांतरित करने के लिए translate पद्धति का उपयोग करें:

 projection.translate([width/2, height/2]); 

अब तक आपके पास 5% मार्जिन के साथ झूम किए गए मानचित्र के केंद्र में सुविधा होना चाहिए।

डी 3 वी 4 के साथ इसका आसान तरीका आसान हो गया!

 var projection = d3.geoMercator().fitSize([width, height], geojson); var path = d3.geoPath().projection(projection); 

और अंत में

 g.selectAll('path') .data(geojson.features) .enter() .append('path') .attr('d', path) .style("fill", "red") .style("stroke-width", "1") .style("stroke", "black"); 

आनंद लें, चीयर्स

एक केंद्र () विधि है जिसे आप प्रयोग कर सकते हैं जो अक्षांश / लोन जोड़ी को स्वीकार करता है।

मैं जो समझता हूं, अनुवाद () का इस्तेमाल केवल नक्शे के पिक्सेल को शाब्दिक रूप से करने के लिए किया जाता है मुझे यकीन नहीं है कि यह निर्धारित करने के लिए कि किस पैमाने पर है

मैं इंटरनेट पर अपने मानचित्र को केंद्रित करने के लिए एक उपद्रव-मुक्त तरीके से देख रहा था, और जन वैन डेर लायन और एमबोस्टॉक के उत्तर से प्रेरित हुआ। यदि आप एसटीवीजी के लिए एक कंटेनर का उपयोग कर रहे हैं, तो यहां jQuery का उपयोग करना आसान तरीका है। मैंने पैडिंग / सीमाओं आदि के लिए 95% की सीमा बनाई।

 var width = $("#container").width() * 0.95, height = $("#container").width() * 0.95 / 1.9 //using height() doesn't work since there's nothing inside var projection = d3.geo.mercator().translate([width / 2, height / 2]).scale(width); var path = d3.geo.path().projection(projection); var svg = d3.select("#container").append("svg").attr("width", width).attr("height", height); 

यदि आप सटीक स्केलिंग की तलाश कर रहे हैं, तो यह उत्तर आपके लिए काम नहीं करेगा। लेकिन मेरे जैसे अगर, आप एक कंटेनर में केंद्रीकृत एक नक्शा प्रदर्शित करना चाहते हैं, यह पर्याप्त होना चाहिए मैं मर्कैटर मानचित्र को प्रदर्शित करने की कोशिश कर रहा था और पाया कि यह विधि मेरे मानचित्र को केंद्रीकृत करने में उपयोगी थी, और मुझे इसकी आवश्यकता नहीं थी इसलिए मैं आसानी से अंटार्कटिक हिस्से को काट सकता था।

मानचित्र को पैन / ज़ूम करने के लिए आपको एसवीजी को पत्रक पर ओवरले करना देखना चाहिए। एसवीजी को बदलने से यह बहुत आसान होगा इस उदाहरण http://bost.ocks.org/mike/leaflet/ देखें और फिर लीफलेट में नक्शा केंद्र कैसे बदलें

एमबॉस्टॉक्स के उत्तर के साथ, और हर्ब कैडिल की टिप्पणी, मैंने अलास्का के साथ मुद्दों पर चलना शुरू कर दिया क्योंकि मैं एक मर्केटर प्रक्षेपण का उपयोग कर रहा था। मुझे ध्यान रखना चाहिए कि मेरे अपने उद्देश्यों के लिए, मैं परियोजनाओं और अमेरिका के केंद्रों की कोशिश कर रहा हूं। मैंने पाया कि मुझे जनवरी वैन डेर लायन के साथ दो जवाबों से विवाह करना था, जो बहुभुजों के लिए निम्नलिखित अपवाद के साथ उत्तर देते हैं, जो गोलार्द्धों को ओवरलैप करते हैं (बहुभुज जो पूर्व-पश्चिम के लिए एक पूर्ण मूल्य के साथ समाप्त होता है जो 1 से अधिक है):

  1. मर्केटर में एक सरल प्रोजेक्शन सेट अप करें:

    प्रक्षेपण = d3.geo.mercator ()। पैमाने (1)। ट्रांसस्लेट ([0,0]);

  2. मार्ग बनाएं:

    पथ = डी 3.geo.path ()। प्रक्षेपण (प्रक्षेपण);

3. मेरी सीमा बढ़ाएं:

 var bounds = path.bounds(topoJson), dx = Math.abs(bounds[1][0] - bounds[0][0]), dy = Math.abs(bounds[1][1] - bounds[0][1]), x = (bounds[1][0] + bounds[0][0]), y = (bounds[1][1] + bounds[0][1]); 

अलास्का के लिए अपवाद जोड़ें और कहा गया है कि गोलार्द्धों को ओवरलैप करना है:

 if(dx > 1){ var center = d3.geo.centroid(topojson.feature(json, json.objects[topoObj])); scale = height / dy * 0.85; console.log(scale); projection = projection .scale(scale) .center(center) .translate([ width/2, height/2]); }else{ scale = 0.85 / Math.max( dx / width, dy / height ); offset = [ (width - scale * x)/2 , (height - scale * y)/2]; // new projection projection = projection .scale(scale) .translate(offset); } 

आशा है कि ये आपकी मदद करेगा।

उन लोगों के लिए जो ऊर्ध्वाधर और क्षैतिजता को समायोजित करना चाहते हैं, यहां समाधान है:

  var width = 300; var height = 400; var vis = d3.select("#vis").append("svg") .attr("width", width).attr("height", height) d3.json("nld.json", function(json) { // create a first guess for the projection var center = d3.geo.centroid(json) var scale = 150; var offset = [width/2, height/2]; var projection = d3.geo.mercator().scale(scale).center(center) .translate(offset); // create the path var path = d3.geo.path().projection(projection); // using the path determine the bounds of the current map and use // these to determine better values for the scale and translation var bounds = path.bounds(json); var hscale = scale*width / (bounds[1][0] - bounds[0][0]); var vscale = scale*height / (bounds[1][1] - bounds[0][1]); var scale = (hscale < vscale) ? hscale : vscale; var offset = [width - (bounds[0][0] + bounds[1][0])/2, height - (bounds[0][1] + bounds[1][1])/2]; // new projection projection = d3.geo.mercator().center(center) .scale(scale).translate(offset); path = path.projection(projection); // adjust projection var bounds = path.bounds(json); offset[0] = offset[0] + (width - bounds[1][0] - bounds[0][0]) / 2; offset[1] = offset[1] + (height - bounds[1][1] - bounds[0][1]) / 2; projection = d3.geo.mercator().center(center) .scale(scale).translate(offset); path = path.projection(projection); // add a rectangle to see the bound of the svg vis.append("rect").attr('width', width).attr('height', height) .style('stroke', 'black').style('fill', 'none'); vis.selectAll("path").data(json.features).enter().append("path") .attr("d", path) .style("fill", "red") .style("stroke-width", "1") .style("stroke", "black") }); 

मैं कैसे टॉपोजसन को केंद्रित कर रहा हूं, जहां मुझे इस सुविधा को निकालने की आवश्यकता थी:

  var projection = d3.geo.albersUsa(); var path = d3.geo.path() .projection(projection); var tracts = topojson.feature(mapdata, mapdata.objects.tx_counties); projection .scale(1) .translate([0, 0]); var b = path.bounds(tracts), s = .95 / Math.max((b[1][0] - b[0][0]) / width, (b[1][1] - b[0][1]) / height), t = [(width - s * (b[1][0] + b[0][0])) / 2, (height - s * (b[1][1] + b[0][1])) / 2]; projection .scale(s) .translate(t); svg.append("path") .datum(topojson.feature(mapdata, mapdata.objects.tx_counties)) .attr("d", path)