Hướng dẫn viết tool trong arcgis bằng script python – Bài 3

vào lúc 03:07 ,
Hôm nay gisgpsrs sẽ giới thiệu đến các bạn một tool hữu ích nữa đó là chuyển đổi font trường dữ liệu. Đối với những người xây dựng cơ sở dữ liệu thông tin địa lý trên arcgis chắc hẳn sẽ gặp phải vấn đề font các trường dữ liệu ở dạng Unicode hay TCNV3. Khi bạn xây dựng dữ liệu từ các nguồn từ định dạng Mapinfo hoặc Microstation những font này là ở TCVN3 bạn muốn chuyển sang định font Unicode thì tool này sẽ làm việc đó. Hoặc khi dữ liệu bạn đang ở dạng Geodatabase bạn muốn chuyển sang dạng shp(shapfile) để không bị lỗi font, thì định dạng font ở Geodatabase phải là TCVN3 khi chuyển sang shp mới không bị lỗi font.

- Bài này gisgpsrs sẽ giới thiệu viết tool cụ thể là chuyển đổi font từ Unicode sang TCVN3 và ngược lại.


- Bước 1: Tạo 2 tool “Z_Chuyển đổi Font -> (Chuyển đổi TCVN3 -> Unicode)” . Và “Z_Chuyển đổi Font -> (Chuyển đổi Unicode -> TCVN3)”. Các bạn có thể gộp 2 tool này vào làm một bằng cách thêm biến chọn loại chuyển đổi có 2 giá trị (TCVN3 -> Unicode, Unicode -> TCVN3), trong code mình sẽ chạy biến kiểm tra xem người dùng chọn loại chuyển đổi nào. Ở đây mình tách ra làm 2 tool, 2 mã Script để các bạn tiện tiếp thu. Nếu bạn chưa biết tạo tool như thế nào thì hãy đọc bài 1


- Bước 2: Tạo các biến đầu vào Parameters cho 2 tool trên là như nhau chỉ khác phần đường dẫn script cho mỗi tool là khác nhau (Chuyển đổi TCVN3 -> Unicode: Scripts.py, Chuyển đổi Unicode -> TCVN3: Scripts_Unicode_TCVN3.py) gồm:
* Chuyển đổi TCVN3 -> Unicode
+ Chọn dữ liệu cần chuyển (Layer đầu vào)

+ Chọn trường dữ liệu cần chuyển font

+ Chọn nơi lưu kết quả (nơi lưu layer kết quả)

*Chuyển đổi Unicode -> TCVN3: Tương tự như trên


- Bước 3: Viết code vào file Scripts.py cho tool Chuyển đổi TCVN3 -> Unicode để xử lý, các bạn copy code dưới vào file script

# -*- coding: utf-8 -*-
# Author: Nguyễn Viết Quân
# Web: gisgpsrs.blogspot.com
# Email : vietquan2407@gmail.com
# Nguồn: Tham khảo
import arcgisscripting
gp = arcgisscripting.create(9.3)
def Convert(str,s,d):
    global _Unicode, _TCVN3, _KhongDau
    result = u''
    for c in str:
        idx = s.find(c)
        if idx >= 0:
            c = d[idx]
        result += c
    return result
# Array of characters (Using Tuple instead of List)
_Unicode = (
    #'Ã?Ã?ăÄ?Ä?Ä?êÊÃ?Ã?Æ?Æ?Æ?Æ?'
    u'âÂăĂđĐêÊôÔơƠưƯ'
    #u'\xe2\xc2\u0103\u0102\u0111\u0110\xea\xca\xf4\xd4\u01a1\u01a0\u01b0\u01af'
    #'Ã?Ã?Ã?Ã?áº?áº?Ã?Ãáº?áº?áº?áº?áº?áº?áº?áº?áº?Ẫáº?áº?áº?áº?áº?áº?áº?áº?ẵáº?áº?áº?'
    u'áÁàÀảẢãÃạẠấẤầẦẩẨẫẪậẬắẮằẰẳẲẵẴặẶ'
    #u'\xe1\xc1\xe0\xc0\u1ea3\u1ea2\xe3\xc3\u1ea1\u1ea0\u1ea5\u1ea4\u1ea7\u1ea6\u1ea9\u1ea8\u1eab\u1eaa\u1ead\u1eac\u1eaf\u1eae\u1eb1\u1eb0\u1eb3\u1eb2\u1eb5\u1eb4\u1eb7\u1eb6'
    #'Ã?Ã?Ã?Ã?áº?Ẻáº?áº?áº?áº?áº?áº?á??á??á?ƒá??á??á??á??á??Ã?Ã?Ã?ÃŒá??á??Ä?Ä?á??á?Š'
    u'éÉèÈẻẺẽẼẹẸếẾềỀểỂễỄệỆíÍìÌỉỈĩĨịỊ'
    #u'\xe9\xc9\xe8\xc8\u1ebb\u1eba\u1ebd\u1ebc\u1eb9\u1eb8\u1ebf\u1ebe\u1ec1\u1ec0\u1ec3\u1ec2\u1ec5\u1ec4\u1ec7\u1ec6\xed\xcd\xec\xcc\u1ec9\u1ec8\u0129\u0128\u1ecb\u1eca'
    #'Ã?Ã?Ã?Ã?á??á?ŽÃµÃ?á??á?Œá??á??á??á??á??á??á??á??á??á??á??á?šá??á?œá?Ÿá?žá??á??á??á??'
    u'óÓòÒỏỎõÕọỌốỐồỒổỔỗỖộỘớỚờỜởỞỡỠợỢ'
    #u'\xf3\xd3\xf2\xd2\u1ecf\u1ece\xf5\xd5\u1ecd\u1ecc\u1ed1\u1ed0\u1ed3\u1ed2\u1ed5\u1ed4\u1ed7\u1ed6\u1ed9\u1ed8\u1edb\u1eda\u1edd\u1edc\u1edf\u1ede\u1ee1\u1ee0\u1ee3\u1ee2'
    #'úÚÃ?Ã?á??á??Å?Å?á??á??á??á??á??á?ªá??á??á??á??á??á??á??á??á??á??á??á??á?µá??Ã?Ã?'
    u'úÚùÙủỦũŨụỤứỨừỪửỬữỮựỰỳỲỷỶỹỸỵỴýÝ'
    #u'\xfa\xda\xf9\xd9\u1ee7\u1ee6\u0169\u0168\u1ee5\u1ee4\u1ee9\u1ee8\u1eeb\u1eea\u1eed\u1eec\u1eef\u1eee\u1ef1\u1ef0\u1ef3\u1ef2\u1ef7\u1ef6\u1ef9\u1ef8\u1ef5\u1ef4\xfd\xdd'
)
_KhongDau = (
    u'aAaAdDeEoOoOuU'
    u'aAaAaAaAaAaAaAaAaAaAaAaAaAaAaA'
    u'eEeEeEeEeEeEeEeEeEeEiIiIiIiIiI'
    u'oOoOoOoOoOoOoOoOoOoOoOoOoOoOoO'
    u'uUuUuUuUuUuUuUuUuUuUyYyYyYyYyY'
)
_TCVN3= (
  #'Â?Â?Â?Â?Â?Â?ªÂ?Â?Â?Â?Â?Â?Â?'
    u'©¢¨¡®§ª£«¤¬¥­¦'
    #'\xa9\xa2\xa8\xa1\xae\xa7\xaa\xa3\xab\xa4\xac\xa5\xad\xa6'
    #'Â?Â?µµÂ?Â?Â?Â?Â?Â?ÊÊÃ?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Â?Â?Â?Â?Â?Â?Â?Â?Ã?Ã?'
    u'¸¸µµ¶¶••¹¹ÊÊÇÇÈÈÉÉË˾¾»»¼¼½½ÆÆ'
    #'\xb8\xb8\xb5\xb5\xb6\xb6\xb7\xb7\xb9\xb9\xca\xca\xc7\xc7\xc8\xc8\xc9\xc9\xcb\xcb\xbe\xbe\xbb\xbb\xbc\xbc\xbd\xbd\xc6\xc6'
    #'Ã?Ã?ÌÌÎÎÃ?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?ÜÜÞÞ'
    u'ÐÐÌÌÎÎÏÏÑÑÕÕÒÒÓÓÔÔÖÖÝÝ××ØØÜÜÞÞ'
    #u'\xcf\xcf\xd1\xd1\xd5\xd5\xd2\xd2\xd3\xd3\xd4\xd4\xd6\xd6\xdd\xdd\xd7\xd7\xd8\xd8\xdc\xdc\xde\xde'
    #'Ã?Ã?ßßÃ?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?êêÃ?Ã?Ã?Ã?Ã?Ã?'
    u'ããßßááââääèèååææççééííêêëëììîî'
    #'\xe2\xe2\xe4\xe4\xe8\xe8\xe5\xe5\xe6\xe6\xe7\xe7\xe9\xe9\xed\xed\xea\xea\xeb\xeb\xec\xec\xee\xee'
    #'Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?õõÃ?Ã?Ã?Ã?Ã?Ã?úúÃ?Ã?Ã?Ã?Ã?Ã?Ã?Ã?'
    u'óóïïññòòôôøøõõöö÷÷ùùúúûûüüþþýý'
    #'\xf3\xf3\xef\xef\xf1\xf1\xf2\xf2\xf4\xf4\xf8\xf8\xf5\xf5\xf6\xf6\xf7\xf7\xf9\xf9\xfa\xfa\xfb\xfb\xfc\xfc\xfe\xfe\xfd\xfd'
)

def ConvertEncoding(input_fc,input_fd,newfd,sE,dE):

    global gp
    rows = gp.updatecursor(input_fc)
    result = gp.GetCount_management(input_fc)
    count = int(result.GetOutput(0))
    gp.SetProgressor("step", "Reading", 0, count, 1)
    for row in iter(rows.next, None):
        if(row.GetValue(input_fd)!=None):#Nếu dữ liệu khác Null thì mới gán không là lỗi
            string1 = row.GetValue(input_fd)
            if  string1.strip() <> "":
                newvalue =  Convert(row.GetValue(input_fd),sE,dE)
                row.SetValue(newfd,newvalue)
                rows.UpdateRow(row)
            else:
                row.SetValue(newfd,"")
                rows.UpdateRow(row)
        gp.SetProgressorPosition()
    gp.ResetProgressor()       
    del rows
    del row
#Input paramaters   
inputShapefile = gp.GetParameterAsText(0)
inputFields = gp.GetParameterAsText(1)
outputShapefile = gp.GetParameterAsText(2)
#Processing block
gp.toolbox = "management"
try:
    #Copy to new shapefile
    gp.CopyFeatures_management(inputShapefile,outputShapefile)
    # Add new field for storing result
    #gp.AddField(outputShapefile,newField,"TEXT","#","#",254)#,"#","NON_NULLABLE","NON_REQUIRED","#")
    #Processing conversion of encoding
    inputFL = inputFields.split(";")
    for inputField in inputFL:
        ConvertEncoding(outputShapefile,inputField,inputField,_TCVN3,_Unicode)
    gp.AddMessage("Finish!")
#Free resources
except:
    gp.GetMessage(2)
del gp


- Bước 4: Viết code vào file Scripts_Unicode_TCVN3.py cho tool Chuyển đổi Unicode -> TCVN3 để xử lý, các bạn copy code dưới vào file script (Cơ bản đoạn code này giống đoạn code ở bước 3 chỉ khác ở phần bôi đỏ ConvertEncoding(outputShapefile,inputField,inputField,_Unicode,_TCVN3))

# -*- coding: utf-8 -*-
# Author: Nguyễn Viết Quân
# Web: gisgpsrs.blogspot.com
# Email : vietquan2407@gmail.com
# Nguồn: Tham khảo
import arcgisscripting
gp = arcgisscripting.create(9.3)
def Convert(str,s,d):
    global _Unicode, _TCVN3, _KhongDau
    result = u''
    for c in str:
        idx = s.find(c)
        if idx >= 0:
            c = d[idx]
        result += c
    return result
# Array of characters (Using Tuple instead of List)
_Unicode = (
    #'Ã?Ã?ăÄ?Ä?Ä?êÊÃ?Ã?Æ?Æ?Æ?Æ?'
    u'âÂăĂđĐêÊôÔơƠưƯ'
    #u'\xe2\xc2\u0103\u0102\u0111\u0110\xea\xca\xf4\xd4\u01a1\u01a0\u01b0\u01af'
    #'Ã?Ã?Ã?Ã?áº?áº?Ã?Ãáº?áº?áº?áº?áº?áº?áº?áº?áº?Ẫáº?áº?áº?áº?áº?áº?áº?áº?ẵáº?áº?áº?'
    u'áÁàÀảẢãÃạẠấẤầẦẩẨẫẪậẬắẮằẰẳẲẵẴặẶ'
    #u'\xe1\xc1\xe0\xc0\u1ea3\u1ea2\xe3\xc3\u1ea1\u1ea0\u1ea5\u1ea4\u1ea7\u1ea6\u1ea9\u1ea8\u1eab\u1eaa\u1ead\u1eac\u1eaf\u1eae\u1eb1\u1eb0\u1eb3\u1eb2\u1eb5\u1eb4\u1eb7\u1eb6'
    #'Ã?Ã?Ã?Ã?áº?Ẻáº?áº?áº?áº?áº?áº?á??á??á?ƒá??á??á??á??á??Ã?Ã?Ã?ÃŒá??á??Ä?Ä?á??á?Š'
    u'éÉèÈẻẺẽẼẹẸếẾềỀểỂễỄệỆíÍìÌỉỈĩĨịỊ'
    #u'\xe9\xc9\xe8\xc8\u1ebb\u1eba\u1ebd\u1ebc\u1eb9\u1eb8\u1ebf\u1ebe\u1ec1\u1ec0\u1ec3\u1ec2\u1ec5\u1ec4\u1ec7\u1ec6\xed\xcd\xec\xcc\u1ec9\u1ec8\u0129\u0128\u1ecb\u1eca'
    #'Ã?Ã?Ã?Ã?á??á?ŽÃµÃ?á??á?Œá??á??á??á??á??á??á??á??á??á??á??á?šá??á?œá?Ÿá?žá??á??á??á??'
    u'óÓòÒỏỎõÕọỌốỐồỒổỔỗỖộỘớỚờỜởỞỡỠợỢ'
    #u'\xf3\xd3\xf2\xd2\u1ecf\u1ece\xf5\xd5\u1ecd\u1ecc\u1ed1\u1ed0\u1ed3\u1ed2\u1ed5\u1ed4\u1ed7\u1ed6\u1ed9\u1ed8\u1edb\u1eda\u1edd\u1edc\u1edf\u1ede\u1ee1\u1ee0\u1ee3\u1ee2'
    #'úÚÃ?Ã?á??á??Å?Å?á??á??á??á??á??á?ªá??á??á??á??á??á??á??á??á??á??á??á??á?µá??Ã?Ã?'
    u'úÚùÙủỦũŨụỤứỨừỪửỬữỮựỰỳỲỷỶỹỸỵỴýÝ'
    #u'\xfa\xda\xf9\xd9\u1ee7\u1ee6\u0169\u0168\u1ee5\u1ee4\u1ee9\u1ee8\u1eeb\u1eea\u1eed\u1eec\u1eef\u1eee\u1ef1\u1ef0\u1ef3\u1ef2\u1ef7\u1ef6\u1ef9\u1ef8\u1ef5\u1ef4\xfd\xdd'
)
_KhongDau = (
    u'aAaAdDeEoOoOuU'
    u'aAaAaAaAaAaAaAaAaAaAaAaAaAaAaA'
    u'eEeEeEeEeEeEeEeEeEeEiIiIiIiIiI'
    u'oOoOoOoOoOoOoOoOoOoOoOoOoOoOoO'
    u'uUuUuUuUuUuUuUuUuUuUyYyYyYyYyY'
)
_TCVN3= (
  #'Â?Â?Â?Â?Â?Â?ªÂ?Â?Â?Â?Â?Â?Â?'
    u'©¢¨¡®§ª£«¤¬¥­¦'
    #'\xa9\xa2\xa8\xa1\xae\xa7\xaa\xa3\xab\xa4\xac\xa5\xad\xa6'
    #'Â?Â?µµÂ?Â?Â?Â?Â?Â?ÊÊÃ?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Â?Â?Â?Â?Â?Â?Â?Â?Ã?Ã?'
    u'¸¸µµ¶¶••¹¹ÊÊÇÇÈÈÉÉË˾¾»»¼¼½½ÆÆ'
    #'\xb8\xb8\xb5\xb5\xb6\xb6\xb7\xb7\xb9\xb9\xca\xca\xc7\xc7\xc8\xc8\xc9\xc9\xcb\xcb\xbe\xbe\xbb\xbb\xbc\xbc\xbd\xbd\xc6\xc6'
    #'Ã?Ã?ÌÌÎÎÃ?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?ÜÜÞÞ'
    u'ÐÐÌÌÎÎÏÏÑÑÕÕÒÒÓÓÔÔÖÖÝÝ××ØØÜÜÞÞ'
    #u'\xcf\xcf\xd1\xd1\xd5\xd5\xd2\xd2\xd3\xd3\xd4\xd4\xd6\xd6\xdd\xdd\xd7\xd7\xd8\xd8\xdc\xdc\xde\xde'
    #'Ã?Ã?ßßÃ?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?êêÃ?Ã?Ã?Ã?Ã?Ã?'
    u'ããßßááââääèèååææççééííêêëëììîî'
    #'\xe2\xe2\xe4\xe4\xe8\xe8\xe5\xe5\xe6\xe6\xe7\xe7\xe9\xe9\xed\xed\xea\xea\xeb\xeb\xec\xec\xee\xee'
    #'Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?Ã?õõÃ?Ã?Ã?Ã?Ã?Ã?úúÃ?Ã?Ã?Ã?Ã?Ã?Ã?Ã?'
    u'óóïïññòòôôøøõõöö÷÷ùùúúûûüüþþýý'
    #'\xf3\xf3\xef\xef\xf1\xf1\xf2\xf2\xf4\xf4\xf8\xf8\xf5\xf5\xf6\xf6\xf7\xf7\xf9\xf9\xfa\xfa\xfb\xfb\xfc\xfc\xfe\xfe\xfd\xfd'
)

def ConvertEncoding(input_fc,input_fd,newfd,sE,dE):
    global gp
    rows = gp.updatecursor(input_fc)
    result = gp.GetCount_management(input_fc)
    count = int(result.GetOutput(0))
    gp.SetProgressor("step", "Reading", 0, count, 1)
    for row in iter(rows.next, None):
        if(row.GetValue(input_fd)!=None):#Nếu dữ liệu khác Null thì mới gán không là lỗi
            string1 = row.GetValue(input_fd)
            if  string1.strip() <> "":
                newvalue =  Convert(row.GetValue(input_fd),sE,dE)
                row.SetValue(newfd,newvalue)
                rows.UpdateRow(row)
            else:
                row.SetValue(newfd,"")
                rows.UpdateRow(row)
        gp.SetProgressorPosition()
    gp.ResetProgressor()    
    del rows
    del row
#Input paramaters
inputShapefile = gp.GetParameterAsText(0)
inputFields = gp.GetParameterAsText(1)
outputShapefile = gp.GetParameterAsText(2)
#Processing block
gp.toolbox = "management"
try:
    #Copy to new shapefile
    gp.CopyFeatures_management(inputShapefile,outputShapefile)
    # Add new field for storing result
    #gp.AddField(outputShapefile,newField,"TEXT","#","#",254)#,"#","NON_NULLABLE","NON_REQUIRED","#")
    #Processing conversion of encoding
    inputFL = inputFields.split(";")
    for inputField in inputFL:
        ConvertEncoding(outputShapefile,inputField,inputField,_Unicode,_TCVN3)
    gp.AddMessage("Finish!")
#Free resources
except:
    gp.GetMessage(2)
del gp


- Vậy là đã hoàn thành tool chuyển đổi font TCVN3=>Unicode và ngược lại, trước khi chạy tool các bạn cần chạy file “Shapefile_Unicode.reg” để đăng ký Unicode, sau đó các bạn chạy tool này bằng cách nháy đúp vào tool và chọn dữ liệu đầu vào sau đó chạy đợi kết quả.

- Bạn có thể download tool này ở đây

Chúc các bạn thành công!

Hãy like nếu bài viết có ích →
Kết bạn với gisgpsrs trên Facebook để nhận bài viết mới nóng hổi

3 nhận xét:

  1. chào bạn! Bạn có phần hướng dẫn viết tool trong arcgis bằng C# cho mình xin với. Nếu có bạn có thể gửi cho mình vào địa chỉ mail này nhé: hungtddc@gmail.com
    Cảm ơn bạn nhiều!

    Trả lờiXóa
    Trả lời
    1. Bạn đọc mấy cuốn này nhé: https://books.google.com.vn/books?id=SPRds0ZpbXUC&pg=PA190&lpg=PA190&dq=igxdialog+domodalopen+example+.net&source=bl&ots=0gMLFIJgBE&sig=nKCQkEtVEVSzYGEybG8HOj4QABY&hl=en&sa=X&ei=0jKwU8WSEYvp8AX5gIGgAw#v=onepage&q&f=false

      Xóa
  2. chào bạn, mình mới bắt đầu học thêm về ngôn ngữ lập trình sử dụng cho arcgis để kết nối được nhiều tool khi thao tác. Bạn cho mình xin thêm tài liệu hướng dẫn chi tiết cho người mới bắt đầu ạ.

    Trả lờiXóa