Giống như tiêu đề đã nói, làm thế nào một người nào đó định cấu hình Mapnik để sử dụng phép chiếu bướm Waterman ?
Nếu không, những công cụ nào khác có thể kết xuất bằng phép chiếu này?
Giống như tiêu đề đã nói, làm thế nào một người nào đó định cấu hình Mapnik để sử dụng phép chiếu bướm Waterman ?
Nếu không, những công cụ nào khác có thể kết xuất bằng phép chiếu này?
Câu trả lời:
Tôi không nghĩ mapnik hoặc proj4 có thể hiển thị loại hình chiếu đó.
Theo đó bài xuất sắc , Openlayers với protovis thư viện sẽ có thể làm cho không chính xác chiếu Waterman nhưng chiếu Fuller (hay còn gọi là Dymaxion ).
Bạn thậm chí có một ví dụ trực tuyến ở đây .
Nó không dành cho Mapnik, nhưng ít nhất là plugin Dự đoán địa lý đa diện cho d3.js có thể hiển thị phép chiếu đó.
Ví dụ từ http://bl.ocks.org/mbostock/4458497 :
<!DOCTYPE html>
<meta charset="utf-8">
<style>
body {
background: #fcfcfa;
}
.stroke {
fill: none;
stroke: #000;
stroke-width: 3px;
}
.fill {
fill: #fff;
}
.graticule {
fill: none;
stroke: #777;
stroke-width: .5px;
stroke-opacity: .5;
}
.land {
fill: #222;
}
.boundary {
fill: none;
stroke: #fff;
stroke-width: .5px;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://d3js.org/d3.geo.polyhedron.v0.min.js"></script>
<script src="http://d3js.org/topojson.v1.min.js"></script>
<script>
var width = 960,
height = 550;
var projection = d3.geo.polyhedron.waterman()
.rotate([20, 0])
.scale(118)
.translate([width / 2, height / 2])
.precision(.1);
var path = d3.geo.path()
.projection(projection);
var graticule = d3.geo.graticule();
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
var defs = svg.append("defs");
defs.append("path")
.datum({type: "Sphere"})
.attr("id", "sphere")
.attr("d", path);
defs.append("clipPath")
.attr("id", "clip")
.append("use")
.attr("xlink:href", "#sphere");
svg.append("use")
.attr("class", "stroke")
.attr("xlink:href", "#sphere");
svg.append("use")
.attr("class", "fill")
.attr("xlink:href", "#sphere");
svg.append("path")
.datum(graticule)
.attr("class", "graticule")
.attr("clip-path", "url(#clip)")
.attr("d", path);
d3.json("/mbostock/raw/4090846/world-50m.json", function(error, world) {
svg.insert("path", ".graticule")
.datum(topojson.feature(world, world.objects.land))
.attr("class", "land")
.attr("clip-path", "url(#clip)")
.attr("d", path);
svg.insert("path", ".graticule")
.datum(topojson.mesh(world, world.objects.countries, function(a, b) { return a !== b; }))
.attr("class", "boundary")
.attr("clip-path", "url(#clip)")
.attr("d", path);
});
d3.select(self.frameElement).style("height", height + "px");
</script>