Как использовать высокие карты в реакции? - PullRequest
0 голосов
/ 05 мая 2019

Я хочу отобразить карту в своем проекте React, она выглядит так: https://www.highcharts.com/docs/maps/latlon

Я видел руководство, но я хочу использовать его в реакции. руководство все о родном html / js.

и я увлекся, здесь есть реактивная оболочка: https://github.com/highcharts/highcharts-react Я попытался использовать это для создания демонстрационного приложения. И вот мой файл .js:

import React from "react";
import { Component } from "react";
import { render } from "react-dom";
import Highcharts from "highcharts";
import HC_map from "highcharts/modules/map";
import HighchartsReact from "highcharts-react-official";
import mapData from "./mapdata.js";
import usaMapData from "./UsaMapData.js";
import usaBubbleData from "./usaBubbleData";

HC_map(Highcharts);

const mapOptions = {
  title: {
    text: "Map-Demo"
  },
  tooltip: {
    formatter: function() {
      return (
        this.point.capital +
        ", " +
        this.point.parentState +
        "<br>Lat: " +
        this.point.lat +
        " Lon: " +
        this.point.lon +
        "<br>Population: " +
        this.point.population
      );
    }
    // crosshairs: [
    //   {
    //     zIndex: 5,
    //     dashStyle: "dot",
    //     snap: false,
    //     color: "gray"
    //   },
    //   {
    //     zIndex: 5,
    //     dashStyle: "dot",
    //     snap: false,
    //     color: "gray"
    //   }
    // ]
  },
  mapNavigation: {
    enabled: false
  },
  series: [
    {
      name: "Basemap",
      mapData: usaMapData,
      borderColor: "#606060",
      nullColor: "rgba(200, 200, 200, 0.2)",
      showInLegend: false
    },
    {
      name: "Separators",
      type: "mapline",
      //   data: H.geojson(usaMapData, "mapline"),
      color: "#101010",
      enableMouseTracking: false
    },
    {
      type: "mapbubble",
      dataLabels: {
        enabled: true,
        format: "{point.capital}"
      },
      name: "Cities",
      data: usaBubbleData,
      maxSize: "12%",
      color: "#7cb5ec"
    }
  ]
};

export default class Mapdemo extends Component {
  // eslint-disable-next-line no-useless-constructor
  constructor(props) {
    super(props);
  }

  render() {
    // console.dir(dataBubble);
    return (
      <div>
        <HighchartsReact
          highcharts={Highcharts}
          constructorType={"mapChart"}
          options={mapOptions}
        />
      </div>
    );
  }
}

но синий пузырь не отображается на экране. Я получил только серую карту США. и я сравниваю код с демо источника ниже: (с официального сайта highmaps)

$(function () {
    var H = Highcharts,
        map = H.maps['countries/us/us-all'],
        chart;
    // Add series with state capital bubbles
    $.getJSON('https://data.jianshukeji.com/jsonp?filename=json/us-capitals.json&callback=?', function (json) {
        var data = [];
        $.each(json, function (ix, entry) {
            entry.z = entry.population;
            data.push(entry);
        });
        $('#container').highcharts('Map', {
            title: {
                text: 'Highmaps lat/lon demo'
            },
            tooltip: {
                formatter: function () {
                    return this.point.capital + ', ' + this.point.parentState + '<br>Lat: ' + this.point.lat + ' Lon: ' + this.point.lon + '<br>Population: ' + this.point.population;
                },
                crosshairs: [{
                    zIndex: 5,
                    dashStyle: 'dot',
                    snap: false,
                    color: 'gray'
                }, {
                    zIndex: 5,
                    dashStyle: 'dot',
                    snap: false,
                    color: 'gray'
                }],
            },
            mapNavigation: {
                enabled: true
            },
            series: [{
                name: 'Basemap',
                mapData: map,
                borderColor: '#606060',
                nullColor: 'rgba(200, 200, 200, 0.2)',
                showInLegend: false
            }, {
                name: 'Separators',
                type: 'mapline',
                data: H.geojson(map, 'mapline'),
                color: '#101010',
                enableMouseTracking: false
            }, {
                type: 'mapbubble',
                dataLabels: {
                    enabled: true,
                    format: '{point.capital}'
                },
                name: 'Cities',
                data: data,
                maxSize: '12%',
                color: H.getOptions().colors[0]
            }]
        });
        chart = $('#container').highcharts();
    });
    // Display custom label with lat/lon next to crosshairs
    $('#container').mousemove(function (e) {
        var position;
        if (chart) {
            if (!chart.lab) {
                chart.lab = chart.renderer.text('', 0, 0)
                    .attr({
                    zIndex: 5
                })
                    .css({
                    color: '#505050'
                })
                    .add();
            }
            e = chart.pointer.normalize(e);
            position = chart.fromPointToLatLon({
                x: chart.xAxis[0].toValue(e.chartX),
                y: chart.yAxis[0].toValue(e.chartY)
            });
            chart.lab.attr({
                x: e.chartX + 5,
                y: e.chartY - 22,
                text: 'Lat: ' + position.lat.toFixed(2) + '<br>Lon: ' + position.lon.toFixed(2)
            });
        }
    });
    $('#container').mouseout(function (e) {
        if (chart && chart.lab) {
            chart.lab.destroy();
            chart.lab = null;
        };
    });
});

HTML :

<script src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.2.2/proj4.js"></script>
<script src="https://img.hcharts.cn/mapdata/countries/us/us-all.js"></script>
<div id="container"></div>

если я закомментирую свойство данных в серии (тип: "mapbubble"), то я получу абсолютно такой же результат с моим собственным кодом. так что ошибка может быть здесь. но я сравниваю usaBubbleData с data в демоверсии, это те же данные. Я скопировал их из демо.

вот мой usaBubbleData:

var usaBubbleData = [
  {
    abbrev: "AL",
    parentState: "Alabama",
    capital: "Montgomery",
    lat: 32.38012,
    lon: -86.300629,
    population: 205764,
    z: 205764
  },
  {
    abbrev: "AK",
    parentState: "Alaska",
    capital: "Juneau",
    lat: 58.29974,
    lon: -134.406794,
    population: 31275,
    z: 31275
  },
  {
    abbrev: "AZ",
    parentState: "Arizona",
    capital: "Phoenix",
    lat: 33.44826,
    lon: -112.075774,
    population: 1445632,
    z: 1445632
  },
  {
    abbrev: "AR",
    parentState: "Arkansas",
    capital: "Little Rock",
    lat: 34.748655,
    lon: -92.274494,
    population: 193524,
    z: 193524
  },
  {
    abbrev: "CA",
    parentState: "California",
    capital: "Sacramento",
    lat: 38.579065,
    lon: -121.491014,
    population: 466488,
    z: 466488
  },
  {
    abbrev: "CO",
    parentState: "Colorado",
    capital: "Denver",
    lat: 39.74001,
    lon: -104.992259,
    population: 600158,
    z: 600158
  },
  {
    abbrev: "CT",
    parentState: "Connecticut",
    capital: "Hartford",
    lat: 41.763325,
    lon: -72.674069,
    population: 124775,
    z: 124775
  },
  {
    abbrev: "DE",
    parentState: "Delaware",
    capital: "Dover",
    lat: 39.158035,
    lon: -75.524734,
    population: 36047,
    z: 36047
  },
  {
    abbrev: "FL",
    parentState: "Florida",
    capital: "Tallahassee",
    lat: 30.439775,
    lon: -84.280649,
    population: 181376,
    z: 181376
  },
  {
    abbrev: "GA",
    parentState: "Georgia",
    capital: "Atlanta",
    lat: 33.748315,
    lon: -84.391109,
    population: 420003,
    z: 420003
  },
  {
    abbrev: "HI",
    parentState: "Hawaii",
    capital: "Honolulu",
    lat: 21.30477,
    lon: -157.857614,
    population: 337256,
    z: 337256
  },
  {
    abbrev: "ID",
    parentState: "Idaho",
    capital: "Boise",
    lat: 43.60698,
    lon: -116.193409,
    population: 205671,
    z: 205671
  },
  {
    abbrev: "IL",
    parentState: "Illinois",
    capital: "Springfield",
    lat: 39.801055,
    lon: -89.643604,
    population: 116250,
    z: 116250
  },
  {
    abbrev: "IN",
    parentState: "Indiana",
    capital: "Indianapolis",
    lat: 39.76691,
    lon: -86.149964,
    population: 820445,
    z: 820445
  },
  {
    abbrev: "IA",
    parentState: "Iowa",
    capital: "Des Moines",
    lat: 41.58979,
    lon: -93.615659,
    population: 203433,
    z: 203433
  },
  {
    abbrev: "KS",
    parentState: "Kansas",
    capital: "Topeka",
    lat: 39.049285,
    lon: -95.671184,
    population: 127473,
    z: 127473
  },
  {
    abbrev: "KY",
    parentState: "Kentucky",
    capital: "Frankfort",
    lat: 38.19507,
    lon: -84.878694,
    population: 25527,
    z: 25527
  },
  {
    abbrev: "LA",
    parentState: "Louisiana",
    capital: "Baton Rouge",
    lat: 30.443345,
    lon: -91.186994,
    population: 229493,
    z: 229493
  },
  {
    abbrev: "ME",
    parentState: "Maine",
    capital: "Augusta",
    lat: 44.318036,
    lon: -69.776218,
    population: 19136,
    z: 19136
  },
  {
    abbrev: "MD",
    parentState: "Maryland",
    capital: "Annapolis",
    lat: 38.9767,
    lon: -76.489934,
    population: 38394,
    z: 38394
  },
  {
    abbrev: "MA",
    parentState: "Massachusetts",
    capital: "Boston",
    lat: 42.358635,
    lon: -71.056699,
    population: 617594,
    z: 617594
  },
  {
    abbrev: "MI",
    parentState: "Michigan",
    capital: "Lansing",
    lat: 42.73194,
    lon: -84.552249,
    population: 114297,
    z: 114297
  },
  {
    abbrev: "MN",
    parentState: "Minnesota",
    capital: "Saint Paul",
    lat: 44.943829,
    lon: -93.093326,
    population: 285068,
    z: 285068
  },
  {
    abbrev: "MS",
    parentState: "Mississippi",
    capital: "Jackson",
    lat: 32.29869,
    lon: -90.180489,
    population: 173514,
    z: 173514
  },
  {
    abbrev: "MO",
    parentState: "Missouri",
    capital: "Jefferson City",
    lat: 38.577515,
    lon: -92.177839,
    population: 43079,
    z: 43079
  },
  {
    abbrev: "MT",
    parentState: "Montana",
    capital: "Helana",
    lat: 46.58976,
    lon: -112.021202,
    population: 28190,
    z: 28190
  },
  {
    abbrev: "NE",
    parentState: "Nebraska",
    capital: "Lincoln",
    lat: 40.81362,
    lon: -96.707739,
    population: 258379,
    z: 258379
  },
  {
    abbrev: "NV",
    parentState: "Nevada",
    capital: "Carson City",
    lat: 39.164885,
    lon: -119.766999,
    population: 55274,
    z: 55274
  },
  {
    abbrev: "NH",
    parentState: "New Hampshire",
    capital: "Concord",
    lat: 43.20725,
    lon: -71.536604,
    population: 42695,
    z: 42695
  },
  {
    abbrev: "NJ",
    parentState: "New Jersey",
    capital: "Trenton",
    lat: 40.217875,
    lon: -74.759404,
    population: 84913,
    z: 84913
  },
  {
    abbrev: "NM",
    parentState: "New Mexico",
    capital: "Santa Fe",
    lat: 35.691543,
    lon: -105.937406,
    population: 67947,
    z: 67947
  },
  {
    abbrev: "NY",
    parentState: "New York",
    capital: "Albany",
    lat: 42.651445,
    lon: -73.755254,
    population: 97856,
    z: 97856
  },
  {
    abbrev: "NC",
    parentState: "North Carolina",
    capital: "Raleigh",
    lat: 35.78551,
    lon: -78.642669,
    population: 403892,
    z: 403892
  },
  {
    abbrev: "ND",
    parentState: "North Dakota",
    capital: "Bismarck",
    lat: 46.805372,
    lon: -100.779334,
    population: 61272,
    z: 61272
  },
  {
    abbrev: "OH",
    parentState: "Ohio",
    capital: "Columbus",
    lat: 39.96196,
    lon: -83.002984,
    population: 787033,
    z: 787033
  },
  {
    abbrev: "OK",
    parentState: "Oklahoma",
    capital: "Oklahoma City",
    lat: 35.472015,
    lon: -97.520354,
    population: 579999,
    z: 579999
  },
  {
    abbrev: "OR",
    parentState: "Oregon",
    capital: "Salem",
    lat: 44.93326,
    lon: -123.043814,
    population: 154637,
    z: 154637
  },
  {
    abbrev: "PA",
    parentState: "Pennsylvania",
    capital: "Harrisburg",
    lat: 40.259865,
    lon: -76.88223,
    population: 49528,
    z: 49528
  },
  {
    abbrev: "RI",
    parentState: "Rhode Island",
    capital: "Providence",
    lat: 41.823875,
    lon: -71.411994,
    population: 178042,
    z: 178042
  },
  {
    abbrev: "SC",
    parentState: "South Carolina",
    capital: "Columbia",
    lat: 33.99855,
    lon: -81.045249,
    population: 129272,
    z: 129272
  },
  {
    abbrev: "SD",
    parentState: "South Dakota",
    capital: "Pierre",
    lat: 44.368924,
    lon: -100.350158,
    population: 13646,
    z: 13646
  },
  {
    abbrev: "TN",
    parentState: "Tennessee",
    capital: "Nashville",
    lat: 36.167783,
    lon: -86.778365,
    population: 601222,
    z: 601222
  },
  {
    abbrev: "TX",
    parentState: "Texas",
    capital: "Austin",
    lat: 30.267605,
    lon: -97.742984,
    population: 790390,
    z: 790390
  },
  {
    abbrev: "UT",
    parentState: "Utah",
    capital: "Salt Lake City",
    lat: 40.759505,
    lon: -111.888229,
    population: 186440,
    z: 186440
  },
  {
    abbrev: "VT",
    parentState: "Vermont",
    capital: "Montpelier",
    lat: 44.260299,
    lon: -72.576264,
    population: 7855,
    z: 7855
  },
  {
    abbrev: "VA",
    parentState: "Virginia",
    capital: "Richmond",
    lat: 37.5407,
    lon: -77.433654,
    population: 204214,
    z: 204214
  },
  {
    abbrev: "WA",
    parentState: "Washington",
    capital: "Olympia",
    lat: 47.039231,
    lon: -122.891366,
    population: 46478,
    z: 46478
  },
  {
    abbrev: "WV",
    parentState: "West Virginia",
    capital: "Charleston",
    lat: 38.350195,
    lon: -81.638989,
    population: 51400,
    z: 51400
  },
  {
    abbrev: "WI",
    parentState: "Wisconsin",
    capital: "Madison",
    lat: 43.07295,
    lon: -89.386694,
    population: 233209,
    z: 233209
  },
  {
    abbrev: "WY",
    parentState: "Wyoming",
    capital: "Cheyenne",
    lat: 41.134815,
    lon: -104.821544,
    population: 59466,
    z: 59466
  }
];

export default usaBubbleData;

и я не знаю, что не так с кодом.

введите описание изображения здесь

1 Ответ

0 голосов
/ 05 мая 2019

Итак, здесь есть пара вещей, на которые стоит обратить внимание:

(1) Если вы должны включить Highcharts через CDN (не рекомендуется), теги CDN script из Highchart ДОЛЖНЫ появиться ДО того, как вы загрузите свое приложение. Это гарантирует, что глобальная переменная Highcharts будет установлена ​​до того, как ваше приложение попытается отобразить. Опять же, очень важно, чтобы javascript из CDN анализировался и загружался до javascript вашего приложения. Пожалуйста, используйте MDN документы для справки о том, как контролировать порядок загрузки.

Обратите внимание, что вы также можете изменить код приложения, чтобы отложить выполнение до полной загрузки страницы. Эти высокоуровневые документы имеют пример этого.

(2) Исходя из этого, если в ваше приложение включено highcharts-реагировать , вы можете передать глобальную переменную Highcharts непосредственно в компонент HighchartsReact в качестве реквизита. См. параметры для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...