ỨNG DỤNG GIS HỖ TRỢ BÀI TOÁN TƯỚI CÂY TRÊN ĐƯỜNG TẠI QUẬN THỦ ĐỨC

80 444 0
ỨNG DỤNG GIS HỖ TRỢ BÀI TOÁN TƯỚI CÂY TRÊN ĐƯỜNG TẠI QUẬN THỦ ĐỨC

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BỘ GIÁO DỤC VÀ ĐÀO TÀO TRƢỜNG ĐẠI HỌC NÔNG LÂM TP.HỒ CHÍ MINH KHOA MÔI TRƢỜNG VÀ TÀI NGUYÊN TIỂU LUẬN TỐT NGHIỆP ỨNG DỤNG GIS HỖ TRỢ BÀI TOÁN TƢỚI CÂY TRÊN ĐƢỜNG TẠI QUẬN THỦ ĐỨC Họ tên: Nguyễn Thị Bảo Xuyên Ngành: Hệ thống thông tin địa lý Niên khóa: 2012 - 2016 TP Hồ Chí Minh, tháng 06 năm 2016 i LỜI CẢM ƠN Trong trình làm tiểu luận tốt nghiệp nhận giúp đỡ, bảo tận tình cán Trung tâm Ứng dụng Hệ thống thông tin Địa lý (Trung tâm HCMGIS ) Sở Khoa học công nghệ TP.HCM quý thầy cô Bộ môn Tài ngyên GIS – Trường ĐH Nông Lâm TP.HCM toàn thể thành viên lớp DH12GI để hoàn thành tốt nhiệm vụ Qua đây, xin gửi lời cám ơn chân thành đến: Th.S Khưu Minh Cảnh, công tác Trung tâm Ứng dụng Hệ thống thông tin Địa lý – Sở Khoa học Công nghệ TP.HCM, người trực tiếp hướng dẫn, bảo tận tình, góp ý cho suốt qúa trình thực đề tài Quý thầy (cô) Bộ môn Tài nguyên GIS – Trường ĐH Nông Lâm TP.HCM đặc biệt thầy PGS.TS Nguyễn Kim Lợi, Th.S Nguyễn Thị Huyền, tận tình giảng dạy truyền đạt nhiều kiến thức quý báu suốt thời gian học tập trường Thầy Lê Văn Phận, KS Nguyễn Duy Liêm, anh chị Bộ môn Tài nguyên GIS – Trường ĐH Nông Lâm TP.HCM, tận tình bảo, góp ý thời gian học tập thực đề tài Tập thể cán viên chức Trung tâm Ứng dụng Hệ thống thông tin Địa lý – Sở Khoa học Công nghệ TP.HCM, tận tình giúp đỡ tạo điều kiện trình thực đề tài tiểu luận Cuối cùng, em gửi lời cảm ơn sâu sắc đến Gia đình bạn bè động viên giúp đỡ mặt tạo điều kiện thuận lợi trình học tập thời gian làm đề tài TP.HCM, tháng 06/2016 Nguyễn Thị Bảo Xuyên Bộ môn Tài nguyên GIS Khoa Môi trường Tài nguyên Trường ĐH Nông Lâm TP.HCM Email:baoxuyennt@gmail.com ii TÓM TẮT Nước có vai trò vô quan trọng người sinh vật trái đất Nước nguồn tài nguyên vô quý giá vô tận Nước cần cho sống phát triển, nước vừa môi trường vừa đầu vào cho sinh sản xuất nông nghiệp, công nghiệp Nói cụ thể loại đường phố có nhu cầu lượng nước khác Giả sử với lượng nước định làm để giải toán tưới cách hiệu tiết kiệm nước mà trì sống chi phí đường tối thiểu Chính đề tài nghiên cứu “Ứng dụng GIS hỗ trợ toán tưới đường quận Thủ Đức” thực hoàn thành Trung tâm Ứng dụng Hệ thống thông tin Địa lý (Trung tâm HCMGIS) Sở khoa học Công nghệ TP.HCM, khoảng thời gian từ tháng 03/2016 đến 05/2016 Kết đề tài đạt tiểu luận lập lịch trình tưới bên cạnh hiểu thêm phương pháp sử dụng trình bày đề tài iii MỤC LỤC LỜI CẢM ƠN ii TÓM TẮT iii MỤC LỤC iv DANH MỤC TỪ VIẾT TẮT vi DANH MỤC BẢNG BIỂU vii DANH MỤC HÌNH viii CHƢƠNG I MỞ ĐẦU CHƢƠNG TỔNG QUAN KHU VỰC NGHIÊN CỨU 2.1 Tổng quan địa bàn nghiên cứu CHƢƠNG CƠ SỞ LÝ THUYẾT 3.1 Tổng quan Hệ thống thông tin Địa lý (GIS) 3.1.2 Định nghĩa 3.1.3 Thành phần GIS 3.1.4 Chức GIS 11 3.1.5 Cấu trúc sở liệu GIS 12 3.1.7 Công cụ Network Analyst ArcGis 14 3.2 Tổng quan đồ thị 15 3.2.1 Định nghĩa đồ thị (Graph) 16 3.3 Biểu diễn đồ thị máy tính 18 3.3.1 Ma trận liền kề (Ma trận kề) 19 3.4 Đồ thị Euler đồ thị Halmiton 20 3.4.1 Đồ thị Euler 20 3.4.2 Đồ thị Halmiton 23 3.5 Bài toán tô màu toán lập lịch 25 3.5.1 Bài toán tô màu 25 3.5.2 Bài toán lập lịch 28 3.6 Giới thiệu sơ lược ngôn ngữ lập trình Python 29 3.6.1 Giới thiệu 29 3.6.2 Lịch sử hình thành 30 3.7 Giới thiệu P-Center 31 iv CHƢƠNG DỮ LIỆU VÀ PHƢƠNG PHÁP NGHIÊN CỨU 33 4.1 Dữ liệu thu thập 33 4.2 Phương pháp nghiên cứu 33 4.2.1 Các công cụ hỗ trợ phân tích không gian ArcGIS sử dụng nghiên cứu 33 4.2.2 Phương pháp phân tích phép phân tích P-center loại 36 4.3 Tiến trình thực 37 CHƢƠNG KẾT QUẢ NGHIÊN CỨU 38 5.1 Kết điểm quận Thủ Đức 38 5.2 Lập lịch tưới 38 CHƢƠNG KẾT LUẬN VÀ KIẾN NGHỊ 45 6.1 Kết luận 45 6.2 Kiến nghị 45 TÀI LIỆU THAM KHẢO 46 PHỤ LỤC 48 v DANH MỤC TỪ VIẾT TẮT CSDL Cơ sở liệu GIS (Geographic Information system) Hệ thống thông tin Địa lý GDB (Geodatabase) Cơ sở liệu địa lý TP.HCM Thành phố Hồ Chí Minh HTTTĐL Hệ thống thông tin địa lý DBMS (Database Management System) Hệ quản trị sở liệu HĐH Hệ điều hành P-center P-trung tâm Point Điểm vi DANH MỤC BẢNG BIỂU Bảng 4.1 Thông tin lớp liệu 33 Bảng 5.1 Kết lập lịch tưới 43 vii DANH MỤC HÌNH Hình 2.1 Bản đồ quận Thủ Đức .4 Hình 3.1 Các thành phần GIS 10 Hình 3.2 Các chức GIS 12 Hình 3.3 Cấu trúc liệu Raster Vector 13 Hình 3.4 Biểu diễn thông tin điểm, đường, vùng theo cấu trúc vector 13 Hình 3.5 Cấu trúc liệu Raster 14 Hình 3.6 Ví dụ mô hình đồ thị 16 Hình 3.7 Sơ đồ mạng máy tính 17 Hình 3.8 Phân loại đồ thị .18 Hình 3.9 Đồ thị G1, G2, G3 21 Hình 3.10 Đồ thị H1, H2, H3 .21 Hình 3.11 Minh họa cho chứng minh định lý 22 Hình 3.12 Đồ thị Hamilton G3, nửa Hamilton G2 G1 23 H1: đồ ví dụ 26 H2: Đồ thị kép đồ H1 .26 Hình 3.13 Đồ thị Petersen có sắc số 27 Hình 4.1 Hộp thoại New Feature Class .34 Hình 4.2 Geodatase chứa điểm .34 Hình 4.3 Hộp thoại Star Edting 35 Hình 4.4 Hộp thoại Create Features 35 Hinh 4.5 Kết điểm (cây) 36 Hình 5.1 Tổng số thuộc tính đồ 38 Hình 5.2 Đồ thị tưới ngày/ lần 39 Hình 5.3 Ma trận kề đồ thị tưới ngày/ lần 39 Hình 5.4 Đồ thị tưới ngày/ lần 39 Hình 5.5 Ma trận kề đồ thị tưới ngày/ lần 40 Hình 5.6 Đồ thị tưới ngày/ lần 40 Hình 5.7 Ma trận kề đồ thị tưới ngày/ lần 40 Hình 5.8 Kết giá trị cho đồ thị tập đỉnh 41 viii Hình 5.10 Kết giá trị cho đồ thị tập đỉnh 41 Hình 5.11 Kết giá trị cho đồ thị tập đỉnh 42 Hình 5.12 Đồ thị đỉnh tương ứng nút giao thông cạnh đường 43 Hình 5.13 Kết đồ tưới 44 ix self.P_center_list.append(p) remove_list.append(p) # lai chon cac dinh co bac cao va dua cac dinh phu thuoc vao remove_list: while (len(remove_list) < self.V_nums): min_MAX = sys.maxint p_Max = for p in range(self.V_nums): if ( (p in remove_list) == False): # neu p chua bi remove thi xet p chon gia tri thap nhat for q in range(self.V_nums): if (((q in remove_list) == False) and (self.Pro[p][q] > p_Max)): p_Max = self.Pro[p][q] if (min_MAX > p_Max): min_MAX = p_Max p_Max = for p in range(self.V_nums): if ( (p in remove_list) == False): # neu p chua bi remove thi xet p chon gia tri thap nhat for q in range(self.V_nums): if (((q in remove_list) == False) and (self.Pro[p][q] > p_Max)): p_Max = self.Pro[p][q] if (min_MAX == p_Max): self.P_center_list.append(p) remove_list.append(p) for q in range(self.V_nums): 56 if (((q in remove_list) == False) and (self.Pro[p][q] > 0) and (self.Pro[p][q] >> gg = GISGraph ("C://bxuyencode//matrix2.txt") >>> gg.P_center (9) >>> gg.P_center_list [0, 4] >>> gg.P_center (11) >>> gg.P_center_list [0, 4] >>> gg.P_center (12) >>> gg.P_center_list [0, 4] >>>  Nội dung file để tìm giá trị cho đồ thị để đƣợc tập đỉnh Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information >>> import os >>> import sys >>> import math >>> class GISGraph: V_nums = # so dinh cua thi (Gph) E_set = [] # tap canh cua thi Gph = [] # Ma tran thi: V_nums x V_nums Pro = [] # Ma tran luy thua: V_nums x V_nums weight_set = [] P_center_list = [] graphFile = "matrix3.txt" 57 max_Value = sys.maxint def init (self, sfilename): if sfilename == "": self.graphFile = "matrix3.txt" else: self.graphFile = sfilename try: f = open(self.graphFile) self.V_nums = int(f.readline()) # doc so dinh cua thi: maxtrix_dat = f.readlines() except IOError as e: print "Khong doc duoc tap tin" except ValueError: print "Khong the doc du lieu so" except: print "Khong biet loi gi!" raise ### Tao ma tran va doc thi: self.Gph = [[0 for i in range(self.V_nums)] for j in range(self.V_nums)] # ma tran ke V_nums x V_nums self.Pro = [[0 for i in range(self.V_nums)] for j in range(self.V_nums)] # ma tran ke V_nums x V_nums for p in range(self.V_nums): matrix_matrix = maxtrix_dat[p].split(" ") for q in range(self.V_nums): self.Gph[p][q] = int(matrix_matrix[q]) f.close() 58 # Dat gia tri ban dau cho ma tran tich Pro = ma tran Gph self.Pro = [[0 for i in range(self.V_nums)] for j in range(self.V_nums)] # ma tran ke V_nums x V_nums for p in range(self.V_nums): for q in range(self.V_nums): if (p == q): self.Pro[p][q] = else: if self.Gph[p][q] == 9999: self.Pro[p][q] = sys.maxint else: self.Pro[p][q] = self.Gph[p][q] def HienthiMatranPro(self): # Hien thi ma tran Tinh toan duong di for p in range(self.V_nums): prn_str = "" for q in range(self.V_nums): if (self.Pro[p][q] == sys.maxint): prn_str = prn_str + " VC" else: prn_str = prn_str + " " + str(self.Pro[p][q]) + " " print prn_str + "\n" def HienthiMatranGph(self): # Hien thi ma tran thi Gph for p in range(self.V_nums): prn_str = "" for q in range(self.V_nums): if (self.Gph[p][q] == sys.maxint): prn_str = prn_str + " VC " else: prn_str = prn_str + str(self.Gph[p][q]) + " " 59 print prn_str + "\n" # Tim duong di ngan nhat: def TinhToanDuongDiNganNhat(self): # Ham tra ve neu khong doi, tra ve neu co it nhat gia tri doi chgVal = # Gia tri thay doi Neu co thay doi thi chgVal = # khai bao ma tran tam ProTemp1 = [] ProTemp1 = [[0 for i in range(self.V_nums)] for j in for j in range(self.V_nums)] for p in range(self.V_nums): for q in range(self.V_nums): ProTemp1[p][q] = self.Pro[p][q] # khai bao ma tran tam ProTemp2 = [] ProTemp2 = [[0 for i in range(self.V_nums)] range(self.V_nums)] for p in range(self.V_nums): for q in range(self.V_nums): ProTemp2[p][q] = self.Pro[p][q] # Tinh ma tran luy thua: # self.Pro = [[0 for i in range(self.V_nums)] for j in range(self.V_nums)] # khong can thiet vi dinh nghia ham init for p in range(self.V_nums): for q in range(self.V_nums): myMin = sys.maxint for k in range(self.V_nums): 60 if ((ProTemp1[p][k] >= 0) and (ProTemp2[k][q] >= 0)): # Do thi co huong proVal = ProTemp1[p][k] + ProTemp2[k][q] # Gia tri tinh toan myMin = min(myMin, proVal) if self.Pro[p][q] != myMin: chgVal = self.Pro[p][q] = myMin return chgVal # Neu co thay doi, thi gia tri se > 0; nguoc lai gia tri tra ve la (i.e khong doi) def P_center(self, giatriNguong): # tim cac ta^m P-center thoa tu ta^m di den cac dinh khac < giatriNguong self.weight_set = [0 for i in range(self.V_nums * (self.V_nums -1) )] # tap cac so, co n*(n-1) self.P_center_list = [] # doc du lieu tu ma tran Pro vao: doc tat ca n(n-1) gia tri (khong doc gia tri duong cheo = 0) idx = -1 for p in range(self.V_nums): for q in range(self.V_nums): if (p != q): # < loai bo duong cheo bang kiem tra idx = idx + self.weight_set[idx] = self.Pro[p][q] self.weight_set.sort() self.weight_set = list(set(self.weight_set)) # print self.weight_set if (self.weight_set[0] > giatriNguong): # Neu gia tri nguong qua thap thi moi dinh deu la tam 61 self.P_center_list = [0 for i in range(self.V_nums)] # tap dinh = toan bo tap dinh for p in range(self.V_nums): self.P_center_list[p] = p else: if (self.weight_set[len(self.weight_set)-1] < giatriNguong): # Neu giaTriNguong qua qua cao thi lay dinh bat ki: self.P_center_list = [0] else: # truong hop nguong nam gia tri mang: remove_list = [] #Chon cac dinh co ket noi > giatriNguong dua vao list: for p in range(self.V_nums): min_p = sys.maxint # gia tri be nhat cua dinh P for q in range(self.V_nums): if ((self.Pro[p][q] > 0) and (self.Pro[p][q] < min_p)): min_p = self.Pro[p][q] if (min_p > giatriNguong): # gia tri ma van lon hon thi chon dinh self.P_center_list.append(p) remove_list.append(p) # lai chon cac dinh co bac cao va dua cac dinh phu thuoc vao remove_list: while (len(remove_list) < self.V_nums): min_MAX = sys.maxint p_Max = for p in range(self.V_nums): if ( (p in remove_list) == False): # neu p chua bi remove thi xet p chon gia tri thap nhat for q in range(self.V_nums): 62 if (((q in remove_list) == False) and (self.Pro[p][q] > p_Max)): p_Max = self.Pro[p][q] if (min_MAX > p_Max): min_MAX = p_Max p_Max = for p in range(self.V_nums): if ( (p in remove_list) == False): # neu p chua bi remove thi xet p chon gia tri thap nhat for q in range(self.V_nums): if (((q in remove_list) == False) and (self.Pro[p][q] > p_Max)): p_Max = self.Pro[p][q] if (min_MAX == p_Max): self.P_center_list.append(p) remove_list.append(p) for q in range(self.V_nums): if (((q in remove_list) == False) and (self.Pro[p][q] > 0) and (self.Pro[p][q] >> gg = GISGraph ("C://bxuyencode//matrix3.txt") >>> gg.P_center (8) >>> gg.P_center_list [0, 2, 3] >>> gg.P_center (9) >>> gg.P_center_list [0, 2, 5] 63 >>> gg.P_center (10) >>> gg.P_center_list [0, 3, 4] >>>  Nội dung file để tìm giá trị cho đồ thị để đƣợc tập đỉnh Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information >>> import os >>> import sys >>> import math >>> class GISGraph: V_nums = # so dinh cua thi (Gph) E_set = [] # tap canh cua thi Gph = [] # Ma tran thi: V_nums x V_nums Pro = [] # Ma tran luy thua: V_nums x V_nums weight_set = [] P_center_list = [] graphFile = "matrix3.txt" max_Value = sys.maxint def init (self, sfilename): if sfilename == "": self.graphFile = "matrix3.txt" else: self.graphFile = sfilename try: f = open(self.graphFile) self.V_nums = int(f.readline()) thi: maxtrix_dat = f.readlines() except IOError as e: print "Khong doc duoc tap tin" 64 # doc so dinh cua except ValueError: print "Khong the doc du lieu so" except: print "Khong biet loi gi!" raise ### Tao ma tran va doc thi: self.Gph = [[0 for i in range(self.V_nums)] for j in range(self.V_nums)] # ma tran ke V_nums x V_nums self.Pro = [[0 for i in range(self.V_nums)] for j in range(self.V_nums)] # ma tran ke V_nums x V_nums for p in range(self.V_nums): matrix_matrix = maxtrix_dat[p].split(" ") for q in range(self.V_nums): self.Gph[p][q] = int(matrix_matrix[q]) f.close() # Dat gia tri ban dau cho ma tran tich Pro = ma tran Gph self.Pro = [[0 for i in range(self.V_nums)] for j in range(self.V_nums)] # ma tran ke V_nums x V_nums for p in range(self.V_nums): for q in range(self.V_nums): if (p == q): self.Pro[p][q] = else: if self.Gph[p][q] == 9999: self.Pro[p][q] = sys.maxint else: self.Pro[p][q] = self.Gph[p][q] 65 def HienthiMatranPro(self): # Hien thi ma tran Tinh toan duong di for p in range(self.V_nums): prn_str = "" for q in range(self.V_nums): if (self.Pro[p][q] == sys.maxint): prn_str = prn_str + " VC" else: prn_str = prn_str + " " + str(self.Pro[p][q]) + " " print prn_str + "\n" def HienthiMatranGph(self): # Hien thi ma tran thi Gph for p in range(self.V_nums): prn_str = "" for q in range(self.V_nums): if (self.Gph[p][q] == sys.maxint): prn_str = prn_str + " VC " else: prn_str = prn_str + str(self.Gph[p][q]) + " " print prn_str + "\n" # Tim duong di ngan nhat: def TinhToanDuongDiNganNhat(self): # Ham tra ve neu khong doi, tra ve neu co it nhat gia tri doi chgVal = # Gia tri thay doi Neu co thay doi thi chgVal = # khai bao ma tran tam ProTemp1 = [] ProTemp1 = [[0 for i in range(self.V_nums)] for p in range(self.V_nums): for q in range(self.V_nums): 66 range(self.V_nums)] for j in ProTemp1[p][q] = self.Pro[p][q] # khai bao ma tran tam ProTemp2 = [] ProTemp2 = [[0 for i in range(self.V_nums)] for j in range(self.V_nums)] for p in range(self.V_nums): for q in range(self.V_nums): ProTemp2[p][q] = self.Pro[p][q] # Tinh ma tran luy thua: # self.Pro = [[0 for i in range(self.V_nums)] for j in range(self.V_nums)] # khong can thiet vi dinh nghia ham init for p in range(self.V_nums): for q in range(self.V_nums): myMin = sys.maxint for k in range(self.V_nums): if ((ProTemp1[p][k] >= 0) and (ProTemp2[k][q] >= 0)): # Do thi co huong proVal = ProTemp1[p][k] + ProTemp2[k][q] # Gia tri tinh toan myMin = min(myMin, proVal) if self.Pro[p][q] != myMin: chgVal = self.Pro[p][q] = myMin return chgVal # Neu co thay doi, thi gia tri se > 0; nguoc lai gia tri tra ve la (i.e khong doi) def P_center(self, giatriNguong): # tim cac ta^m P-center thoa tu ta^m di den cac dinh khac < giatriNguong self.weight_set = [0 for i in range(self.V_nums * (self.V_nums -1) )] # tap cac so, co n*(n-1) 67 self.P_center_list = [] # doc du lieu tu ma tran Pro vao: doc tat ca n(n-1) gia tri (khong doc gia tri duong cheo = 0) idx = -1 for p in range(self.V_nums): for q in range(self.V_nums): if (p != q): # < loai bo duong cheo bang kiem tra idx = idx + self.weight_set[idx] = self.Pro[p][q] self.weight_set.sort() self.weight_set = list(set(self.weight_set)) # print self.weight_set if (self.weight_set[0] > giatriNguong): # Neu gia tri nguong qua thap thi moi dinh deu la tam self.P_center_list = [0 for i in range(self.V_nums)] # tap dinh = toan bo tap dinh for p in range(self.V_nums): self.P_center_list[p] = p else: if (self.weight_set[len(self.weight_set)-1] < giatriNguong): # Neu giaTriNguong qua qua cao thi lay dinh bat ki: self.P_center_list = [0] else: # truong hop nguong nam gia tri mang: remove_list = [] #Chon cac dinh co ket noi > giatriNguong dua vao list: for p in range(self.V_nums): min_p = sys.maxint # gia tri be nhat cua dinh P for q in range(self.V_nums): if ((self.Pro[p][q] > 0) and (self.Pro[p][q] < min_p)): 68 min_p = self.Pro[p][q] if (min_p > giatriNguong): # gia tri ma van lon hon thi chon dinh self.P_center_list.append(p) remove_list.append(p) # lai chon cac dinh co bac cao va dua cac dinh phu thuoc vao remove_list: while (len(remove_list) < self.V_nums): min_MAX = sys.maxint p_Max = for p in range(self.V_nums): if ( (p in remove_list) == False): # neu p chua bi remove thi xet p chon gia tri thap nhat for q in range(self.V_nums): if (((q in remove_list) == False) and (self.Pro[p][q] > p_Max)): p_Max = self.Pro[p][q] if (min_MAX > p_Max): min_MAX = p_Max p_Max = for p in range(self.V_nums): if ( (p in remove_list) == False): # neu p chua bi remove thi xet p chon gia tri thap nhat for q in range(self.V_nums): if (((q in remove_list) == False) and (self.Pro[p][q] > p_Max)): p_Max = self.Pro[p][q] if (min_MAX == p_Max): self.P_center_list.append(p) 69 remove_list.append(p) for q in range(self.V_nums): if (((q in remove_list) == False) and (self.Pro[p][q] > 0) and (self.Pro[p][q] >> gg = GISGraph ("C://bxuyencode//matrix4.txt") >>> gg.P_center (5) >>> gg.P_center_list [2, 4, 5, 0] >>> gg.P_center (6) >>> gg.P_center_list [2, 4, 0, 5] >>> gg.P_center (7) >>> gg.P_center_list [4, 0, 2, 5] >>> 70

Ngày đăng: 18/10/2016, 07:58

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan