javascript - amCharts map ,纬度对数坐标上带有气泡

标签 javascript dictionary charts amcharts amcharts4

完全可以创建这种类型的 map :

https://www.amcharts.com/demos/map-bubbles/

但是不是使用国家 ID 定位气泡而是通过纬度和经度坐标来定位气泡?我需要为我拥有数据的每个城市放置一个气泡,因此每个国家/地区可能不止一个气泡。

我有一个这样的数据结构:

Array (
        "name" => $row["city"],
        "latitude" => $row["latitude"],
        "longitude" => $row["longitude"],
        "value" => $row["count"],
    );

最佳答案

我也面临着同样的困境,设法解决了它。

因此,您分配给图像系列的数据需要属性latitudelongitudevalue,以便可以放置气泡和大小可以确定。

imageSeries.dataFields.value 将从您的数据中分配 value 属性,而 imageTemplate.propertyFields.latitudeimageTemplate .propertyFields.longitude将从您的数据中获取经度纬度

该函数是用 JavaScript 编写的,如下所示:

import * as am4core from "@amcharts/amcharts4/core";
import * as am4maps from "@amcharts/amcharts4/maps";
import am4geodata_worldLow from "@amcharts/amcharts4-geodata/worldLow";

/* This is what the data looks like  
[
  {
    latitude: 48.856614,
    longitude: 2.352222,
    value: 100,
    title: "Paris",
  },
  {
    latitude: 40.712775,
    longitude: -74.005973,
    value: 200,
    title: "New York",
  },
  {
    latitude: 49.282729,
    longitude: -123.120738,
    value: 1000,
    title: "Vancouver",
  },
];
*/

const setupBubbleMap = ({ elementId }) => {
  let amChart = am4core.create(elementId, am4maps.MapChart);

  let title = amChart.titles.create();
  title.text = "[bold font-size: 20]Hotspots[/]";
  title.textAlign = "middle";

  amChart.geodata = am4geodata_worldLow;
  amChart.projection = new am4maps.projections.Miller();

  let polygonSeries = amChart.series.push(new am4maps.MapPolygonSeries());
  polygonSeries.exclude = ["AQ"];
  polygonSeries.useGeodata = true;
  polygonSeries.nonScalingStroke = true;
  polygonSeries.strokeWidth = 0.5;

  const polygonTemplate = polygonSeries.mapPolygons.template;
  polygonTemplate.tooltipText = "{title}";
  polygonSeries.calculateVisualCenter = true;

  let imageSeries = amChart.series.push(new am4maps.MapImageSeries());
  imageSeries.dataFields.value = "value";

  let imageTemplate = imageSeries.mapImages.template;
  imageTemplate.nonScaling = true;
  imageTemplate.propertyFields.latitude = "latitude";
  imageTemplate.propertyFields.longitude = "longitude";

  imageSeries.data = data;

  let circle = imageTemplate.createChild(am4core.Circle);
  circle.fillOpacity = 0.7;
  circle.fill = am4core.color("#B27799");
  circle.tooltipText = "{title}: [bold]{value}[/]";

  imageSeries.heatRules.push({
    target: circle,
    property: "radius",
    min: 4,
    max: 30,
    dataField: "value",
  });

  imageTemplate.adapter.add("latitude", function (latitude, target) {
    let polygon = polygonSeries.getPolygonById(target.dataItem.dataContext.id);
    if (polygon) {
      return polygon.visualLatitude;
    }
    return latitude;
  });

  imageTemplate.adapter.add("longitude", function (longitude, target) {
    let polygon = polygonSeries.getPolygonById(target.dataItem.dataContext.id);
    if (polygon) {
      return polygon.visualLongitude;
    }
    return longitude;
  });

  return amChart;
};

export default setupBubbleMap;

关于javascript - amCharts map ,纬度对数坐标上带有气泡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68177245/

相关文章:

AndroidPlot:如何在 AppWidget 中呈现图表?

asp.net-mvc - 如何创建 3D 饼图? -Asp.net MVC

javascript - Redux 表单操作未定义

Scala groupBy+ map 问题

java - Map<K,V>.keySet() 不支持添加/添加所有操作

csv - 将列表字典写入 csv

javascript - 只有 1 个结果时如何限制谷歌条形图的宽度?

javascript - 存储 setInterval 的值

javascript - 替换具有相同类名的元素

javascript - 滚动脚本实现不起作用