將excel表格或csv轉換為Shapefile文件


讀取csv轉為shp

構造讀取csv函數

def read_csv(fp):
    ret = []
    with open(fp, 'rb') as f:
        for line in f:
            ret.append(line.decode('utf-8').strip().split(","))
    return ret

原始數據如下

from _datetime import datetime
import shapefile

data = read_csv("test3.csv")

#打開shp
w=shapefile.Writer(shapefile.POINT)
#shapefile文件要求”幾何數據”與”屬性數據”要有一一對應的關系,如果有”幾何數據”而沒有相應的屬性值存在,那么在使用ArcGIS軟件打開所創建的shapefile文件時會出錯
#為了避免這種情況的發生,可以設置 sf.autoBalance = 1,以確保每創建一個”幾何數據”,該庫會自動創建一個屬性值(空的屬性值)來進行對應。
#autoBalance默認為0

w.autoBalance = 1

#增加屬性字段 設置類型與長度
w.field('id', 'N', 12)
w.field('date', 'D')
w.field('city', 'C', 100)
w.field('location', 'C', 100)
w.field('lng', 'F', 10, 5)
w.field('lat', 'F', 10, 5)

for r in data[1:]:  #從第二行開始
    record = [
        int(r[0]),
        datetime.strftime(datetime.strptime(r[1], '%d/%m/%Y'),'%Y%m%d'),#把日/月/年轉為年\月\日格式
        r[2],
        r[3],
        float(r[4]),
        float(r[5])]
    w.record(*record)
    w.point(float(r[-2]), float(r[-1]))
w.save("sites.shp")

讀取excel文件轉為shp

import xlrd
import shapefile
xls=xlrd.open_workbook("sites.xlsx")
sheet=xls.sheet_by_index(0)
#打開shp
w=shapefile.Writer(shapefile.POINT)
#shapefile文件要求”幾何數據”與”屬性數據”要有一一對應的關系,如果有”幾何數據”而沒有相應的屬性值存在,那么在使用ArcGIS軟件打開所創建的shapefile文件時會出錯。
#為了避免這種情況的發生,可以設置 sf.autoBalance = 1,以確保每創建一個”幾何數據”,該庫會自動創建一個屬性值(空的屬性值)來進行對應。
#autoBalance默認為0。
w.autoBalance = 1

#將數據從excel移動到shp
for i in range(sheet.ncols):#讀取第一行表頭信息 遍歷第一行表頭每一列
    w.field(str(sheet.cell(0,i).value),"C",40) #對每一列構造屬性字段 字符類型
for i in range(1, sheet.nrows):#從第二行開始遍歷每一行
    values=[]
    for j in range(sheet.ncols):
        values.append(sheet.cell(i,j).value)
    w.record(*values)
    #以最后兩列獲取經緯度信息
    w.point(float(values[-2]),float(values[-1]))
w.save("sites_.shp")

注意

在ArcGIS中打開屬性表或許會出現亂碼問題

 原因

1.Arcgis本身問題

2.Pyshp庫不支持中文內容

解決方案

方案1:最簡單的方法——分析是否還需要用到含有中文的字段,若后續不需要則可以刪去相應中文字段。再用print(type(...))查看數據類型,你可以把所有的非str類型轉換成str,不過更推薦根據數據類型設置你的字段屬性

代碼改為

import shapefile

def read_csv(fp):
    ret = []
    with open(fp, 'rb') as f:
        for line in f:
            ret.append(line.decode('utf-8').strip().split(","))
    return ret
     
data = read_csv("sites.csv")
w=shapefile.Writer(shapefile.POINT)

w.autoBalance = 1
w.field('id', 'N', 12)
w.field('lng', 'F', 10, 5)
w.field('lat', 'F', 10, 5)

for r in data[1:]:
    record = [
        int(r[0]),
        float(r[4]),
        float(r[5])]
    w.record(*record)
    w.point(float(r[-2]), float(r[-1]))
w.save("sites.shp")

方案2:(從根本解決)更改arcgis注冊表並根據版本安裝補丁+修改pyshp庫中的shapefile.py
STEP1:

修改arcgis注冊表並根據版本安裝補丁(目前esri僅提供10.2.1與10.2.2版本的補丁)
10.2.1與10.2.2版本:
教程:https://blog.csdn.net/kikitaMoon/article/details/19116415
10.3及以后:
  http://www.cnblogs.com/liweis/p/4629265.html
  https://blog.csdn.net/hailiannanhai/article/details/78099074

STEP2:

修改pyshp庫中的shapefile.py(由於pycharm可以很方便修改編碼格式,因此強烈建議用pycharm進行修改)
Pycharm安裝(Professional Edition)與使用教程:
https://blog.csdn.net/qsir/article/details/79362549
特別注意:在教程中的第11步:軟件激活方式中,在IntelliJ IDEA 注冊碼網站,我們可以用學校的郵箱注冊,即可免費獲取激活碼,使用專業版pycharm。不然只有30天試用期。不推薦用教程中的激活碼。

在Pycharm中,左上角點擊file-setting-file encodings按下圖修改,保證輸出是utf格式:

 

 在Pycharm中,用英文輸入修改pyshp中的shapefile.py(992-999行紅框中內容):

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM