a. Các toán tử, các hàm và từ khoá trong biểu thức trong MapInfo
Trong MapInfo với các hàm và các phép toán chúng ta có thể xác lập các biểu thức tính toán tự động trên từng đối tượng (các hàng trong bảng), có nghĩa ta có thể bổ sung tự động các số liệu trên MapInfo.
Biểu thức trong MapInfo bao gồm tên vùng của lớp dữ liệu được mở, trong đó obj là một tên vùng đặc biệt chỉ đến đối tượng địa lý của các hàng trong bảng dữ liệu - các toán tử và các hàm.
* Các toán tử:
- Các Toán tử So sánh: = bằng, <> khác, > lớn hơn, < nhỏ hơn, >= lớn hơn hay bằng,
=< nhỏ hơn hay bằng, _ tương tự (tượng trưng cho một ký tự bất kỳ), %tương tự (tượng trưng cho nhiều ký tự bất kỳ)
- Các ký hiệu ý nghĩa: + cộng, - trừ, (- ) âm, * nhân, / chia, ^ luỹ thừa, () dấu ngoặc.
- Các toán tử toán tử luân lý: “and” (và), “or” (hoặc) và “not” (không). Trong đó: + and được coi là đúng (“true”) khi (và chỉ khi) tất cả tham số của nó (tức là các biểu thức mà nó nối lại) đều đúng. Một bản ghi phải thoả mãn tất cả các điều kiện trong biểu thức thì mới được chọn.
+ or được coi là đúng khi một, vài hay tất cả các tham số (tức là các biểu thức mà từ khoá này liên kết) đúng. Một bản ghi thoả mãn một trong những điều kiện của biểu thức thì sẽ được chọn. Nó cũng được chọn khi hai hay tất cả điều kiện đều được thoả mãn.
+ not là đúng khi tham số của nó (biểu thức mà nó được sử dụng trong đó) là sai (“false’). Một bản ghi sẽ được chọn khi nó không thoả mãn điều kiện đưa ra.
- Các toán tử địa lý. Chúng được sử dụng để chọn các đối tượng dựa trên mối quan hệ không gian đối với (các) đối tượng khác. MapInfo có một từ khoá đặc biệt để sử dụng trong các toán tử địa lý là “obj” hay “object” (đối tượng). Từ khoá này (được coi như một tên trường) cho MapInfo biết rằng nó phải chọn giá trị dựa trên các đối tượng đồ hoạ trong bản đồ chứ không dựa vào bảng dữ liệu. Các toán tử địa lý được đặt nằm giữa các đối tượng đang được xem xét. Dưới đây là những toán tử địa lý:
+ Contains (Chứa): Đối tượng A chứa đối tượng B nếu trọng tâm của đối tượng B nằm trong ranh giới của đối tượng A.
+ Contains Entire (Chứa hoàn toàn): Đối tượng A chứa hoàn toàn đối tượng B nếu ranh giới của B nằm hoàn toàn trong ranh giới của A.
+ Within (Nằm trong): Đối tượng A nằm trong đối tượng B nếu trọng tâm của nó nằm trong ranh giới của B.
+ Entirely Within (Hoàn toàn nằm trong): Đối tượng A hoàn toàn nằm trong đối tượng B nếu ranh giới của nó hoàn toàn nằm trong đối tượng B.
+ Intersects (Giao, Cắt): Đối tượng A giao (cắt) đối tượng B nếu chúng có ít nhất một điểm chung.
* Các hàm của MapInfo:
- Các Hàm Toán học.Trong MapInfo có những hàm toán học sau: + Abs(num): Trả về giá trị tuyệt đối của một số.
+ Int(num): Trả về phần số nguyên của một số num. + Maximum(num1, num2): Trả về số lớn hơn trong hai số. + Minimum(num1, num2): Trả về số nhỏ hơn trong hai số.
+ Round(num1, num2): Trả về giá trị được làm tròn của số num1, đến giá trị gần nhất với số num2 (ví dụ như nếu num2 là 10 thì num1 được làm tròn đến giá trị gần với 10 nhất).
+ Sin(num): Trả về sin của một số; num tính bằng radian.
+ Tan(num): Trả về tang của một số; num được tính bằng radian.
- Các Hàm tổng hợp số liệu(Aggregate Functions)
+ Count(*): Đếm số lượng bản ghi (hàng) trong một nhóm. Hàm này lấy dấu hoa thị (*) làm đối số vì nó áp dụng cho bản ghi một cách tổng quát và không áp dụng cho một trường đặc biệt nào của bản ghi.
+ Sum(<expression>): Tính tổng của các giá trị trong biểu thức <expression> cho tất cả các bản ghi trong một nhóm (trường).
+ Avg(<expression>): Tính giá trị trung bình của các giá trị trong biểu thức <expression> trong tất cả các bản ghi của một nhóm.
+ Max(<expression>): Tìm giá trị lớn nhất trong <expression> trong tất cả các bản ghi của một nhóm.
+ Min(<expression>): Tìm giá trị thấp nhất trong <expression> trong tất cả các bản ghi trong một nhóm.
- Các Hàm có kết quả là đối tượng địa lý
+ Buffer(obj, num_res, num_width, str): Trả về một vùng đệm. Thông số num_res chỉ định độ phân giải, tính theo số nốt trên một vòng tròn; num_width là bán kính của vùng đệm;
str là tên của đơn vị tính khoảng cách sử dụng trong num_width.
+ Centroid(obj): Trả về một điểm có toạ độ tại trọng tâm của đối tượng obj (nếu đối tượng là vùng, kết quả là trung điểm nếu là đường).
+ CreateCircle(num_x, num_y, num_radius): Trả về một đường tròn; num_x, num_y
tương ứng là kinh độ và vĩ độ của tâm đường tròn, num_radius là bán kính đường tròn tính theo dặm.
+ CreateLine(num_x, num_y, num_x2, num_y2): Trả về một đường thẳng với toạ độ điểm đầu và điểm cuối tương ứng là (num_x, num_y) và (num_x2, num_y2).
+ CreatePoint(num_x, num_y): Trả về một điểm có toạ độ là (num_x, num_y).
Mỗi hàm số trên trả về một đối tượng đồ hoạ. Nếu gõ lệnh Update trong cửa sổ MapBasic thì ta có thể sử dụng những hàm số này để tạo ra các đối tượng cho mỗi hàng trong bảng.
- Các Hàm số trả về kết quả các tính toán địa lý
+ Area(obj, str): Trả về diện tích của đối tượng. Thông số str chỉ định tên đơn vị tính diện tích, ví dụ “sq mi” (dặm vuông) hay “sq km” (km2).
+ CentroidX(obj): Trả về kinh độ X của trọng tâm của một đối tượng vùng (trung điểm đối với đường) .
+ CentroidY(obj): Trả về vĩ độ Y của trọng tâm của một đối tượng vùng (trung điểm đối với đường).
+ Distance(num_x, num_y, num_x2, num_y2, str): Trả về khoảng cách giữa hai vị trí. Hai thông số đầu tiên xác định toạ độ của điểm đầu; hai thông số tiếp theo xác định toạ độ điểm cuối; str là đơn vị đo khoảng cách, ví dụ như “mi” hay “km”.
+ ObjectLen(obj, str): Trả về chiều dài của đối tượng. Giá trị str là đơn vị khoảng cách ví dụ như “mi” hay “km”. Chỉ có các đối tượng là đường thẳng, đường (gấp khúc) và cung là có chiều dài khác không.
+ Perimeter(obj, str): Trả về chu vi của đối tượng. Giá trị str là đơn vị đo khoảng cách. Chỉ có các đối tượng kiểu vùng, ellipse và hình chữ nhật là có chu vi khác không.
- Các hàm ngày tháng
+ CurDate( ): Trả về ngày tháng năm hiện hành.
+ Day(date): Trả về phần ngày trong tháng (1 - 31) của ngày. + Month(date): Trả về phần tháng (1 - 12) của ngày.
+ Weekday(date): Trả về phần ngày trong tuần (1 - 7) của ngày, 1 = Chủ Nhật. + Year(date): Trả về phần năm của ngày.
- Các hàm về chuỗi ký tự
+ Chr$(num): Trả về một ký tự tương ứng với mã ký tự là num (ví dụ chr$(65) sẽ trả về chuỗi “A”).
+ DeformatNumber$(str): Đảo ngược tác động của hàm FormatNumber$, trả về một chuỗi không có các dấu phân cách hàng ngàn.
- Format$(num, str): Trả về một chuỗi biểu thị một số được định dạng. Ví dụ
Format$(12345.678,”$,#.##”) trả về giá trị “$12,345.68”.
+ FormatNumber$(num): Trả về một chuỗi biểu thị một con số được định dạng. Hàm số này đơn giản hơn hàm Format$, nhưng cho ta ít quyền kiểm soát trong việc định dạng hơn (ví dụ như số định dạng luôn có dấu phân cách hàng ngàn).
+ InStr(num, str1, str2): Tìm kiếm chuỗi str2 bắt đầu từ vị trí ký tự thứ num, và tìm sự hiện diện của phần đó trong chuỗi str1. Hàm này trả về vị trí khi tìm thấy kết quả trong str1, hoặc trả về 0 nếu không tìm thấy. Để yêu cầu MapInfo tìm kiếm chuỗi từ đầu, nạp giá trị num
là một (1).
+ LCase$(str): Trả về định dạng chữ viết thường của chuỗi str. + Left$(str, num): Trả về num số ký tự đầu tiên của chuỗi str. + Len(str): Trả về số ký tự trong chuỗi str.
+ LTrim$(str): Cắt bỏ bất kỳ khoảng trắng nào ở đầu chuỗi str và trả về kết quả.
+ Mid$(str, num1, num2 ): Trả về một phần của chuỗi str bắt đầu từ ký tự thứ num1 và dài num2 số ký tự.
+ Proper$(str): Trả về một chuỗi với cách viết hoa đúng kiểu (chữ đầu tiên viết hoa). + Right$(str, num): trả về num số ký tự cuối cùng của chuỗi str.
+ RTrim$(str): Cắt bỏ khoảng trắng nào ở phần cuối của chuỗi str và trả về kết quả. + Str$(expr): trả về một chuỗi tương ứng với giá trị của biểu thức expr.
+ UCase$(str): Trả về dạng chữ viết hoa (toàn bộ) của chuỗi str.
+ Val(str): Trả về giá trị số của một chuỗi; ví dụ Val(“18”) trả về số 18.
MapInfo cho phép sử dụng các từ khoá sau:“any” (bất kỳ), “all” (tất cả), “in” (trong) và “between” (trong khoảng). Những từ khoá này phải được gõ vào biểu thức (không có sẵn). Ví dụ: - field_x = any (“TP.HCM”, “ĐN”, “KG”)
- field_x in (“TP.HCM”, “ĐN”, “KG”)
=> tất cả các đối tượng mà cột field_x có giá trị là “TPHCM” hay “ĐN” hay ”Kg” Trước khi thực hiện các bước tính toán tự động ta cần phải điều chỉnh các thiết lập của MapInfo (đơn vị).
- Đơn vị tính diện tích: mi (miles), in (inches), ft (feet), yd (yard), km, m, cm, mm... - Đơn vị tính diện tích: sq mi (square miles), sq in (square inches), sq km (km2), sq m (m2), sq cm (cm2), sq mm (mm2), hectare...
b. Cập nhật các số liệu (Update Column)
Chúng ta có thể cập nhật hay bổ sung từng cột dữ liệu một
- Vào Table> Update Coulmn, cửa sổ Update Column xuất hiện với các mục sau: - Table to Update: Chọn lớp dữ liệu muốn cập nhật trong số các lớp dữ liệu đã mở - Get Value from Table: Lấy giá trị từ lớp dữ liệu nào. Có 2 trường hợp:
* Từ lớp dữ liệu muốn cập nhật:
- Column to Update: Chọn trường DL muốn cập nhật
- Value: Nhập một biểu thức hợp lệ. Thường sử dụng khung Assist để xây dựng biểu thức. Ví dụ như tính diện tích, chiều dài, tính giá trị toạ độ...
* Từ một lớp dữ liệu khác:
- Click khung Joint để xác định trường (field) tham chiếu liên kết giữa 2 lớp dữ liệu.
- Column to Update: Một trường có sẵn hay một trường DL mới (Add New Temporary Column)
- Calculate: Cách tính toán có thể là: Value hay các biểu thức tổng hợp như: Average, Count, Minimum, Sum, Weighted Average (trung bình gia trọng), Proportion Sum (tổng số theo tỷ lệ), Proportion Average (trung bình theo tỷ lệ) và Proportion WeightedAverage (trung bình gia trọng theo tỷ lệ).
Lưu ý: Các biểu thức Average, Count, Minimum, Sum, Weighted Average có tham số là các giá trị của dữ liệu, các biểu thức tỷ lệ Proportion thì xử lý các đối tượng địa lý.
- of: thường là một cột hay một biểu thức hợp lệ - Sau cùng click OK để tiến hành cập nhật
c. Các ví dụ
* Tính toán toạ độ của các điểm
Toạ độ của một điểm được xác định bằng hai giá trị: kinh độ và vĩ độ, ta tạo thêm hai trường mới cho lớp muốn nạp toạ độ.
- Chọn Table > Maintenance > Table Structure. Hộp thoại Modify Table Structure mở ra. - Chọn Add Field tạo thêm 2 trường mới là kinh_do và vi_do, kiểu là Float.
- Chọn OK.
Lần lượt nạp toạ độ cho cột kinh_do và vi_do như sau:
- Chọn tên lớp cần nạp điểm trong ô Table to Update; trong ô Column to Update ta chọn kinh_do.
- Nhấn chuột chọn nút Assist, hộp thoại Expression mở ra.
- Nhấn chuột vào nút thả xuống ở ô Functions (hàm số) và chọn hàm CentroidX; xong chọn OK.
- Quay trở lại hộp thoại Update Column, ta thấy biểu thức trong ô Value là “CentroidX(obj)”
- Tắt chọn trong ô Browse Results đi rồi chọn OK. Trong trường kinh_do tất cả các hàng đều được nạp kinh độ vào. Toạ độ ở đây được tính bằng độ thập phân
Đối với cột vi_do cách làm tương tự và hàm số sử dụng là CentroidY.
* Tính toán chiều dài của các đường
Để tính chiều dài của các đối tượng đường (con sông hay đường giao thông) trước hết ta cũng phải tạo một trường để chứa chiều dài với các thông số Name: chieu_dai, Type: Float. Tiến hành nạp chiều dài vào trường mới này như sau:
- Chọn Table > Update Column. Hộp thoại Update Column mở ra.
- Trong Table to Update chọn lớp cần tính; trong Column to Update chọn trường
chieu_dai.
- Nhấn chuột chọn nút Assist để mở hộp thoại Expressionra.
- Ở ô Functions, trong danh sách thả xuống chọn hàm ObjectLen, dòng biểu thức hiển thị trong ô Expression là ObjectLen(obj, ”mi”). Sửa đơn vị đo lường mặc định trong ngoặc kép mi (dặm) thành km (kilômét) và chọn OK. Biểu thức hiển thị trong ô Value sẽ là
ObjectLen(obj,“km”).
- Tắt chọn trong ô Browse Results đi rồi chọn OK.
* Tính toán chu vi và diện tích, mật độ cho các vùng
Để tính chu vi và diện tích cho các vùng lãnh thổ ta sẽ thực hiện nạp các dữ liệu này như sau:
- Tạo hai trường mới là chu_vi và dien_tich cho lớp vùng cần nạp dữ liệu, kiểu đều là Float. Cập nhật cột chu_vi như sau:
- Chọn Table > Update Column.
- Trong Table to Update chọn lớp cần nạp (ví dụ: cac_tinh), trong Column to Update
chọn chu_vi.
- Nhấn nút Assist. Hộp thoại Expression mở ra.
- Trong mục Functions, từ danh sách thả xuống của ô này chọn Perimeter (chu vi). - Trong hộp Type an Expression, sửa chữ “mi” trong ngoặc kép thành “km” để đổi đơn vị tính chiều dài. Xong chọn OK.
Hình 5.12. Hộp thoại Update Column và Hộp thoại Expression trong lệnh
- Trong hộp thoại Update Column, tắt chọn trong ô Browse Results rồi chọn OK. Chu vi của các tỉnh được nạp xong, tính bằng kilômét.
Ta cập nhật cột dien_tich bằng cách làm hoàn toàn tương tự nhưng sử dụng hàm số
Area(obj, “sq mi”) và sửa chữ “sq mi” (dặm vuông) thành “hectare” (hécta); hoặc nếu muốn tính là km2thì ta sửa thành “sq km”
Lưu ý: Khi nạp thông tin địa lý của các đối tượng theo phương pháp như trên, MapInfo tính toán các giá trị dựa vào đối tượng đồ hoạ đã được vẽ trên bản đồ. Nếu sau này ta chỉnh sửa bản đồ thì những thông tin đó sẽ bị thay đổi. Ta phải chạy lại lệnh Update Column và chép đè dữ liệu cập nhật mới lên những dữ liệu cũ.
Để tính mật độ dân số cho bảng cac_tinh, thì trước tiên cần phải có 2 trường diện tích (dien_tich) và trường dân số (dan_so). Hoặc nếu ta chưa có trường diện tích thì ta có thể tíhn toán ngay trong biểu thức tính mật độ. Để chứa giá trị mật độ dân số, ta cần tạo ra một trường mới có tên là mat_do (mật độ), định dạng kiểu trường trong ô Type là Float. Cập nhật trường
mat_do bằng cách:
- Chọn Table >Update Column. Hộp thoại Update Column mở ra.
- Trong ô Table to Update chọn bảng cần tính (ví dụ: cac_tinh), trong ô Column to Update chọn cột mat_do.
- Trong ô Get Value from Table giữ nguyên là bảng cac_tinh. - Nhắp chuột vào nút Assist để mở hộp thoại Expression ra.
- Trong ô Expression ta gõ vào biểu thức sau: Format$(Dan_so_TB / Area(obj, "sq km"),"#"). Sử dụng hàm Format$(con số, “định dạng con số”) để làm tròn giá trị mật độ. Con số ở đây là công thức tính mật độ, còn chữ số trong MapInfo quy định là #, ta không muốn lấy số lẻ nào, do đó phần “định dạng con số” ở đây là #
- Làm xong nhấn OK để quay lại hộp thoại Update Column. Biểu thức được nạp vào ô
Value.
- Nhấn OK để kết thúc lệnh cập nhật.
Bài tập ứng dụng
Bài tập 7. Cập nhật các thông tin thuộc tính cho các đối tượng
Sử dụng kết quả bài tập số 5, thực hiện các lệnh sau:
- Tiến hành tính toán diện tích, chu vi, mật độ dân số, tỉ lệ nam/nữ, tỷ lệ dân số thành thị/nông thôn cho lớp thông tin hành chính vùng.
- Cập nhật thông tin loại đường, chiều dài đường cho lớp thông tin giao thông.
- Tính toán toạ độ các điểm UBND (giá trị độ phút giây và giá trị km- sử dụng tool CoordinateExtractor để chuyển đổi giữa các đơn vị toạ độ).
Cho bản đồ hiện trạng sử dụng đất năm 2005 của huyện Phú Vang, bao gồm 3 trường dữ liệu thuộc tính: ID, MDSDD07. Cập nhật thông tin thuộc tính hiện trạng sử dụng đất và tính toán diện tích cho các khoanh vi hiện trạng sử dụng đất.
CHƯƠNG 5. CHUYỂN ĐỐI DỮ LIỆU VÀ LƯỚI CHIẾU TRONG MAPINFO 5.1. CHUYỂN ĐỔI DỮ LIỆU
Để chuyển đổi các file bản đồ ở các định dạng phần mềm khác nhau, ta có thể sử dụng một chức năng trong phần Mapbasic của MapInfo để chuyển, đó là Universal Translator. Vào Tool/Universal Translator/Universal Translator… Xuất hiện hộp thoại Universal Translator.
- Ở phần Source: thiết lập các thông số cho nguồn dữ liệu đầu vào: Format: định dạng