用 Mathematica 画地理热力图

这里( https://geistlib.xyz/activeprobegfw.html )的热力图是用 HeatMapper 画的,主要是因为可以交互,但由于最多8000个点,对一些长相更奇怪的、没有重复因此无法靠权重减少数据点的数据,它是没用的。Mathematica 在版本10中引入了 Geographic Visualization (地理可视化?),版本12中引入GeoSmoothHistogram函数,可作为替代。

geoiplookup得到的GFW服务器坐标为例

  1. 导入数据。finCN.csv的文件格式比较混乱(抱歉),可先提取有用数据再做一点简单的修整,例如
    awk '{print $2}' finCN.csv | sed 's/.$//g' > data.txt
    
    再于MMA中
    data = Import["data.txt", "Data"]
    
    得到形如
    {{36.6683, 116.997}, {22.8108, 108.316}, ... {30.589, 114.268}}
    
    21000×2矩阵,每行为一个坐标数据点,格式为{纬度,经度}
  2. 数据点转换成地理坐标,简单地使用 GeoPosition 即可
    coors = GeoPosition[data]
    
  3. 作图用 GeoSmoothHistogram,
    graph = GeoSmoothHistogram[coors, {1, "StandardGaussian"},
      ColorFunction -> "Rainbow", Mesh -> 10,
      MeshStyle -> {Dashed, Thickness[0.0001]},
      GeoBackground -> "StreetMap",
      GeoServer -> "http://a.tile.openstreetmap.org/`1`/`2`/`3`.png",
      ImageSize -> 1000]
    

得到成品。