注:此处的表格请使用.csv格式,.xlsx和.xls格式不保证能成功。完整代码直接拉到最下。
先来看看我们即将用到的csv文件:
一共五项数据,其中最核心的属性是x、y坐标,其余的都是次要属性,plotid是编号,value1、value2是随机生成的数值。
第一步:打开arcmap,首先不要直接从add data中添加csv文件,选择Add XY Data:
点击以后会弹出这么个框:
至此我们算是达到了阶段性的胜利:让点显示在arcmap里面了!
但是此时我们注意到,我们得到的并不是点的矢量文件,而是一个这样的东西:
所以第二步:我们右键这个events,选择Export Data导出:
这就转成了矢量文件:
查看一下属性没问题就成功了。
上述手动操作都是针对数据量小情况的操作,如果涉及到批量处理,比如有几百上千个点文件要转矢量,就需要用到代码。
我们直接使用Arcmap自带python:
第一步首先进行一些前期设置,比如导入功能模块、设置输入输出路径:
# -*- coding: utf-8 -*-
# 首先检查python中是否有以下模块
import csv
import arcpy
import os
import arcgisscripting
# 设置路径
input = "E:\\points.csv" # 待处理csv文件
outputname = "point.shp" # 待输出shapefile文件
outputpath = "E:\\" # 待输出shapefile文件
output = outputpath+'\\'+outputname # 待输出shapefile文件完整路径
第二步我们创建一个点状矢量文件:
# 创建处理对象
gp = arcgisscripting.create()
gp.OverWriteOutput = True ## 允许overwrite
# 创建矢量点文件
gp.CreateFeatureclass(outputpath,outputname,"Point")
第三步,创建属性字段,俗称表头,就是下面这个东西:
其中,FID是系统自动加上的编号不必理会,Shape*是一个叫几何令牌的东西,可以访问特定几何信息,在点状要素中,这个几何信息指的是坐标xy,剩下的几个字段就跟csv的表头一模一样了。
下面是在shapefile里创建属性字段代码:
# 创建属性字段
gp.AddField(output, "plotid", "LONG")
gp.AddField(output, "x", "DOUBLE")
gp.AddField(output, "y", "DOUBLE")
gp.AddField(output, "value1", "DOUBLE")
gp.AddField(output, "value2", "DOUBLE")
AddField函数的三个参数分别是:shapefile路径、字段名称(自己随便命名,可以和csv中统一,也可以不统一)、字段数据类型(有LONG、DOUBLE、TXT等类型,注意没有float)
表头创建好了,那么第四步就是向表里添加数据了:
# 添加数据
cur = gp.InsertCursor(output)
pnt = gp.CreateObject("Point")
## 打开csv文件
f = open(input,'r')
data = csv.reader(f,delimiter=',')
next(data) # 跳过表头
## 读入数据
for line in data:
# 获取csv每行中的五个数据,依次赋予变量plotid、x、y、value1、value2
plotid = int(line[0])
x = float(line[1])
y = float(line[2])
value1 = float(line[3])
value2 = float(line[4])
# 将以上四个变量写入shapefile相应字段
feat = cur.NewRow()
pnt.x = x
pnt.y = y
feat.shape = pnt
feat.x = pnt.x
feat.y = pnt.y
feat.plotid = plotid
feat.value1 = value1
feat.value2 = value2
cur.InsertRow(feat)
del cur
f.close()
运行以后就大功告成了。
最后附上完整代码:
# -*- coding: utf-8 -*-
"""
@author: 国宝级退堂鼓手
"""
# 首先检查python中是否有以下模块
import csv
import arcpy
import os
import arcgisscripting
# 设置路径
input = "E:\\points.csv" # 待处理csv文件
outputname = "point.shp" # 待输出shapefile文件
outputpath = "E:" # 待输出shapefile文件
output = outputpath+'\\'+outputname # 待输出shapefile文件完整路径
# 创建处理对象
gp = arcgisscripting.create()
gp.OverWriteOutput = True ## 允许overwrite
# 创建矢量点文件
gp.CreateFeatureclass(outputpath,outputname,"Point")
# 创建属性字段
gp.AddField(output, "plotid", "LONG")
gp.AddField(output, "x", "DOUBLE")
gp.AddField(output, "y", "DOUBLE")
gp.AddField(output, "value1", "DOUBLE")
gp.AddField(output, "value2", "DOUBLE")
# 添加数据
cur = gp.InsertCursor(output)
pnt = gp.CreateObject("Point")
## 打开csv文件
f = open(input,'r')
data = csv.reader(f,delimiter=',')
next(data) # 跳过表头
## 读入数据
for line in data:
# 获取csv每行中的五个数据,依次赋予变量plotid、x、y、value1、value2
plotid = int(line[0])
x = float(line[1])
y = float(line[2])
value1 = float(line[3])
value2 = float(line[4])
# 将以上四个变量写入shapefile相应字段
feat = cur.NewRow()
pnt.x = x
pnt.y = y
feat.shape = pnt
feat.x = pnt.x
feat.y = pnt.y
feat.plotid = plotid
feat.value1 = value1
feat.value2 = value2
cur.InsertRow(feat)
del cur
f.close()