J'utilise la projection d3.geo.conicEquidistant() sur une carte du monde approximativement centrée sur le Pacifique, mon but est de dessiner des cercles à partir d'un point, illustrant une distance spécifique, disons 1000 km, à partir de ce point sur la carte.Comment dessiner des cercles avec des rayons donnés en kilomètres avec précision sur la carte du monde
Comment puis-je calculer le rayon correct sur la projection, compte tenu de certains kilomètres?
Voici mon exemple de code (oui, il est au sujet atteint missile de la Corée du Nord artificiellement par Pyongyang de lancer le point :), sur cette question. Scale a circle's radius (given in meters) to D3.js d3.geo.mercator map
<!DOCTYPE html>
<meta charset="utf-8">
<style>
path {
stroke: white;
stroke-width: 0.25px;
fill: grey;
}
circle {
stroke: red;
stroke-width: 1px;
stroke-dasharray: 5;
fill: transparent;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://d3js.org/topojson.v0.min.js"></script>
<script>
var width = 960,
height = 500;
var projection = d3.geo.conicEquidistant()
.center([0, 5 ])
.scale((width + 1)/2/Math.PI)//.scale(150)
.rotate([-160,0]);
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
var path = d3.geo.path()
.projection(projection);
var g = svg.append("g");
var missiles = [
{
name: "missile1",
location: { // appx lat&long of pyongyang
latitude: 125.6720717,
longitude: 39.0292506
},
reach: 1000 //radius of circle in kilometers on map
},
{
name: "missile2",
location: { // appx lat&long of pyongyang
latitude: 125.6720717,
longitude: 39.0292506
},
reach: 3500 //radius of circle in kilometers on map
},
];
// load and display the World
d3.json("https://s3-us-west-2.amazonaws.com/vida-public/geo/world-topo-min.json", function(error, topology) {
g.selectAll("path")
.data(topojson.object(topology, topology.objects.countries)
.geometries)
.enter()
.append("path")
.attr("d", path)
});
svg.selectAll(".pin")
.data(missiles)
.enter().append("circle", ".pin")
.attr("r", scaledRadius)
/*function(d) {
return d.reach
})*/
.attr("transform", function(d) {
return "translate(" + projection([
d.location.latitude,
d.location.longitude
]) + ")"
})
</script>
</body>
</html>
Je regardais cette réponse, en essayant ci-dessus, mais n'était pas tout à fait en mesure de l'appliquer à mon code (je suis tout à fait nouveau à d3 pour être honnête, il pourrait y avoir quelque chose de très évident):
Autre question: est cette solution spécifique à la projection de mercator?
(Ignorons que nous avons vraiment besoin de se cacher dans l'Antarctique cette projection.)
Pouvez-vous nous lier au code de travail, ou jsfiddle cela en quelque sorte? – barrycarter
Voici un jfiddle je l'ai fait après avoir changé mon code avec la réponse d'Andrew: https://jsfiddle.net/y8qn8tr1/ - pour une raison quelconque, le chemin de la carte du monde ne montre pas dans le violon ... – Julius
Essayez https: // plutôt que http: // lors de l'accès au geojson: https://jsfiddle.net/38he3mt9/ –