



摘 要:地名普查成果轉化包括地名志編纂,編纂地名志時需要對地名點的位置描述進行統一處理,村(居)委會與鄉鎮政府駐地的方向和距離、居民點與村(居)委會的方向和距離等是描述地名時最常用、最直觀的方法。本文分別運用Excel、Python和ArcGIS軟件處理地名普查成果數據,獲取地名點相對方向及距離,保證地名志書編纂時地名方位描述準確和統一。
關鍵詞:地名方位;16方向;地名志書編纂
中圖分類號:P 20 " 文獻標志碼:A
2018年6月,第二次全國地名普查結束,地名普查成果轉化成為國家和地方地名工作的重要內容,地名志是地名普查成果轉化不可缺少的重要成果。由于地名志是按照統一的編纂大綱進行的,有時也能暴露和發現地名普查中的缺點、錯誤、遺漏、不足,因此在編志過程中,也要進行調查研究,有的還需要進行考證。這些不僅可以彌補地名普查的不足,還可以提高普查成果的質量,促進地名普查工作的發展。針對《從江縣地名志》編纂過程中遇到鄉鎮、村(居)委會、居民點等普查詞條相對位置的描述不一致的情況,分別運用Excel、Python和ArcGIS軟件計算鄉級政府駐地與縣政府駐地、村(居)委會與鄉級政府駐地、居民點與村(居)委會的相對方向和距離等,保證地名普查成果數據中地名方位的統一和準確,同時,也保證了地名詞條描述的正確性。
1 地名方位描述的傳統
1.1 地名方位的含義
方位即方向位置,地名是地理實體命名后的稱謂。將一定區域內的地理事物縮小為一個點并展示在一定的載體上,如果展示的載體是平面的,并規定了東、南、西、北等基本方向,那么可以用方向和距離描述任意兩點的位置關系。地名方位是地名之間的相對方向和距離。
1.2 方向
根據研究,我國自東漢至清代的地理類志書中記載的方向和里程數據是用來繪制地圖的。以唐代李吉甫《元和郡縣圖志》為例,其中使用的方向達到16個,即四至:東、南、西北;四隅:東南、西南、東北、西北;正向偏微的8個方向:正東微北,正東微南、正南微東、正南微西,正西微南、正西微北,正北微西、正北微東。里程分為陸程、水程、水路兼程[1]。
1.3 距離
根據《“非科學”的中國傳統輿圖:中國傳統輿圖繪制研究》研究證明,唐代以來全國總志和地方志中記載的“四至八到”中的距離數據大都是道路距離。
2 地名志中地名位置描述
2.1 相對方向
在描述相對方向的方式中,有表示風向的16個方向,也有如1985年版《貴州省從江縣地名志》(以下簡稱“舊志”)所用的16方向,也有地方地名行政主管部門認定的16方向法。根據現行的地面氣象觀測規范,16風向是把圓周平均分為16份:北、北東北、東北、東東北、東、東東南、東南、南東南、南、南西南、西南、西西南、西、西西北、西北、北西北[2]。舊志所用方向為東、西、南、北及東南、西南、東北、西北,8個方向為15°。北偏東、東偏北、東偏南、南偏東、南偏西、西偏南、西偏北、北偏西8個方向為30°。也有地方地名管理部門提出的16方向,例如惠東縣地名行政主管部門,以東、西、南、北及東南、西南、東北、西北,8個方向為30°,北偏東、東偏北、東偏南、南偏東、南偏西、西偏南、西偏北、北偏西,8個方向為15°。
從上文可知,表示16個方向時沒有統一的規定。
2.2 地名點間的距離
可以根據路網資料求解最短的道路距離,也可以求解水平距離。因為地名普查成果中的點位,有些是沒有通車道路連通的,所以為了保證地名點間距離的一致性,需要選取水平距離來作為地名點之間的相對距離。
2.3 獲得方位的方法
根據點位坐標利用勾股定理可以計算點位間的距離,利用反正切函數,可以計算兩點連線和水平方向的夾角。
3 方位計算
根據點位坐標,可以使用Excel自帶的函數計算獲取點位之間的直線距離及角度值,也可以使用Pyhton程序讀取表格完成計算,并把結果添加到表格中,或者使用GIS軟件提供的工具處理數據。
3.1 基于Excel表格的方位計算
給定2個點P0、P1的投影平面直角坐標P0(X0,Y0)、P1(X1,Y1),運用勾股定理可以計算兩點間直線距離D,如公式(1)所示。
D=SQRT((X1-X0)2+(Y1-Y0)2) (1)
根據反正切函數計算兩點連線和水平方向的夾角,如公式(2)所示。
a=ATAN((Y1-Y0)/(X1-X0)) (2)
計算的角度為弧度,再用A=a×180/PI()即可計算夾角的度數,即當坐標原點移動到P0,夾角在第一象限和第三象限時,角度值都是從X軸逆時針方向,取值為0°~90°;夾角在第二象限和第四象限時,角度值是從X軸順時針方向,取值為0°~90°。根據給定的16方向的取值和所求夾角之間的關系,即可得到P0和P1間的方向關系。以舊志的16方向法為例,P0、P1兩點連線與水平方向夾角所在象限及角度范圍和對應方向之間的關系見表1。
根據表1的角度和16方向間的對應關系,在Excel表格中,使用IF函數的嵌套公式可以計算各象限夾角對應的方向,以第一象限為例,輸入:=IF(AND(Y1-Y0>0,X1-X0>0,A>82.5),”北”,IF(AND(Y1-Y0>0,X1-X0>0,A>52.5),”北偏東”,IF(AND(Y1-Y0>0,X1-X0>0,A>37.5),”東北”,IF(AND(Y1-Y0>0,X1-X0>0,A>7.5),”東偏北”,IF(AND(Y1-Y0>0,X1-X0>0,A>0),”東”,0)))))。即可計算夾角在第一象限時的方向,如果不在第一象限,那么會被0填充。
如果繼續使用IF函數多次嵌套,遍歷4個象限時的情況即可確定所有方向。
當實際錄入Excel表格時,以表2為例,如果P0點X0、Y0的坐標值分別在A2、B2單元格,P1點X1、Y1坐標值分別在C2、D2單元格,就在E2單元格錄入:=SQRT((D2-$B$2)^2+(C2-$A$2)^2),即可計算兩點間水平距離。在F2單元格錄入:=ATAN((D2-$B$2)/(C2-$A$2))*180/PI(),即可計算兩點連線與水平方向夾角,單位為°;在G2單元格錄入:=IF(AND(D2-$B$2>0,C2-$A$2>0,F2>82.5),”北”,IF(AND(D2-$B$2>0,C2-$A$2>0,F2>52.5),”北偏東”,IF(AND(D2-$B$2>0,C2-$A$2>0,F2>37.5),”東北”,IF(AND(D2-$B$2>0,C2-$A$2>0,F2>7.5),”東偏北”,IF(AND(D2-$B$2>0,C2-$A$2>0,F2>0),”東”,IF(AND(D2-$B$2<0,C2-$A$2<0,F2>82.5),”南”,IF(AND(D2-$B$2<0,C2-$A$2<0,F2>52.5),”南偏西”,IF(AND(D2-$B$2<0,C2-$A$2<0,F2>37.5),”西南”,IF(AND(D2-$B$2<0,C2-$A$2<0,F2>7.5),”西偏南”,IF(AND(D2-$B$2<0,C2-$A$2<0,F2>0),”西”,IF(AND(D2-$B$2>0,C2-$A$2<0,F2>-7.5),”西”,IF(AND(D2-$B$2>0,C2-$A$2<0,F2>-37.5),”西偏北”,IF(AND(D2-$B$2>0,C2-$A$2<0,F2>-52.5),”西北”,IF(AND(D2-$B$2>0,C2-$A$2<0,F2>-82.5),”北偏西”,IF(AND(D2-$B$2>0,C2-$A$2<0,F2>-90),”北”,IF(AND(D2-$B$2<0,C2-$A$2>0,F2>-7.5),”東”,IF(AND(D2-$B$2<0,C2-$A$2>0,F2>-37.5),”東偏南”,IF(AND(D2-$B$2<0,C2-$A$2>0,F2>-52.5),”東南”,IF(AND(D2-$B$2<0,C2-$A$2>0,F2>-82.5),”南偏東”,IF(AND(D2-$B$2<0,C2-$A$2>0,F2>-90),”東”,0)))))))))))))))))))),即可獲得P1點相對于P0點的距離和方向。如果C、D列是其他待求點的x、y坐標對,就依次復制E、F、G列第二行的公式即可。
3.2 基于Python的方位計算
Python是一種易于學習又功能強大的編程語言。它不僅能提供高效的高級數據結構,還能簡單有效地面向對象編程。其優雅的語法和動態類型以及解釋型語言的本質,使它成為多數平臺上寫腳本和快速開發應用的理想語言。
利用Python標準庫math、第三方庫openpyxl、以.xlsx格式保存的點坐標計算兩點間距離及連線與水平方向夾角,并存入表格。求解兩點間的距離比較簡單,但是求解兩點間連線和水平方向間夾角及對應的方向,需要做條件判斷,因此可以先確定象限,再確定方位。主要代碼如下。
#定義求距離函數
def dis(x0,y0,x1,y1):
x = x1 - x0
y = y1 - y0
return math.sqrt(x**2+y**2)
#定義求角度函數
def angle(x0,y0,x1,y1):
x = x1 - x0
y = y1 - y0
if x != 0:
A = math.atan(y/x)
return math.degrees(A)
else:
return 0
#定義角度轉換方向函數
def fx(dx,dy,a):
if dx>0 and dy> 0:
if 0<a<7.5:
return '東'
elif 7.5<a<37.5:
return '東偏北'
elif 37.5<a<52.5:
return '東北'
elif 52.5<a<82.5:
return '北偏東'
elif 82.5<a<90:
return '北'
elif dx<0 and dy>0:
……
3.3 基于ArcGIS的方位計算
計算地名方位,即計算地名點之間的相對方向和距離。在ArcGIS軟件ArcToolbox中,使用分析工具-鄰域分析-鄰近分析工具可以獲得輸入要素與鄰近要素之間的直線距離及鄰近角度,分別記錄在生成文件的NEAR_DIST、NEAR_ANGLE字段中。
以計算某個鄉(鎮)范圍內的村(居)委會與所在鄉(鎮)政府駐地的相對方向和距離為例。在保證都是相同投影平面直角坐標系下,輸入要素為村(居)委會點位數據,鄰近要素為鄉(鎮)政府駐地點位數據。通過鄰近分析,可以得到一個新文件,比原始村(居)委會點文件多2個字段,即NEAR_DIST、NEAR_ANGLE字段。前者為直線距離,后者為角度值,通過鄰近分析的幫助文件可知,在 Method 參數中使用 Planar 方法的過程中,當角度在-180°~180°時,0°為西,90°為南,180°(或-180°)為東,-90°為北。
根據舊志中16個方向與用ArcGIS鄰近分析工具得出的角度、方向關系,可知二者的對應關系。然后根據角度值計算對應的方向,可以利用數據ArcGIS中屬性表的字段計算器獲取。新建“FX”(方向的拼音首字母)字段,以下是選用Python解析程序時的腳本代碼。
def FX(JD):
if JD >= -7.5 and JD < 7.5:
return ‘西’
elif JD >= 7.5 and JD < 37.5:
return ‘西偏南’
……
如果使用的是其他規定的方向,就需要重新計算各個方向對應的取值,替換以上腳本中的對應項即可。
3.4 計算方法總結
利用以上3種方法都可以獲得地名方位數據。通過分析發現,當利用Python和ArcGIS軟件時,它們都用到了Python程序中的函數知識。當利用Python處理數據時,如果計算的中心點位較多,那么添加遍歷文件的代碼即可批量處理,效率較高。
在運用不同的計算方法處理同一批數據的過程中,通過查看結果是否一致,就可以核對計算方法是否有紕漏,可以起到檢查和校對的作用。
4 結論
當整理地名普查成果數據時,地名方位描述準確與統一是數據質量的基本要求,本文通過方法分析及實際操作,運用Excel軟件、Python和ArcGIS軟件這3種途徑獲得點位間的水平距離和相對方向,由此可以解決地名普查成果數據中地名描述方向和距離不一致的問題,保證數據的可靠性。
當描述相對位置時離不開方向描述,4個方向、8個方向劃分基本沒有分歧,但是使用16方向法精確描述方向時,不同行業的劃分方法并不統一,同樣的基層地名行政主管部門,對地名16方向的劃分也不一致,因此會導致同樣的方向會出現不同描述的情況。如果能對16方向的劃分保持一致,是最理想的情況,如果按照現狀,那么在整理編制地名數據的過程中,當遇到地名描述有16方向時,最好在元數據中把16方向的劃分方式交代清楚。如果是編纂地名圖錄典志,地名的方位描述有用到16方向法時,就需要把具體的劃分方法放在凡例或前言中,以免使用者根據自己的理解,判讀錯地名詞條中的方位描述。
參考文獻
[1]汪前進,現存最完整的一份唐代地理全圖數據集[J].自然科學史研究,1998,17(3):273-288.
[2]中國氣象局.地面氣象觀測規范 風向和風速:GB/T 35227—2017[S].北京:中國標準出版社,2017:2-3.