---
tag: blog, coding
---
# 試作地藉地號轉換
之前執行計畫時需輸出土地背景大圖,因此需要申請地藉資料後,再於以GIS輸出大圖。然而原始地藉地號都是以8個數字表現,例如01230001,但是輸出大圖時卻需要以123-1呈現,因此需要進行轉換。當時是直接以EXCEL轉換,轉存csv檔後載入GIS處理,最近無聊嘗試玩玩Python及R,似乎也蠻方便的。僅將操作方法略載如下,因為才剛玩程式,不甚漂亮,有機會再來優化。有需要的人儘管拿去玩。
## EXCEL
假若地藉資料文字檔xxxx.TXT,先打開EXCEL,以資料匯入的方法,從文字檔彙入xxxx.TXT。需注意的是:
- 若亂碼,則將字碼調成Big5或Unicode-8
- 欄位屬性不要讓EXCEL自動偵測,因為地號欄位需要文字屬性,才能維持8個數字型態
若地號欄位位於B,轉換後的欄位位於P,則公式如下:
>M2 = LEFT(B2, 4)
>N2 = RIGHT(B2, 4)
>O2 = M2 & "-" & N2
>P2 = If(N2=0, M2, O2)
## Python
或許有玩GIS的會有興趣玩Python,需配合pandas套件執行,讀取txt檔,轉換後直接存成csv檔,便於載入GIS。程式碼如下:
import pandas as pd
df = pd.read_table("xxxx.TXT", sep=",", header=0, dtype=str)
#df.head()
lword = df["地號"].str[:4].astype(int)
rword = df["地號"].str[5:].astype(int)
df["newro"] = pd.Series()
for i in range(0,len(df)):
if rword[i] == 0:
df["newro"][i] = str(lword[i])
else:
lword[i] = str(lword[i])
rword[i] = str(rword[i])
df["newro"][i] = lword[i] + "-" + rword[i]
#df.head()
df.to_csv('export.csv', index=False, encoding="utf-8-sig")
#ndf = pd.read_csv("export.csv", dtype=str)
#ndf.head()
## R
有統計需求,順便玩一下R,似乎更方便,直接讀txt檔,轉出txt檔,若需改欄字就以EXCEL載入,方法如前;也可直接載入GIS。程式碼如下:
data <- read.table("xxxx.TXT", header=TRUE, sep=",", fileEncoding="UTF-8-BOM", colClasses="character")
#head(data)
lword <- as.numeric(substr(data$地號, 1, 4))
rword <- as.numeric(substr(data$地號, 5, 8))
for(i in c(1:nrow(data))){
if(rword[i] == 0){
data$"newnum"[i] <- as.character(lword[i])
}else{
lword[i] <- as.character(lword[i])
rword[i] <- as.character(rword[i])
data$"newnum"[i] <- paste(lword[i], rword[i], sep="-")
}
}
#head(data)
write.table(data, file="export.txt", sep=",", row.names=FALSE)