Web cho ứng dụng GIS và xây dựng ứng dụng minh họa khai thác dịch vụ - 7
lượt xem 11
download
Chương 5. CarbonTools 5.2.2.3. Lớp CarbonTools.Core.WFS.HandlerWFS Các thuộc tính STT 1 Tên thuộc tính Data Kiểu dữ liệu CarbonTools.Core.Features. DataFeatures 2 3 Source Synchronous CarbonTools.Core.WFS.Source WFS boolean Ý nghĩa Dữ liệu lấy được từ server sau khi thực hiện request Thông tin request cần gởi lên server Cho biết request này được thực hiện theo kiểu đồng bộ hay không đồng bộ 4 OperationDone EventHandler Đây là 1 delegate. có tác dụng thông báo khi mà quá trình nhận dữ liệu không đồng bộ được thực hiện xong. 5 ProgressChang ed EventHandler Đây là 1 delegate, có tác dụng thông báo...
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Web cho ứng dụng GIS và xây dựng ứng dụng minh họa khai thác dịch vụ - 7
- Chương 5. CarbonTools 5.2.2.3. Lớp CarbonTools.Core.WFS.HandlerWFS Các thuộc tính STT Tên thuộc tính Kiểu dữ liệu Ý nghĩa 1 Data CarbonTools.Core.Features. Dữ liệu lấy được từ DataFeatures server sau khi thực hiện request 2 Source CarbonTools.Core.WFS.Source Thông tin request WFS cần gởi lên server 3 Synchronous boolean Cho biết request này được thực hiện theo kiểu đồng bộ hay không đồng bộ 4 OperationDone EventHandler Đây là 1 delegate. có tác dụng thông báo khi mà quá trình nhận dữ liệu không đồng bộ được thực hiện xong. 5 ProgressChang EventHandler Đây là 1 delegate, có ed tác dụng thông báo về tình trạng của tiến trình nhận dữ liệu không đồng bộ. Bảng 5.6. Các thuộc tính của CarbonTools.Core.WFS.HandlerWFS Phương thức GetFeature(): Gởi request lên server với các thông tin chứa trong Source và lấy kết quả về, lưu trong Data. 98
- Chương 5. CarbonTools Ví dụ thực hiện GetFeature request //Thiết lập các thông tin cho request SourceWFS source = new SourceWFS(); source.Address = “http://localhost/OpenGISServer/VNesOpenGISServer.aspx”; source.Layers.Add(new WFSLayerType(“quan”)); source.Layers.Add(new WFSLayerType(“duong”)); //Thực hiện gởi request bằng phương pháp không đồng //bộ. HandlerWFS handlerWFS = new HandlerWFS( source); handlerWFS.ProgressChanged += new EventHandler(handler_ProgressChanged); handlerWFS.OperationDone += new EventHandler(handlerWFS_OperationDone); handlerWFS.Synchronous = false; handlerWFS.GetFeature(); //Lấy kết quả trả về LayerItemCollection collection = handlerWFS.Data.Features; //Duyệt qua danh sách các Feature foreach (Item item in items) { string sName = item.Name; if (item is ItemElement) { //Nếu đây là thuộc tính bình thường if (((ItemElement)item).Value != null) string sValue =((ItemElement)item).Value; else if (item is ItemMember) {} //Nếu đây là thuộc tính địa lý (tức là các kiểu //Point, LineString…) else if (item is ItemGeometry) { 99
- Chương 5. CarbonTools //Nếu như thuộc tính này là 1 Point if (((ItemGeometry)(item)).GeometryObject is CarbonTools.Core.Geometries.Point) { CarbonTools.Core.Geometries.Point point = (CarbonTools.Core.Geometries.Point) ((ItemGeometry) (Item)).GeometryObject; string sX = point.X; if (point.Y != Double.MaxValue) string sY = point.Y; if (point.Z != Double.MaxValue) string sZ = point.Z; } //Nếu thuộc tính này là 1 LineString else if (((ItemGeometry)(item)).GeometryObject is CarbonTools.Core.Geometries.LineString) { } //Nếu thuộc tính này là 1 Polygon else if (((ItemGeometry)(item)).GeometryObject is CarbonTools.Core.Geometries.Polygon) { System.Collections.CollectionBase coll = ((CarbonTools.Core.Geometries.Polygon) ((ItemGeometry)(item)).GeometryObject). Interior as System.Collections.CollectionBase; if (coll.Count > 0) 100
- Chương 5. CarbonTools } //Nếu thuộc tính này là 1 Collection else if (((ItemGeometry)(item)).GeometryObject is System.Collections.CollectionBase) { System.Collections.CollectionBase coll = (System.Collections.CollectionBase) ((ItemGeometry)(item)).GeometryObject; //Nếu nó là 1 PointCollection if(((ItemGeometry)item)).GeometryObject is CarbonTools.Core.Geometries.PointCollection) {} //Nếu nó là 1 LineStringCollection else if (((ItemGeometry)(item)).GeometryObject is CarbonTools.Core.Geometries. LineStringCollection) { } //Nếu thuộc tính này là PolygonCollection elseif (((ItemGeometry)(item)).GeometryObject is CarbonTools.Core.Geometries.PolygonCollection) } else if (((ItemGeometry)(item)).GeometryObject is CarbonTools.Core.Geometries.Envelope) 101
- Chương 5. CarbonTools { } if (item.Attributes.Count > 0) { IEnumerator enumerator = item.Attributes.GetEnumerator(); while (enumerator.MoveNext()) { ItemElement elem = enumerator.Current as ItemElement; string sName = elem.Name; string sValue = elem.Value; } } } } 5.3. Dùng CarbonTools gởi GetMap request Để thực hiện gởi 1 GetMap request ta cần sử dụng các lớp quan trọng sau: HandlerWMS, DataRaster, SourceWMS 5.3.1. Lớp CarbonTools.Core.WMS.SourceWMS Lớp này chứa các thông tin cần thiết để thực hiện 1 GetMap request. Các thuộc tính của lớp 102
- Chương 5. CarbonTools STT Tên thuộc Kiểu dữ liệu Ý nghĩa tính 1 Version string Phiên bản WMS mà server cài đặt 2 Address System.Uri Địa chỉ sẽ gởi request 3 BBox CarbonTools.Core. Vùng hình chữ nhật cần lấy hình ảnh BoundingBox 4 BgColor Color Màu nền của ảnh cần lấy về 5 Format string Định dạng ảnh cần lấy về 6 Height int Chiều cao của ảnh 7 Width int Chiều rộng của ảnh 8 Transparent Bool Cho biết ảnh trả về có transparent không 8 Layers ArrayList Chứa danh sách các Layer cần lấy về Bảng 5.7. Các thuộc tính của CarbonTools.Core.WMS.SourceWMS 5.3.2. Lớp CarbonTools.Core.Base.DataRaster Lớp này chứa hình ảnh được server gởi về. Các thuộc tính STT Tên thuộc tính Kiểu dữ liệu Ý nghĩa 1 Map Image Chứa ảnh được server gởi về 2 BBox CarbonTools.Core.BoundingBox Hình chữ nhật bao của ảnh Bảng 5.8. Các thuộc tính của CarbonTools.Core.Base.DataRaster 5.3.3. Lớp CarbonTools.Core.WMS.HandlerWMS Lớp này có tác dụng gởi 1 WMS request lên server và nhận kết quả trả về là 1 ảnh 103
- Chương 5. CarbonTools Các thuộc tính STT Tên thuộc tính Kiểu dữ liệu Ý nghĩa 1 Source CarbonTools.Core. Chứa các thông tin về request cần WMS.SourceWMS gởi lên server 2 Data CarbonTools.Core. Chứa hình ảnh trả về Base.DataRaster 3 Synchronous bool Cho biết gởi request theo phương pháp bất đồng bộ hay không Bảng 5.9. Các thuộc tính của CarbonTools.Core.WMS.HandlerWMS Phương thức GetMap(): Thực hiện việc gởi GetMap request với các thông tin trong Source và nhận kết quả về, lưu trong thuộc tính Data. 5.3.4. Vi dụ thực hiện GetMap request //Lấy các thông tin cần thiết để gởi request sourceWms = new SourceWMS(); sourceWms.Version = “1.1.0”; sourceWms.Address = “http://localhost/OpenGISServer/VNesOpenGISServer.aspx”; sourceWms.BBox = new BoundingBox(Double.Parse(txtMinX.Text),Double.Par se(txtMinY.Text),Double.Parse(txtMaxX.Text),Doubl e.Parse(txtMaxY.Text),cmbCoordinate.Text); sourceWms.BgColor = txtBackColor.BackColor; sourceWms.Format = cmbFormat.Text; sourceWms.Height = Int32.Parse(txtHeight.Text); sourceWms.Width = Int32.Parse(txtWidth.Text); //Chọn các Layer cần lấy về, mỗi Layer có thể thiết lập thêm có thêm //thuộc tính style cho nó for (int i = 0;i < SelectedLayers.Count;i++) { 104
- Chương 5. CarbonTools if (SelectedStyles[i] != null) sourceWms.Layers.Add(newWMSLayerType(((LayerItem) SelectedLayers[i]).Name,((MapStyle) SelectedStyles[i]).Name)); else sourceWms.Layers.Add(new WMSLayerType(((LayerItem)SelectedLayers [i]).Name,"")); } sourceWms.Transparent = chkTransparent.Checked; Thực hiện gởi request //Tạo 1 HandlerWMS với Source là sourceWms handlerWms = new HandlerWMS(sourceWms); handlerWms.ProgressChanged += new EventHandler(handler_GetMapProgressChanged); handlerWms.OperationDone += new EventHandler(handler_GetMapOperationDone); handlerWms.Synchronous = false; handlerWms.GetMap(); //Nhận ảnh trả về picMap.Image = ((DataRaster)handlerWms.Data).Map; 5.4. Dùng CarbonTools gởi DescribeFeatureType request Để thực hiện DescribeFeatureType request ta dùng các lớp SourceWFS và HandlerWFS. Hai lớp này đã được trình bày ở trên trong phần gởi GetFeature request. Khi gởi 1 request, ta cũng cần xác định các loại Feature cần được mô tả trong SourceWFS. Nhưng kết quả trả về chỉ là 1 đối tượng XmlDocument, ta phải tự đọc hiểu tài liệu Xml này để lấy kết quả. 105
- Chương 5. CarbonTools Loại request này không được hỗ trợ để gởi theo phương pháp bất đồng bộ, phải gởi theo phương pháp đồng bộ. Thực hiện gởi DescribeFeatureType request bằng hàm XmlDocument xml = HandlerWFS.GetFeatureSchema(); Sau khi hàm này thực hiện xong thì lệnh kế tiếp mới được thực hiện. Ví dụ thực hiện DescribeFeatureType request SourceWFS source = new SourceWFS(); source.Address = http://localhost/OpenGISServer/VNesOpenGISServer .aspx”; source.Layers.Add(new WFSLayerType(“quan”)); source.Layers.Add(new WFSLayerType(“duong”)); HandlerWFS handlerWFS = new HandlerWFS( source); XmlDocument XmlResult = handlerWFS.GetFeatureSchemaXml(); Ta phải tự đọc kết quả từ XmlDocument này, CarbonTools không hỗ trợ lấy kết quả từ nó. 5.5. Dùng CarbonTools gởi request của Transaction và LockFeature Đối với các request này thì CarbonTools chỉ hỗ trợ việc gởi request bằng hàm: HandlerWFS.SendXml(XmlDocument sentDocument, out XmlDocument receivedDocument) Hàm này gởi sentDocument lên server với Address được chỉ ra trong Source và lưu kết quả trả về trong receivedDocument. Ta phải tự tạo sentDocument để gởi và phải tự đọc receivedDocument trả về để lấy kết quả. 106
- Chương 6. Cài đặt chương trình OpenGISServer Chương 6. Cài đặt chương trình OpenGIS Server 6.1. Giới thiệu Server được cài đặt bằng ASP.NET hỗ trợ các loại Request sau: Các Request của Web Feature Service: • GetCapabilities • GetFeature • DescribeFeatureType • Transaction • LockFeature Các Request của Web Map Service: • GetCapabilities • GetMap 6.2. Tổ chức và lưu trữ dữ liệu Hệ quản trị cơ sở dữ liệu được sử dụng để cài đặt Server là MySQL Version 4.1. Hệ quản trị này hỗ trợ rất tốt cho các ứng dụng OpenGIS vì nó có các hàm, các kiểu dữ liệu tuân theo các đặc tả của OpenGIS. Chi tiết về MySQL với các hỗ trợ cho OpenGIS có thể xem thêm ở phần phụ lục. Dữ liệu trên Server là dữ liệu về địa lý thành phố Hồ Chí Minh, gồm các bảng sau: 107
- Chương 6. Cài đặt chương trình OpenGISServer Tên bảng Ý nghĩa bachhoatonghop Lưu trữ thông tin về các cửa hàng bách hóa tổng hợp trong thành phố baotang Lưu trữ thông tin về các bảo tàng trong thành phố benhvien Lưu trữ thông tin về các bệnh viện trong thành phố benxe Lưu trữ thông tin về các bến xe trong thành phố buudien Lưu trữ thông tin về các bưu điện trong thành phố cho Lưu trữ thông tin về các chợ trong thành phố chua Lưu trữ thông tin về các chùa trong thành phố diadanh Lưu trữ thông tin về các địa danh khác trong thành phố duong Lưu trữ thông tin về các con đường trong thành phố khachsan Lưu trữ thông tin về các khách sạn trong thành phố lanhsuquan Lưu trữ thông tin về các lãnh sự quán trong thành phố nganhang Lưu trữ thông tin về các ngân hàng trong thành phố nhatho Lưu trữ thông tin về các nhà thờ trong thành phố quan Lưu trữ thông tin về các quận trong thành phố sieuthi Lưu trữ thông tin về các siêu thị trong thành phố song Lưu trữ thông tin về các con sông trong thành phố truongcap3 Lưu trữ thông tin về các trường cấp 3 trong thành phố truongdaihoc Lưu trữ thông tin về các trường đại học trong thành phố tuyensinh Lưu trữ thông tin về các trường học trong thành phố ubndquan Lưu trữ thông tin về các ủy ban nhân dân trong thành phố ypagesit Lưu trữ thông tin về 1 số công ty, tổ chức lockedfeature Lưu trữ các đối tượng bị khóa bằng Request LockFeature Bảng 6.1.Các bảng dữ liệu trong CSDL TpHCM 108
- Chương 6. Cài đặt chương trình OpenGISServer Mô tả chi tiết về các bảng trong cơ sở dữ liệu Các bảng: bachhoatonghop, baotang, benhvien, benxe, buudien, cho, chua, diadanh, khachsan, lanhsuquan, nganhang, nhatho, sieuthi, truongcap3, truongdaihoc, ubndquan có cùng cấu trúc như sau: STT Tên cột Kiểu dữ liệu Ý nghĩa Kiểu Point (*), được lưu trữ 1 geographicalshape Là 1 điểm, cho biết tọa theo định dạng riêng bên độ của đối tượng trên trong MySQL. bản đồ 2 TEN Kiểu chuỗi Tên của đối tượng 3 THUOC Kiểu chuỗi Quận mà đối tượng này thuộc về 4 ID Số nguyên (AutoNumber) Định danh của đối tượng, là khóa chính Bảng 6.2.Cấu trúc chung của các bảng dữ liệu 109
- Chương 6. Cài đặt chương trình OpenGISServer Bảng “duong”: STT Tên cột Kiểu dữ liệu Ý nghĩa Kiểu MultiLineString (*), 1 geographicalshape Cho biết các điểm tạo được lưu trữ theo định dạng nên con đường này. riêng trong MySQL 2 FNODE_ Số thực 3 TNODE_ Số thực 4 LPOLY_ Số thực 5 RPOLY_ Số thực 6 LENGTH Số thực Chiều dài con đường 7 DUONG_ Số thực 8 DUONG_ID Số thực 9 ROAD_NAME Chuỗi Tên đường 10 DAI_LO Số thực 11 HO_TRAI Chuỗi 12 HO_PHAI Chuỗi 13 LO_GIOI_MO Số thực 14 LO_GIOI_CU Số thực 15 ID Số nguyên Định danh của con đường, là khóa chính Bảng 6.3.Bảng “duong” 110
- Chương 6. Cài đặt chương trình OpenGISServer • Bảng “quan” STT Tên cột Kiểu dữ liệu Ý nghĩa Kiểu Polygon (*), được lưu 1 geographicalshape Các điểm tạo nên trữ theo định dạng riêng đường viền xung quanh trong MySQL. phạm vi của quận. 2 DIENTICH Số thực Diện tích của quận 3 CHUVI Số thực Chu vi của quận 4 TENQUAN Chuỗi Tên quận 5 ID Số nguyên Định danh của quận, là khóa chính Bảng 6.4.Bảng “quan” Bảng “song” STT Tên cột Kiểu dữ liệu Ý nghĩa Kiểu Polygon (*), được lưu 1 geographicalshape Các điểm tạo nên trữ theo định dạng riêng đường viền xung quanh trong MySQL. phạm vi của sông 2 DIENTICH Số thực Diện tích của sông 3 CHUVI Số thực Chu vi của sông 4 TENSONG Chuỗi Tên sông 5 ID Số nguyên Định danh của sông, là khóa chính Bảng 6.5.Bảng “song” 111
- Chương 6. Cài đặt chương trình OpenGISServer Bảng “tuyensinh” STT Tên cột Kiểu dữ liệu Ý nghĩa Kiểu Point(*), được lưu trữ 1 geographicalshape Là 1 điểm cho biết tọa theo định dạng riêng trong độ của đối tượng trên MySQL. bản đồ 2 TEN Chuỗi Tên trường 3 THUOC Chuỗi Quận mà trường này thuộc về 4 DIACHI Chuỗi Địa chỉ của trường. 5 DIENTHOAI Chuỗi Số điện thoại của trường 6 PHUONG Chuỗi Phường mà trường này thuộc về 7 MOTA Chuỗi Mô tả về trường 8 ID Số nguyên Định danh trường, là khóa chính Bảng 6.6.Bảng “tuyensinh” 112
- Chương 6. Cài đặt chương trình OpenGISServer Bảng ypagesit STT Tên cột Kiểu dữ liệu Ý nghĩa Kiểu Point(*), được lưu trữ 1 geographicalshape Là 1 điểm cho biết tọa theo định dạng riêng trong độ của công ty hoặc tổ MySQL. chức trên thành phố 2 NAME Chuỗi Tên công ty, tổ chức 3 S_NAME Chuỗi Tên viết tắt 4 S_TYPE Chuỗi Loại dịch vụ cung cấp 5 S_EXTADDR Chuỗi Địa chỉ 6 S_NUMBER Chuỗi Đường số 7 S_STREET Chuỗi Tên đường 8 S_WARD Chuỗi Phường 9 S_DISTRICT Chuỗi Quận 10 S_PHONE Chuỗi Số điện thoại 11 S_FAX Chuỗi FAX 12 S_WEB Chuỗi WEB 13 S_EMAIL Chuỗi EMAIL 14 S_GTSL Chuỗi Giới thiệu 15 ID Số nguyên Định danh, là khóa chính Bảng 6.7.Bảng “ypagesit” Các loại Feature (FeatureType) trên Server: Mỗi loại Feature trên Server tương ứng với 1 bảng trong cơ sở dữ liệu. Cụ thể ta có các loại Feature sau: BachHoaTongHop, BaoTang, BenhVien, BenXe, BuuDien, Cho, Chua, DiaDanh, Duong, KhachSan, LanhSuQuan, NganHang, NhaTho, uan, SieuThi, Song, TruongCap3, TruongDaiHoc, TuyenSinh, UBNDQuan, YPageSit. 113
- Chương 6. Cài đặt chương trình OpenGISServer Các loại Feature: BachHoaTongHop, BaoTang, BenhVien, BenXe, BuuDien, Cho, Chua, DiaDanh, KhachSan, LanhSuQuan, NganHang, NhaTho, SieuThi, TruongCap3, TruongDaiHoc, UBNDQuan. Có cùng các thuộc tính và các kiểu dữ liệu cho các thuộc tính nên được nhóm chung vào cùng 1 nhóm gọi là loại Feature “nơi chốn”. Các thuộc tính và các kiểu dữ liệu của từng thuộc tính của các loại Feature này chính là các cột và các kiểu dữ liệu của các cột của bảng tương ứng. 6.3. Giao tiếp với client bằng giao thức HTTP Server hỗ trợ 2 giao thức để truyền và nhận dữ liệu từ client là HTTP GET và HTTP POST. 6.3.1. Nhận dữ liệu từ client bằng giao thức HTTP GET: Để lấy các tham số được gởi cùng với URL trong giao thức này ta dùng hàm sau: HttpContext.Current.Request[Tên tham số] Ví dụ: Đối với chuỗi URL: http://localhost/OpenGISServer/VNesOpenGISServer.aspx?SERVICE =WFS&VERSION=1.0.0 Để lấy được tham số SERVICE ta viết như sau: string s = HttpContext.Current.Request["SERVICE"]; Nếu tên tham số chỉ ra không có trong chuỗi URL thì hàm trả về null. 6.3.2. Nhận dữ liệu từ client bằng giao thức HTTP POST Đối với giao thức HTTP POST thì các dữ liệu do client gởi lên sẽ không được thêm vào cuối chuỗi URL mà được gởi trong phần body của request. Trong .NET, phần dữ liệu do client gởi lên được lưu trong thuộc tính InputStream của lớp Request, đây là 1 Stream. 114
- Chương 6. Cài đặt chương trình OpenGISServer HttpContext.Current.Request.InputStream. Ví dụ dưới đây lấy dữ liệu do client gởi lên, sử dụng lớp StreamReader để đọc dữ liệu từ Stream và chuyển từ Stream sang text để xử lí: Stream stream = Request.InputStream; StreamReader read = new StreamReader(stream); string sPostContent = read.ReadToEnd(); 6.3.3. Trả kết quả về cho Client Để trả chuỗi kết quả về cho client, ta dùng hàm Response.Write(s). Tuy nhiên, khi dùng hàm này để trả kết quả về cho client thì client không chỉ nhận được chuỗi s mà còn nhận được 1 chuỗi HTML đi kèm. Chuỗi HTML này gồm các tag dùng cho việc hiển thị trang web. Tuy nhiên, trong ứng dụng này thì chuỗi HTML này là không cần thiết. Để server đừng gởi thêm chuỗi HTML này, ta dùng hàm Response.End() ngay sau hàm Response.Write(s). Response.Write(sResponse); Response.End(); 6.4. Đọc dữ liệu từ chuỗi XML Để đọc dữ liệu từ chuỗi Xml ta có thể sử dụng các lớp sau: XmlDocument, XmlNode, XmlNodeList, XmlElement, XmlAttributes. 6.4.1. Ví dụ đọc 1 tài liệu Xml Xét chuỗi sRequestXml có nội dung như sau:
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Lotus Notes/Domino là gì?
8 p | 521 | 35
-
Những phím tắt tuyệt vời cho người dùng Chrome
7 p | 142 | 26
-
Vấn đề bảo mật trong ứng dụng Ajax
8 p | 137 | 22
-
GIỚI THIỆU PHẦN MỀM GIS gServer
3 p | 156 | 20
-
Ajax cho các nhà phát triển Java: Khảo sát bộ công cụ Web của Google Phát triển các ứng dụng Ajax từ một cơ sở mã Java
32 p | 111 | 19
-
10 cách hoàn thiện trang web
3 p | 118 | 16
-
Web cho ứng dụng GIS và xây dựng ứng dụng minh họa khai thác dịch vụ - 3
18 p | 88 | 12
-
Web cho ứng dụng GIS và xây dựng ứng dụng minh họa khai thác dịch vụ - 4
18 p | 80 | 10
-
Web cho ứng dụng GIS và xây dựng ứng dụng minh họa khai thác dịch vụ - 5
18 p | 78 | 10
-
Web cho ứng dụng GIS và xây dựng ứng dụng minh họa khai thác dịch vụ - 10
18 p | 85 | 10
-
Web cho ứng dụng GIS và xây dựng ứng dụng minh họa khai thác dịch vụ - 8
18 p | 67 | 10
-
Web cho ứng dụng GIS và xây dựng ứng dụng minh họa khai thác dịch vụ - 6
18 p | 74 | 9
-
Bài giảng Công nghệ Web và ứng dụng: Chương 4.2 - Nguyễn Minh Vi
24 p | 62 | 8
-
Xây dựng ứng dụng Web Based GIS cho hệ thống thông tin đất đai
7 p | 80 | 5
-
Bài giảng Phát triển ứng dụng web: Bài 8 - Lê Đình Thanh
27 p | 87 | 5
-
Nhúng SDK Java World Wind của NASA vào Eclipse Phát triển ứng dụng GIS với SDK nguồn mở này
12 p | 75 | 5
-
Wingram - Duyệt Instagram bằng ứng dụng Modern UI
5 p | 87 | 4
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn