POI是“POInt of Interest”的缩写,中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。根据POI点识别功能区的方法有多种,本文采取最常见的方法,即POI点缓冲区面积占比大小来识别(具体方法应该根据研究区和POI点特征来选取)。
研究区位置:
数据准备:
POI点:由于是长沙市中心,服务业发达,兴趣点主要以商业点和居住点为主;
1.各类兴趣点点比例差异大;
2.在居住区内商业服务多,会存在重叠现象;
3.分布不均匀。
经去除重复点和按兴趣点关键字重新调整后
总POI点:181243个
占比:
商业点:91725 |
50.6% |
居住点:43139 |
23.8% |
公共服务点:26926 |
14.8% |
工业点:10649 |
5.9% |
交通设施点:9804 |
5.4% |
该地区的OSM路网数据:
分析过程:
对存在拓扑错误的路网进行相关处理后把不符合分区要求(不能有伪节点,不能有悬挂点)的线段进行裁剪删除或者添加(拓扑错误修改后面我会专门出一篇文章哦),最后把交通线挖空整理形成936个研究单元(线转面工具)。
存在问题:在对交通线进行裁剪,添加形成新的研究单元时可能会对原先的聚集的兴趣点产生一定的分割,影响后续研究区的功能分区分析。
措施:对照原始路网和兴趣点分布对一些特征明显的地区进行重新划分研究区。
路网划分研究单元如下所示:
首先对添加进来的5类POI点先进行合并,用研究区裁剪合并后的POI点(研究区里面有些道路是被挖空了的,落在空白处的POI点不参与后续计算,所以要全部落在研究区范围内的POI点才有效哦)然后用研究区进行标识:
(注意:标识时连接属性只要选择ONLY_FID就行了,因为我标识的目的只要知道我这个POI点属于哪一个研究区范围就行了,其他的研究单元属性字段我不需要,所以不要连接,如果连接了也没事,就是看得很多字段很乱哈哈哈哈)
标识的作用就是让所有落入同一个研究单元内的点都知道自己属于这个研究单元,每个POI点后面都有了所在研究单元的所有属性字段。
那么问题来了,怎么知道每个研究单元里面每一类POI点数量有多少呢?(这一步非常重要)首先我们要在研究区属性表添加5个字段用来存放不同的类型的POI数量,然后打开之前标识点数据的属性表,点击按属性选择,点击区分POI点类型的字段“type”,里面只有1,2,3,4,5种选择
选中其中一种,接下来很关键哦!!!!选中后点击标识后添加过来的研究区编号字段(FID_研究区)这是唯一区分研究单元的编号,右键选择汇总:
这个界面啥也不用管,直接点确定就行了,后面会生成一个表,里面纪录了每一个研究单元里面含有多少个POI点。这样分别选中5类POI点,汇总5次就可以得到5个表,每个表对应研究单元里面含有一类POI点的数量,然后分别连接到研究区数据,再分别复制POI数量字段到之前新添加的字段就行了。
根据兴趣点公共认知度分别做不同半径的缓冲区,其中商业点:200米,居住点:250米,公共服务点:300米,工业点:350米,交通设施点:400米。
注意融合类型选择ALL
上面文章只是将数据给处理好,还没有开始计算,接下来就是计算为主了,要大量使用字段计算器,如果有小伙伴不懂VB或者Python语法的话可以自行区百度哦。
功能区划分标准:
(其中k:第k个研究区,i:第i类兴趣点,Sk:第k个研究区面积,Si:第i类兴趣点缓冲区在该研究区内的面积,ni:第i类兴趣点在该研究区内的数量)
以单一研究区内的某类兴趣点缓冲区面积占该研究单元内所有缓冲区面积的比重作为该兴趣点在该研究区内的权重。由于商业点比重超过50%,其在单一研究区内H值超过60%则定义该研究区为商业区,于此相反,交通设施点占比单一研究区内交通设施点H值超过40%作为交通设施功能区,其他均以超过50%作为划分单一功能区的标准,余下的划分为混合功能区。
混合功能区细分:分别计算5大类兴趣点在某一单一研究区内任意两类兴趣点的H值之和,选择其中占比最大的H值,如果其比重高于50%则研究区划分为##-##功能区,否则定义该功能区类型为混合功能区(这是我针对数据的独特性进行设置的识别阈值,各位小伙伴视不同情况使用不同的划分标准哦,一定要实事求是!)。
用POI点根据不同类别建立不同半径的缓冲区后,分别用研究区裁剪这5类缓冲区(因为有些点在研究区边缘,缓冲区会在研究区范围外面,这个没有意义,还有就是研究区里面有些道路是被挖空了的,落在空白处的缓冲区面积也不参与后续计算),然后再用研究区分别标识这5个缓冲区。
(注意:标识时连接属性只要选择ONLY_FID就行了,因为我标识的目的只要知道我这个缓冲区属于哪一个研究区范围就行了,其他的研究单元属性字段我不需要,所以不要连接,如果连接了也没事,就是看到很多字段很乱哈哈哈哈)
标识结果如下所示:
(“FID_研究区”字段是每个研究单元的标识码,一般会自动添加面积字段,单位为平方米,如果不确定可以自己添加字段-计算几何-面积再计算一遍)
那么问题来了,怎么知道每一个研究单元里面每一类POI点缓冲区面积有多少呢?(这一步非常重要)首先我们要在研究区属性表添加5个字段用来存放不同类型的POI缓冲区面积,接着打开之前标识缓冲区数据的属性表,点击自动添加过来的研究区编号字段(FID_研究区,这是唯一区分研究单元的编号),右键选择汇总:
一定要记得在面积字段下拉选项下勾选总和,点击确定后会生成一个表,里面纪录了每一个研究单元里面含有该类POI点缓冲区的面积。这样用相同的方法分别对其他4类标识缓冲区进行汇总,最后就可以得到5个表,每个表对应一类POI点缓冲区在所属研究单元里面的面积,接着根据字段(FID_研究区)将5个表分别连接到研究区属性表,再分别使用字段计算器复制POI点缓冲区面积字段到之前新添加的字段就行了。
现在研究区属性表里面已经有了各类POI点数量以及各类缓冲区面积,数据已经准备齐全了,就差计算了。根据前面的功能区划分标准,在研究区属性表添加字段“sum”计算5类POI缓冲区面积*POI点数量之和:
具体代码如下:
sum([ !sy面积! *!商业! + !jz面积!* !居住!+ !gy工业!* !工业!+ !gf面积!* !公共服务!+ !jt面积!* !交通设施])
注意:*号前面是缓冲区面积,后面是对应的POI点数量!!!!!!!
下面进行单一功能区的划分:添加一个文本类型的字段“功能区”,右键字段计算器,选择python语言,相关参数如下:
具体代码如下:
def N(a,b,c,d,e,A,B,C,D,E,S):
if(S>0.0):
if(1.0*a*A/S>0.6):
return "商业"
if(1.0*b*B/S>0.5):
return "居住"
if(1.0*c*C/S>0.5):
return "工业"
if(1.0*d*D/S>0.5):
return "公共服务"
if(1.0*e*E/S>0.4):
return "交通设备"
else:
return "混合功能区"
else:
return "数据不足"
N (!商业!,!居住!,!工业!,!公共服务!,!交通设施!,!sy面积!,!jz面积!, !gy工业!,!gf面积!,!jt面积!,!sum!)
接着是混合功能区的细分:添加一个字段“max”,字段计算器输入如下代码:
max([!sy面积! *!商业!+!jz面积!* !居住!,!sy面积!*!商业!+ !gy工业!*!工业!,!sy面积!* !商业!+!gf面积!*!公共服务!,!sy面积!* !商业!+!jt面积!*!交通设施!,!jz面积!*!居住!+!gy工业!*!工业!,!jz面积!*!居住!+!gf面积!*!公共服务!,!jz面积!*!居住!+!jt面积! *!交通设施!,!gy工业!*!工业!+!gf面积!*!公共服务!,!gy工业!*!工业!+!jt面积!*!交通设施!,!gf面积!*!公共服务!+!jt面积!*!交通设施!])
max函数是计算里面的最大值,这样可以得到单一研究区内任意两类兴趣点的H值之和的最大值,方便后续计算。
按属性选择“功能区”字段值为混合功能区的行,字段计算器设置如下:
具体代码如下所示:
def N(a,b,c,d,e,f,g,h,i,j,m,s):
if(1.0*m/s<0.5):
return "混合功能区"
else:
if(m==j):
return "公共服务-交通设备"
if(m==i):
return "工业-交通设备"
if(m==h):
return "工业-公共服务"
if(m==g):
return "居住-交通设备"
if(m==f):
return "居住-公共服务"
if(m==e):
return "居住-工业"
if(m==d):
return "商业-交通设备"
if(m==c):
return "商业-公共服务"
if(m==b):
return "商业-工业"
else:
return "商业-居住"
N(!sy面积! *!商业! + !jz面积!* !居住!, !sy面积! *!商业! + !gy工业!* !工业!, !sy面积!* !商业! + !gf面积!* !公共服务! , !sy面积!* !商业! + !jt面积!* !交通设施!, !jz面积! *!居住! + !gy工业!* !工业!, !jz面积!* !居住! + !gf面积! *!公共服务! , !jz面积!* !居住! + !jt面积! *!交通设施! , !gy工业!* !工业! + !gf面积! *!公共服务! , !gy工业! *!工业! + !jt面积!* !交通设施!, !gf面积! *!公共服务! + !jt面积! *!交通设施!,!max!,!sum!)
最后
至此功能区划分完毕,最后右键研究区右键选择属性,设置如下:
符号化后功能区识别结果图: