(GIS可视化)蜂窝多边形密度图



这里写图片描述

一、渔网图

在地图可视化中我们一定都见过好看的渔网图:


这里写图片描述

这个其实很简单,直接用Arcgis的渔网工具就可以 创建。

可创建包含由矩形像元所组成网络的要素类。创建渔网需要三条基本信息:渔网的空间范围、行数和列数以及旋转的角度。要指定这些基本信息可通过多种方法。例如,您可能不确定准确的行数和列数,但却清楚每个矩形像元必须正好为 110 米乘 63 米,并且必须覆盖另一要素类的空间范围。

此工具共包含 11 个参数,您最好将这些参数分成不同的四组:

  • 渔网的空间范围
  • 渔网的行数与列数以及各单位的高度与宽度
  • 渔网的旋转角度
  • 定义输出要素类名称和类型(面或线)的参数以及包含各像元质心的可选点数据集

    这里写图片描述

这个很简单,不必多说,下面来看怎么制作好看的蜂窝图:


这里写图片描述

二、生成蜂窝点

2.1蜂窝密度是干什么的?

你看到这幅图可能会问了,为什么要做这样一幅图,有什么用?

原因就是,现有的分析范围不能满足我们的需求。

比如我们有邯郸市的餐厅数据表,我们想知道邯郸市到底哪个商业区(新天地,新世纪)的餐厅密度大。但是我们现在只有大的行政区表(邯山区,复兴区,丛台区),现在问题来了如何缩小文门的分析范围?

使用蜂窝图(渔网图)就可以完美解决这一问题,我们可以自定义分析区域的大小,从而得到我们想要的图。

2.2蜂窝点算法

传统的渔网点直接使用渔网工具即可,生成出来是正四边形。

我们来看看生成蜂窝点的算法脚本:

#!/usr/bin/env python
"""
为泰森多边形创建六边形点.
ArcGIS 版本:  10.2
"""

import math
import os
import arcpy


def create_thiessen_points(study_area, side_length, output_fc):

    # 输入图层
    count = int(str(arcpy.GetCount_management(study_area)))
    if count == 0:
        arcpy.AddError('没有找到该图层' + str(study_area))
        return
    side_length = float(side_length)
    if side_length <= 0:
        arcpy.AddError('超出范围')
        return

    # 计算点范围
    dx = 3.0 * side_length
    dy = side_length / 2.0 * math.sqrt(3.0)
    indent = dx / 2

    desc = arcpy.Describe(study_area)
    if desc.dataType == "FeatureLayer":
        desc = arcpy.Describe(desc.featureClass.catalogPath)
    ext = desc.extent

    # 计算行列
    xmin = ext.XMin - dx
    ymin = ext.YMin - dy * 3.0
    xmax = ext.XMax + dx
    ymax = ext.YMax + dy * 3.0
    num_rows = int((ymax - ymin) / dy) + 1
    num_cols = int((xmax - xmin) / dx) + 2

    # 创建输出图层
    spatial_ref = desc.spatialReference
    workspace = os.path.dirname(output_fc)
    fc_name = os.path.basename(output_fc)
    fc = arcpy.CreateFeatureclass_management(
        workspace, fc_name, "POINT", "", "", "", spatial_ref)


    arcpy.AddMessage('Creating ' + str(num_rows * num_cols) + ' points...')
    cursor = arcpy.InsertCursor(output_fc)
    feature = None

    try:
        y = ymin
        for r in range(num_rows):
            x = xmin - indent / 2
            if r % 2 != 0:
                x += indent

            for c in range(num_cols):
                feature = cursor.newRow()
                p = arcpy.Point()
                p.X = x
                p.Y = y
                feature.shape = p
                cursor.insertRow(feature)
                x += dx

            y += dy

    finally:
        if feature:
            del feature
        if cursor:
            del cursor


if __name__ == '__main__':
    is_test = False

    if is_test:
        raise Exception(' Testing not yet implemented')
    else:
        study_area = arcpy.GetParameterAsText(0)
        side_length = arcpy.GetParameterAsText(1)
        output_fc = arcpy.GetParameterAsText(2)

    create_thiessen_points(study_area, side_length, output_fc)

我们直接将脚本在Arcgis中封装成工具箱即可。


这里写图片描述

生成后的渔网点:

这里写图片描述

3.生成蜂窝六边形

有了渔网点后,我们根据渔网点创建泰森多边形。

这里写图片描述

这样未经处理的数据肯定不是我们想要的结果,所以我们要根据我们需要的边界将多余的去除。

我们按输入图层的空间关系进行选择,然以删掉多余图层,得到结果:

这里写图片描述

下面是我整理好的工具箱。

这里写图片描述

4.数据分析

有了蜂窝多边形我们就可以做可视化分析了。

以上面邯郸市餐饮数据为例。

这里写图片描述

我们将餐饮数据和多边形进行空间链接(以多边形为目标表)

有关空间链接,参考http://blog.csdn.net/qq_34149805/article/details/70170867

可以得到每个多边形落入餐厅的个数,然后我们制作成分级色彩图:

这里写图片描述

最终效果:

这里写图片描述

转载自:https://blog.csdn.net/qq_34149805/article/details/70217232

You may also like...