Tải bản đầy đủ (.pdf) (11 trang)

Lập trình GIS Xây dựng công cụ nắn chỉnh bản đồ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (690.81 KB, 11 trang )

ĐẠI HỌC QUỐC GIA TP. HCM
TRƯỜNG ĐẠI HỌC BÁCH KHOA


XÂY DỰNG CƠNG CỤ NẮN CHỈNH
BẢN ĐỒ
(thơng qua ngơn ngữ lập trình Python kết hợp với ArcObjects)
Mơn: Lập trình GIS

Giảng viên

PGS.TS. Trần Trọng Đức

Học viên thực hiện

Huỳnh Thị Mai Đình

Mã số học viên

12103003

Tp.HCM, ngày 21 tháng 06 năm 2013


Mục lục

1. Đặt vấn đề ...................................................................................................................... 1
2. Giải quyết vấn đề ........................................................................................................... 2
2.1. Cơ sở lý thuyết ........................................................................................................ 2
2.2. Xây dựng cơng cụ tính chuyển tọa độ và nắn chỉnh bản đồ ................................... 3
2.3. Kiểm nghiệm kết quả thực hiện .............................................................................. 6


3. Kết luận .......................................................................................................................... 8


1. Đặt vấn đề
Với thế mạnh về khả năng lưu trữ, quản lý, truy xuất và phân tích khơng gian, công
nghệ GIS (Geography Information System) hiện nay đã được ứng dụng phổ biến trong
hầu hết các lĩnh vực. Tuy nhiên, để ứng dụng GIS, đòi hỏi tư liệu bản đồ được thành lập
và sử dụng trước đó phải được số hóa để có thể lưu trữ, quản lý, phân tích nhờ sự hỗ trợ
của các phần mềm chuyên dụng. Một trong những khó khăn trong việc ứng dụng cơng
nghệ này ở Việt Nam là việc không thống nhất giữa các tư liệu bản đồ. Vấn đề này xuất
phát từ hai nguyên nhân cơ bản sau đây:
 Lịch sử phát triển bản đồ Việt Nam trải qua nhiều giai đoạn thay đổi hệ tọa độ và
hệ quy chiếu trong quá trình thành lập bản đồ. Cho nên hiện nay tư liệu bản đồ có
sự khơng thống nhất về hệ tọa độ, đặc biệt là giữa hai HN – 72 và VN – 2000 (hệ
VN – 2000 là hệ tọa độ mới được áp dụng thống nhất để xây dựng các bản đồ hiện
nay).
 Do sự thành lập bản đồ không đồng bộ giữa các đơn vị, dẫn đến sự không trùng
khớp giữa các lớp bản đồ của cùng một khu vực.
Kết quả của hai nguyên nhân này là gây khó khăn trong quá trình hợp nhất các lớp
bản đồ, đặc biệt là ứng dụng để giải quyết các bài tốn khơng gian. Biểu hiện dễ nhận
thấy của tình trạng này là hai lớp bản đồ bị lệch nhau, do đó cần thực hiện nắn chỉnh bản
đồ về lớp bản đồ khác – mà được chọn làm bản đồ gốc.
Hai phép biến đổi được sử dụng phổ biến để tính chuyển giữa hai hệ tọa độ và nắn
chỉnh tọa độ trong bản đồ là Helmert và Affine. Trong phạm vi của bài tiểu luận này, tác
giả chọn phép Affine để áp dụng xây dựng công cụ thực hiện nắn chỉnh bản đồ thơng qua
ngơn ngữ lập trình Python được tích hợp và hỗ trợ trong phần mềm ArcGIS.

1



2. Giải quyết vấn đề
2.1.

Cơ sở lý thuyết

Phép biến đổi Affine (Affine Transforms) là phép biến đổi tuyến tính, khả nghịch.
Phép biến đổi này bảo tồn tính song song của các đường thẳng cũng như bảo tồn tính tỉ
lệ về khoảng cách của các đoạn thẳng. Tuy nhiên, hạn chế của phép biến đổi này khơng
bảo tồn góc nghiêng và chiều dài các đoạn thẳng, vì thế nó khơng đảm bảo tính đồng
dạng giữa hai hệ tọa độ.
Cơng thức phép biến đổi Affine có dạng như sau:
{

(1)

Trong đó: a,b,c,d,e,f là 6 tham số chuyển đổi tọa độ, để xác định được 6 tham số
này phải biết trước ít nhất 3 điểm song trùng giữa hai hệ tọa độ.
Khi n > 3 thì xác định theo phương pháp số bình phương nhỏ nhất. Hệ (1) được
viết lại dưới dạng ma trận như sau:

Trong đó:

;

[

]

;


[

]

[ ]

Hệ phương trình (1) được viết lại dưới dạng:

2


Và dưới điều kiện

, sau những phép biến đổi, vector nghiệm X được xác

định là:

Ở đây, ma trận trọng số P được xem như ma trận đơn vị I (xem trọng số bằng nhau
và bằng 1), nên X là:

Sau khi xác định được 6 tham số a1, a2, b1, b2, c1, c2, dựa vào biểu thức (1) để
chuyển đổi hàng loạt từ hệ 1 sang hệ 2.
Xây dựng công cụ tính chuyển tọa độ và nắn chỉnh bản đồ

2.2.

Dữ liệu GIS gồm có ba dạng: điểm (Point), đường (Polygon) và vùng (Polygon).
Trong bài tiểu luận này, công cụ nắn chỉnh bản đồ chỉ được thực hiện với dữ liệu dạng
điểm.
Công cụ này được xây dựng bằng ngơn ngữ lập trình Python kết hợp với

ArcObject, được tích hợp vào Arcgis sử dụng như một công cụ trong hộp ArcTool Box.
Đoạn mã viết cho công cụ này như sau:
import numpy as np
import arcpy
try:
arcpy.env.overwriteOutput=1
arcpy.env.workspace=arcpy.GetParameterAsText(0)
f=arcpy.GetParameterAsText(1) # Mo file toa do diem song trung giua hai toa do
td=open(f,'r')
lst=td.readlines()

3


le=len(lst)
le2=le*2
i=0
j=1
A=np.zeros((le2,6))
L=np.zeros((le2,1))
for row in lst:
row=row.split()
A[i,0]=row[2]
A[i,1]=row[3]
A[i,2]=1
A[i,3]=0
A[i,4]=0
A[i,5]=0
A[j,0]=0
A[j,1]=0

A[j,2]=0
A[j,3]=row[2]
A[j,4]=row[3]
A[j,5]=1
L[i,0]=float(row[0])
L[j,0]=float(row[1])
i=i+2

4


j=j+2
X=np.dot(np.linalg.inv(np.dot(np.transpose(A),A)),np.dot(np.transpose(A),L))

Feat_trans=arcpy.GetParameterAsText(2) # Mo lop can chuyen doi
desc = arcpy.Describe(Feat_trans)
typedesc=desc.shapeType
if typedesc=='Point': # Kiem tra kieu du lieu
ptar=arcpy.UpdateCursor(Feat_trans)
row=ptar.next()
while row:
geom=row.shape
point=geom.getPart()
point.X=(X[0,0]*point.X)+(X[1,0]*point.Y)+X[2,0]
point.Y=(X[3,0]*point.X)+(X[4,0]*point.Y)+X[5,0]
row.shape=point
ptar.updateRow(row)
row=ptar.next()
td.close()
del row

del ptar
arcpy.AddMessage('Cac tham so chuyen doi: '+'\n'+'a= '+str(X[0,0])+', '+'b=
'+str(X[1,0])+', '+'c= '+str(X[2,0])+'\n'+'d= '+str(X[3,0])+', '+'e= '+str(X[4,0])+'f= '+str(X[5,0]))
else:

5


arcpy.AddError('Chi thuc hien nan chinh voi du lieu dang diem')
except arcpy.ExecuteError:
arcpy.AddError(arcpy.GetMessage(0))
print arcpy.GetMessage(0)

2.3.

Kiểm nghiệm kết quả thực hiện

Để kiểm nghiệm kết quả sau khi xây dựng công cụ nắn chỉnh bản đồ, đề tài tạo ra
hai lớp dữ liệu dạng điểm: Point_Org.shp và Point_Trans.shp
Giả định rằng trong một tình huống rằng: đây là 2 lớp điểm của cùng một khu vực,
nhưng vì một lý đó (do khác hệ tọa độ hay sai lệch do nguồn gốc thành lập…) mà hai lớp
điểm này lệch nhau như hình dưới đây:

Lệch nhau giữa hai lớp bản đồ
Yêu cầu là thực hiện nắn chỉnh lớp Point_Trans.shp về lớp Point_Org.shp.
Như đã trình bày ở phần [2.1], để xác định được 6 tham số ẩn theo phương pháp
giải của phép biến đổi Affine cần có bộ dữ liệu điểm trùng với tối thiểu là 3 điểm song
trùng.

6



Tọa độ các điểm song trùng được tạo trong một tập tin với định dạng .txt , như sau:
33801354.69
28753272.63
39707044.53
47882685.89
40490291.02
33473063.34

22255766.81
10159100.2
-4763429.643
4999714.883
8672712.069
9411367.614

-12734245.18
-17782327.25
-6828555.339
1347086.012
-6045308.857
-13062536.54

8207283.834
-3889382.779
-18811912.62
-9048768.098
-5375770.911
-4637115.366


Với các hai cột ban đầu là tọa độ X và Y của lớp dữ liệu Point_Org.shp và hai cột
sau là tọa độ X và Y của lớp dữ liệu Point_Trans.shp.
Công cụ được tích hợp vào hộp ArcToolbox của ArcGIS như sau:

Dữ liệu được đưa vào để thực hiện nắn chỉnh

7


Kết quả thực hiện nắn chỉnh như sau:

Bảng thông báo sau khi thực hiện nắn

Kết quả nắn chỉnh

chỉnh thành cơng
Vì công cụ được thực hiện chỉ với dữ liệu dạng điểm nên chương trình sẽ báo lỗi
nếu đưa các kiểu dữ liệu khác vào (đường, vùng).

Dữ liệu dạng đường được đưa vào chương

Bảng thơng báo lỗi

trình
3. Kết luận
Nắn chỉnh dữ liệu bản đồ là một nhu cầu cần thiết khi tình trạng thành lập các tư
liệu bản đồ khơng thống nhất như hiện nay. Để đáp ứng nhu cầu này, đề tài đã tìm hiểu và
sử dụng phép biến đổi Affine để từ đó xây dựng cơng cụ hỗ trợ nắn chỉnh bản đồ. Công
cụ được thực hiện bằng ngôn ngữ lập trình Python kết hợp với ArcObject. Tuy nhiên,

cơng cụ này chỉ thực hiện được với dữ liệu dạng điểm. Để đáp ứng tốt hơn nhu cầu nắn

8


chình bản đồ trong thực tế, cần nghiên cứu chương trình mở rộng thêm với hai dạng cịn
lại là đường và vùng.

Tài liệu tham khảo
1. Trần Trọng Đức. Bài giảng mơn Lập trình GIS.
2. Vũ Thị Hà. Nghiên cứu một số bài tốn tính chuyển tọa độ trong trắc địa cơng
trình
3. />rcGIS_Help_Library/00r90000001n000000/

9



×