bhbhxy 发表于 2021-3-30 16:14

请教一个JS地图绘制的问题

本帖最后由 bhbhxy 于 2021-3-30 16:19 编辑

在网上找了一段地图绘制的代码,由于本人地理不是很好,有一部分不太理解,问题标注在注释里面了:
测试代码不知道为什么发不了文字链接 https://codepen.io/TroyBug/pen/mdRrYLj

代码效果在最后

可能由于网络原因这个地址访问会不正常,所以把脚本部分贴出来:

var width = 1140;
var height = 640;
var range = 15;         //这个变量的作用?
var chinaGeometry = null;
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var averageX = 109.0139239130436; //这个数值是怎么来的?
var averageY = 34.44264656750581; //同上
var mapColor = "#040809";
var mapLineColor = "#5890D5";
var requestAnimationFrameName = null;
var centerColor = "rgba(236,210,32,1)";

canvas.width = width;
canvas.height = height;
$("#canvas").css({
      marginTop: "-" + (height / 2 - 20) + "px",
      marginLeft: "-" + width / 2 + "px"
});
getChinaGeometry();

// 绘制地图
function drawShapeOptionFun() {
      chinaGeometry.features.forEach(function(chinaItem, chinaIndex) {
                var length = chinaItem.geometry.coordinates.length;
                var multipleBool = length > 1 ? true: false;
                chinaItem.geometry.coordinates.forEach(function(chinaChildItem, wordItemIndex) {
                        if (multipleBool) {
                              if (chinaChildItem.length && chinaChildItem.length == 2) {
                                        drawCanvasFun(chinaChildItem);
                              }
                              if (chinaChildItem.length && chinaChildItem.length > 2) {
                                        chinaChildItem.forEach(function(countryItem, countryIndex) {
                                                drawCanvasFun(countryItem);
                                        });
                              }
                        } else {
                              var countryPos = null;
                              if (chinaChildItem.length > 1) {
                                        countryPos = chinaChildItem;
                              } else {
                                        countryPos = chinaChildItem;
                              }
                              if (countryPos) {
                                        drawCanvasFun(countryPos);
                              }
                        }
                });
      });
}
// 绘制平面
function drawCanvasFun(itemPosition) {
      ctx.fillStyle = mapColor;
      ctx.strokeStyle = mapLineColor;
      ctx.beginPath();
      ctx.moveTo(width / 2 + (itemPosition - averageX) * range, //这里为什么要减去averageX,计算原理是什么
      height / 2 - (itemPosition - averageY) * range //问题同上
      );
      itemPosition.forEach(function(item) {
                ctx.lineTo(width / 2 + (item - averageX) * range, //这里为什么要减去averageX,计算原理是什么
                height / 2 - (item - averageY) * range //问题同上
                );
      });
      ctx.fill();
      ctx.stroke();
      ctx.closePath();
}

// 获取地理信息
function getChinaGeometry() {
      $.ajax({
                type: "GET",
                url: "https://cdn.huanggefan.cn/geojson/china.json",
                async: false,
                success: function(response) {
                        chinaGeometry = response;
                }
      });
}

function run() {
      cancelAnimationFrame(requestAnimationFrameName);
      ctx.clearRect(0, 0, width, height);
      drawShapeOptionFun();
      requestAnimationFrameName = requestAnimationFrame(run);
}
run();

我猜测上面标注的代码是处理地图偏移的,但是为什么这么写就不清楚了,求大神指导一下,感谢~

king1299 发表于 2021-3-30 16:27

本帖最后由 king1299 于 2021-3-30 16:28 编辑

var averageX = 109.0139239130436; //这个数值是怎么来的?var averageY = 34.44264656750581; //同上


这两个应该经纬度吧

bhbhxy 发表于 2021-3-30 16:32

king1299 发表于 2021-3-30 16:27
var averageX = 109.0139239130436; //这个数值是怎么来的?var averageY = 34.44264656750581; //同上

...

感觉上是经纬度,但是这两个数怎么来的呢,而且这个变量名是平均的意思

caballarri 发表于 2021-3-30 16:55

var range = 15
这个应该是控制图片大小的吧。。我觉得

bhbhxy 发表于 2021-3-30 16:56

caballarri 发表于 2021-3-30 16:55
var range = 15
这个应该是控制图片大小的吧。。我觉得

是的,这个应该是地图缩放系数
页: [1]
查看完整版本: 请教一个JS地图绘制的问题