Scale a circle's radius (given in meters) to D3.js d3.geo.mercator map

不问归期 提交于 2019-12-06 09:23:13

A colleague of mine helped me out by showing me a much simpler way to do this (FYI - there has been an update to the lat/lon for the center of the circle). Plotting two points on the canvas and computing the distance to find the scale works and is accurate - but there is a much more simple way of doing it using the total pixels in the image and the total area of the world, code snippets and JSFiddle below:

var width = 200;
var height = 120;

//variables for scaling circle radius
var totPixels = (width * height);
var totWorldMeters = 510000000000;
var metersPerPixel = (totWorldMeters / totPixels);
var scaledRadius;

//scale the radius given in meters to pixels on the map
scaledRadius = (100 * (formattedGeoObjects[a].radius / metersPerPixel));
if(scaledRadius < 2) {
    scaledRadius = 2;
}

Working JSFiddle: https://jsfiddle.net/vnrL0fdc/15/

So, I "think" I've found a way to scale the radius (given in meters) to the pixels on the Cartesian plane d3 geo map. I'm probably making this way more complicated than it needs to be - but I'm not sure how else to do it.

The map's height, width, and projection is defined as:

var width = 200;
var height = 120;
var projection = 
    d3.geo.mercator()
    .scale((width + 1) / 2 / Math.PI)
    .translate([width / 2, height / 2]);

The geo objects that I'm plotting on the map contain lat/long coordinates for multiple points. By searching on stackoverflow, I found a distance formula:

d = sqrt((x2 - x1)^2 + (y2 - y1)^2)

The formula requires two points from the cartesian plane (x1,y1) and (x2,y2). I picked the circle's point and one of the polygon points, the lat/long coordinates are as follows:

Lat/Long for polygon1, point1: 36.5625, -24.9609375
Lat/Long for circle: 31.640625, 13.359375

I used the following web site to find out how many miles it is between the two coordinates above - http://www.freemaptools.com/how-far-is-it-between.htm

Miles between the two coordinates on the map are: 3020.207

Then I found the projected coordinates (x,y) on the Cartesian plane for the two lat/long coordinates via:

projection([long,lat])
X/Y for polygon1, point1: 86.0634765625, 38.040230671805666
X/Y for circle: 107.458984375, 41.36090550209383

So, I then plugged these values into the formula to calculate the pixel distance between the two points:

d = sqrt ( (107.458984375 - 86.0634765625)^2 + (41.36090550209383 - 38.040230671805666)^2  )
result = 21.651665891641176 pixels
miles per pixel = 139.49074473599643 (calculated by: 3020.207/21.651665891641176)
meters per pixel = 224488.5930964074505 (calculated by 139.49074473599643 * 1609.34)

Working JSFiddle: https://jsfiddle.net/vnrL0fdc/8/

This seems like an awfully roundabout way to scale meters to a mercator map projection. If anyone has a much simpler solution - please share!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!