ฉันใหม่สำหรับ d3 - จะพยายามอธิบายวิธีที่ฉันเข้าใจ แต่ฉันไม่แน่ใจว่าฉันได้รับทุกอย่างถูกต้อง
ความลับคือรู้ว่าวิธีการบางอย่างจะทำงานในพื้นที่ทำแผนที่ (ละติจูด, ลองจิจูด) และอื่น ๆ ในพื้นที่คาร์ทีเซียน (x, y บนหน้าจอ) พื้นที่การทำแผนที่ (โลกของเรา) เป็น (เกือบ) ทรงกลมพื้นที่คาร์ทีเซียน (หน้าจอ) จะแบน - เพื่อ map หนึ่งในช่วงอื่น ๆ ที่คุณจำเป็นต้องมีขั้นตอนวิธีการที่เรียกว่าการฉาย พื้นที่นี้สั้นเกินกว่าจะเจาะลึกลงไปในเรื่องที่น่าสนใจของการคาดการณ์และวิธีที่มันบิดเบือนลักษณะทางภูมิศาสตร์เพื่อที่จะเปลี่ยนเป็นทรงกลมเป็นระนาบ บางตัวได้รับการออกแบบมาเพื่อการอนุรักษ์มุมและอื่น ๆ เป็นการอนุรักษ์ระยะทางและอื่น ๆ - มีการประนีประนอมอยู่เสมอ (Mike Bostock มีตัวอย่างมากมาย)
ใน d3 วัตถุเส้นโครงมีคุณสมบัติกึ่งกลาง / ตัวตั้งค่าที่กำหนดในหน่วยแผนที่:
projection.center ([ตั้ง])
หากระบุจุดศูนย์กลางให้ตั้งค่ากึ่งกลางของเส้นโครงเป็นตำแหน่งที่ระบุอาร์เรย์สององค์ประกอบของลองจิจูดและละติจูดเป็นองศาและส่งคืนเส้นโครง หากไม่ได้ระบุจุดศูนย์กลางให้ส่งกลับจุดศูนย์กลางปัจจุบันซึ่งค่าเริ่มต้นคือ⟨0°, 0 °⟩
นอกจากนี้ยังมีการแปลให้เป็นพิกเซล - ที่ศูนย์การฉายยืนเทียบกับผืนผ้าใบ:
projection.translate ([จุด])
หากระบุจุดให้ตั้งค่าการแปลของโปรเจ็กเตอร์ให้ตรงกับอาเรย์สององค์ประกอบที่ระบุ [x, y] และส่งคืนการฉาย หากไม่ได้ระบุจุดให้ส่งคืนออฟเซ็ตการแปลปัจจุบันซึ่งค่าเริ่มต้นเป็น [480, 250] ออฟเซ็ตการแปลกำหนดพิกัดพิกเซลของกึ่งกลางของโปรเจ็กเตอร์ การชดเชยการแปลเริ่มต้นจะวางตำแหน่ง⟨0°, 0 °⟩ที่กึ่งกลางของพื้นที่ 960 × 500
เมื่อฉันต้องการจัดกึ่งกลางคุณลักษณะในผืนผ้าใบฉันชอบตั้งค่ากึ่งกลางของฉายภาพไว้ที่กึ่งกลางของกรอบคุณสมบัติ - สิ่งนี้ใช้ได้กับฉันเมื่อใช้Mercator (WGS 84, ใช้ใน google maps) สำหรับประเทศของฉัน (บราซิล) ไม่เคยทดสอบโดยใช้การฉายภาพและซีกโลกอื่น ๆ คุณอาจต้องทำการปรับเปลี่ยนสำหรับสถานการณ์อื่น ๆ แต่ถ้าคุณตอกย้ำหลักการพื้นฐานเหล่านี้คุณจะไม่เป็นไร
ตัวอย่างเช่นกำหนดเส้นโครงและเส้นทาง:
var projection = d3.geo.mercator()
.scale(1);
var path = d3.geo.path()
.projection(projection);
bounds
วิธีจากpath
ผลตอบแทนกรอบพิกเซล ใช้เพื่อค้นหามาตราส่วนที่ถูกต้องโดยเปรียบเทียบขนาดเป็นพิกเซลกับขนาดในหน่วยแผนที่ (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%