ArcGIS使用字段计算器python脚本整理三规合一图斑

最近试着使用字段计算器内的python脚本整理图斑,蹒跚学步,做下记录。

1.用地代码与名称转换

1.1城规用地代码CGYDDM转用地名称CGYDMC

做一个python字典再索引即可(码齐这些分类还挺累。。)

list = { 
'A':'公共管理与公共服务用地',
'A1':'行政办公用地',
'A2':'文化设施用地',
'A21':'图书展览设施用地',
'A22':'文化活动设施用地',
'A3':'教育科研用地',
'A31':'高等院校用地',
'A32':'中等专业学校用地',
'A33':'中小学用地',
'A34':'特殊教育用地',
'A35':'科研用地',
'A4':'体育用地',
'A41':'体育场馆用地',
'A42':'体育训练用地',
'A5':'医疗卫生用地',
'A51':'医院用地',
'A52':'卫生防疫用地',
'A53':'特殊医疗用地',
'A59':'其它医疗卫生用地',
'A6':'社会福利设施用地',
'A7':'文物古迹用地',
'A8':'外事用地',
'A9':'宗教设施用地',
'B':'商业服务业设施用地',
'B1':'商业设施用地',
'B11':'零售商业用地',
'B12':'批发市场用地',
'B13':'餐饮用地',
'B14':'旅馆用地',
'B2':'商务设施用地',
'B21':'金融保险用地',
'B22':'艺术传媒用地',
'B29':'其他商务设施用地',
'B3':'娱乐康体设施用地',
'B31':'娱乐用地',
'B32':'康体用地',
'B4':'公用设施营业网点用地',
'B41':'加油加气站用地',
'B49':'其它公用设施营业网点用地',
'B9':'其它服务设施用地',
'E':'非建设用地',
'E1':'水域',
'E11':'自然水域',
'E12':'水库',
'E13':'坑塘沟渠',
'E2':'农林用地',
'E9':'其它非建设用地',
'G':'绿地与广场用地',
'G1':'公园绿地',
'G2':'防护绿地',
'G3':'广场用地',
'H':'建设用地',
'H1':'城乡居民点建设用地',
'H11':'城市建设用地',
'H12':'镇建设用地',
'H13':'乡建设用地',
'H14':'村庄建设用地',
'H2':'区域交通设施用地',
'H21':'铁路用地',
'H22':'公路用地',
'H23':'港口用地',
'H24':'机场用地',
'H25':'管道运输用地',
'H3':'区域公用设施用地',
'H4':'特殊用地',
'H41':'军事用地',
'H42':'安保用地',
'H5':'采矿用地',
'H9':'其它建设用地',
'M':'工业用地',
'M1':'一类工业用地',
'M2':'二类工业用地',
'M3':'三类工业用地',
'R1':'一类居住用地',
'R11':'一类居住用地-住宅用地',
'R12':'一类居住用地-服务设施用地',
'R2':'二类居住用地',
'R21':'二类居住用地-住宅用地',
'R22':'二类居住用地-服务设施用地',
'R3':'三类居住用地',
'R31':'三类居住用地-住宅用地',
'R32':'三类居住用地-服务设施用地',
'S':'道路与交通设施用地',
'S1':'城市道路用地',
'S2':'城市轨道交通用地',
'S3':'交通枢纽用地',
'S4':'交通站场用地',
'S41':'公共交通站场用地',
'S42':'社会停车场用地',
'S9':'其它交通设施用地',
'U':'公用设施用地',
'U1':'供应设施用地',
'U11':'供水用地',
'U12':'供电用地',
'U13':'供燃气用地',
'U14':'供热用地',
'U15':'通信设施用地',
'U16':'广播电视设施用地',
'U2':'环境设施用地',
'U21':'排水设施用地',
'U22':'环卫设施用地',
'U23':'环保设施用地',
'U3':'安全设施用地',
'U31':'消防设施用地',
'U32':'防洪设施用地',
'U9':'其它公用设施用地',
'W':'物流仓储用地',
'W1':'一类物流仓储用地',
'W2':'二类物流仓储用地',
'W3':'三类物流仓储用地',
}

再给CGYDMC字段赋值

list.get( !CGYDDM! )

1.2 土规用地代码TGYDDM转用地名称TGYDMC

list = { 
'1110':'水田',
'1120':'水浇地',
'1130':'旱地',
'1310':'有林地',
'1320':'灌木林',
'1330':'其它林地',
'1410':'天然牧草地',
'1420':'人工牧草地',
'1510':'设施农用地',
'1520':'农村道路',
'1530':'坑塘水面',
'1540':'农田水利用地',
'1550':'田坎',
'2110':'城镇用地',
'2120':'农村居民点用地',
'2130':'采矿用地',
'2140':'其它独立建设用地',
'2210':'铁路用地',
'2220':'公路用地',
'2230':'民用机场用地',
'2240':'港口码头用地',
'2250':'管道运输用地',
'2260':'水库水面',
'2270':'水工建筑用地',
'2310':'风景名胜设施用地',
'2320':'特殊用地',
'2330':'盐田',
'3110':'河流水面',
'3120':'湖泊水面',
'3130':'滩涂',
'3210':'荒草地',
'3220':'盐碱地',
'3230':'沙地',
'3240':'裸地',
'3250':'其它未利用土地',
'1100':'耕地',
'1200':'园地',
'1300':'林地',
'1400':'牧草地',
'1500':'其它农用地',
'2100':'城乡建设用地',
'2200':'交通水利用地',
'2300':'其他建设用地',
'3100':'水域',
'3200':'自然保留地',
'1000':'农用地',
'2000':'建设用地',
'3000':'其它土地'}

2.衔接地类代码整理

城规

cx = ['H11', 'H14', 'H5']
fc = ['H2', 'H4', 'H9']
fJ = ['E1', 'E2', 'E9']

def CGXJDLDM(CG):
  if  CG in cx:
    return 'cx'
  elif CG in fc:
    return 'fc'
  else:
    return 'fJ'

赋值:

CGXJDLDM(!CGDLDM!)

3用地差异

3.1 三规合一之城规CG与土规TG建设用地差异CYFQMC

定义一个函数,然后用条件语句分类

因为两规的规划范围不一致,导致两规的衔接地类代码中均出现空值‘’,可归为非建fJ。(正确流程还是先统一两规边界再做后续分析,故fJ不需再包含空值)

J = ['cx', 'fc']
fJ = ['fJ','']
 
def CYFX(CG,TG):
       if TG in J and CG in fJ:
         return "土规建设用地,城规非建设用地"
       elif CG in J and TG in fJ:
         return "土规非建设用地,城规建设用地"
       elif CG in J and TG in J:
         return "城乡规划和土地利用总体规划均为建设用地"
       else:
         return "城乡规划和土地利用总体规划均为非建设用地"

下方字段赋值

CYFQMC=
CYFX( !CGXJDLDM!, !TGXJDLDM!)

3.2三规合一之现状XZ与土规TG建设用地差异CYFQMC

需要注意的问题是,ArcGIS10.2.2如果字段使用了中文的字符,python条件语句会执行出错,纠结好久才发现这个问题所在。

被迫把国土已批GTYP和复垦用地FKYD字段改为短整给值1。

J = ['cx', 'fc']
fJ = ['fJ', '']
 
def CYFX(XZ,TG,GTYP,FKYD):
    if TG in J and XZ in fJ:
      if GTYP == 1:
        return "土规为建设用地,现状为非建设用地,已批未建"
      else:
        return "土规为建设用地,现状为非建设用地,未批未建"
 
    elif TG in fJ and XZ in J:
      if FKYD == 1:
        return "土规为非建设用地,现状为建设用地,复垦用地"
      elif GTYP == 1:
        return "土规为非建设用地,现状为建设用地,非复垦用地,已批已建"
      else:
        return "土规为非建设用地,现状为建设用地,非复垦用地,未批已建"
 
    elif XZ in J and TG in fJ:
      return "土规与现状均为建设用地"
    else:
      return "土规与现状均为非建设用地"

赋值: CYFX( !XZXJDLDM!, !TGXJDLDM!, !GTYP!, !FKYD!)

3.3三规合一之现状XZ与城规CG建设用地差异CYFQMC

J = ['cx', 'fc']
fJ = ['fJ', '']
 
def CYFX(XZ,CG,GHYP):
    if CG in J and XZ in fJ:
      if GHYP == 1:
        return "城规为建设用地,现状为非建设用地,已批未建"
      else:
        return "城规为建设用地,现状为非建设用地,未批未建"
    elif XZ in J and CG in fJ:
      if GHYP == 1:
        return "城规为非建设用地,现状为建设用地,已批已建"
      else:
        return "城规为非建设用地,现状为建设用地,未批已建"
    elif XZ in J and CG in J:
      return "城规与现状均为建设用地"
    else:
      return "城规与现状均为非建设用地"

4.字符串操作

4.1地块编号

如按镇区首字母大写加5位数字:HP00001,后面的ID可以用自动生成的ObjectID或者重新生成一个

ID=0
def newID():
    global ID
    ID+=1
    return ID
 
newID()

接下来是字符串的对齐操作,左对齐5位,补充0,再添加打头字母即可。 'HP'+'{:0>5}'.format('ID')

5.ArcGIS中python的中文支持问题

查了不少地方,最终解决方案为中文字符串后加 .decode('utf-8'),如:

'建设用地区'.decode('utf-8')

补充点题外的:忽然发现字段查询器那里SQL语句,可以使用例如 CGYDDM NOT IN ( '' , 'E1' , 'E2' , 'FZBYD', 'H2' ) 的方式完成多个条件的简化,看来SQL语法还是要单独去学学。

未完待续

博客搬家

comments powered by Disqus