Khảo sát gói thư viện mã nguồn mở Geotools và ứng dụng hiện thực hệ thống thông tin địa lý trên nền Web


- Cách đọc dữ liệu từ một file .shp



tải về 5.55 Mb.
trang17/34
Chuyển đổi dữ liệu16.10.2017
Kích5.55 Mb.
#33732
1   ...   13   14   15   16   17   18   19   20   ...   34

- Cách đọc dữ liệu từ một file .shp


Có 2 cách đọc dữ liệu từ một file .shp:
Đọc dữ liệu phục vụ cho việc hiển thị tại máy tính cục bộ:

Khái quát: Tạo lớp ShapefileData nhận vào URL là địa chỉ file .shp, sử dụng phương thức getFeatureSource(tên của file .shp nhưng không có kèm đuôi shp) để lấy được FeatureSource, có thể dùng đường dẫn tuyệt đối lẫn đường dẫn tương đối để chỉ đường dẫn đến file .shp.

Cụ thể: Có 2 cách đọc dữ liệu từ một file .shp

Cách 1:

Nhập trực tiếp phần tên của file .shp. Cách này thường được dùng đối với những người mới bắt đầu với mục đích test thử phương thức của chương trình.

Tạo đường dẫn URL đến vị trí file .shp trên máy tính cục bộ :

URL shapeURL = (new File(path)).toURL();

Tạo ShapefileDataStore từ URL:



ShapefileDataStore store = new ShapefileDataStore(shapeURL);

Tạo FeatureSource:



FeatureSource source = store.getFeatureSource (name);



Cách 2:

Sử dụng phương thức phụ trợ được viết bởi Java để lấy phần tên của file .shp. Để tự động hóa hơn và tránh sai sót từ phía người dùng ta có thể dùng ta có thể viết thêm một số phương thức. Trong phạm vi đề tài này tôi có viết 2 phương thức phục vụ cho vấn đề này: phương thức chính là phương thức getFeatureSourceFromDataStore_C2(String path), phương thức phụ hỗ trợ việc lấy phần tên của file .shp là phương thức getName(String URLDataStore) cả hai phương thức này đều nằm trong lớp ReadDataStoreFile trong project.

private static String getName(String URLDataStore){

String fullfileName = URLDataStore.split("/")[URLDataStore .split("/"). length -1] ;

String fileName = fullfileName.substring(0,fullfileName.length() - 4);

String typeFile = fullfileName.substring(fullfileName.length()-3,

fullfileName.length());

if(typeFile.equals("shp")){

return fileName;

}

else


return "The File isn't .shp "; }

public static FeatureSource getFeatureSourceFromDataStore_C2(String path){

try {

URL URL_Path = (new File(path)).toURL();



ShapefileDataStore ds = new ShapefileDataStore(URL_Path);

FeatureSource fs = ds.getFeatureSource(ReadDataStoreFile.getFeatureSource(path));

return fs;

}

catch (Exception ex) {



throw new RuntimeException(ex.getMessage());

}

}



Cách 3:

Sử dụng phương thức getTypeName() để lấy phần tên của file .SHP. Đây là cách hiệu quả nhất và tốt nhất vừa khỏi viết thêm phương thức vừa dễ dàng tiếp cận, lại tránh được sai phạm từ phía người dùng khi nhập phần tên của file .shp.

Để lấy phần tên của file .shp ta chỉ cần thêm vào 1 dòng

String name = store.getTypeNames()[0];



Ý nghĩa : phương thức getTypeNames() của ShapefileDataStore trả về String[ ] là tên các kiểu thể hiện của dữ liệu trong ShapefileDataStore. Ở đây ta dùng store.getTypeNames()[0] tức là lấy phần tử đầu tiên. Trong thực tế người ta thường lưu mỗi lớp dữ liệu bản đồ thành 1 file .shp nên String[] chỉ thường chứa một phần tử. Chẳng hạn như khi tạo lớp dữ liệu bản đồ về ranh giới giữa các quận của thành phố ta dùng các thể hiện là kiểu vùng lưu lại ta có file RGHC_region.shp thì lúc dùng store.getTypeNames() sẽ trả về một mảng String[ ] có một phần tử là RGHC_region .

Trong project, để thể hiện cách trên ta dùng phương thức getFeatureSourceFromDataStore_C1(String path) trong lớp ReadDataStoreFile.

public static FeatureSource getFeatureSourceFromDataStore_C1(String path){

try {


URL shapeURL = (new File(path)).toURL();

ShapefileDataStore store = new ShapefileDataStore(shapeURL);

String name = store.getTypeNames()[0];

FeatureSource source = store.getFeatureSource(name);

return source;

}

catch (Exception ex) {



throw new RuntimeException(ex.fillInStackTrace());

}

}


Đọc dữ liệu phục vụ cho việc đóng gói, hiển thị trên Web:

Khái quát: Khá giống với cách đọc file phục vụ cho việc chạy tại máy tính cục bộ nhưng khác ở chỗ là cách lấy URL từ đường dẫn đến file .shp và đường dẫn này bắt buột phải là đường dẫn tương đối.

Chi tiết: Ta viết thêm vào phương thức getResource(String path) nhận vào địa chỉ tương đối đến file .shp trả về địa chỉ URL của file.shp

private static URL getResource(String path) {

return ReadDataStoreFile.class.getClassLoader().getResource(path);

}

Sử dụng phương thức trên để truy cập địa chỉ URL của file .shp và cách thức lấy phần tên của file .shp giống như cách 3 của đọc file phục vụ cho máy tính cục bộ ta có phương thức getFeatureSourceFromDataStore_Web (String URLDataStore) trong lớp ReadDataStoreFile.



public static FeatureSource getFeatureSourceFromDataStore_Web(String URLDataStore){

try {


URL url = getResource(URLDataStore);

ShapefileDataStore ds = new ShapefileDataStore(url);

String name = ds.getTypeNames()[0];

FeatureSource fs = ds.getFeatureSource(name);

return fs;

}

catch (Exception ex) {



throw new RuntimeException();

}

}


        1. Thể hiện màu sắc của bản đồ


Để tạo nên một bản đồ ngoài những dữ liệu liên quan đến việc xây dựng bản đồ như dữ liệu không gian và dữ liệu địa lý thì màu sắc của bản đồ cũng rất quan trong vì nó quyết định là hình ảnh ta gọi là “bản đồ” có được mọi người xem là bản đồ hay không. Đối với những bản đồ ranh giới hành chánh ta có thể dùng nhiều màu sắc khác nhau để hiển thị từng vùng một cách tùy ý. Nhưng đối với các bản đồ chuyên đề như các loại đất chúng ta phải dùng đến các chuẩn màu đã được công nhận phù hợp với việc hiển thị đối tượng địa lý đó.

Nếu sử dụng các loại màu sắc do tùy ý người dùng thì ta sử dụng lớp Color của gói java.awt để tạo màu mình yêu thích bằng cách nhập vào các thông số R,G,B hay là gọi đến các màu có sẵn trong lớp Color để dùng.

Để tạo bản đồ một cách chuyên nghiệp ta cần phải tổ chức lưu trữ thông tin bản màu. Dưới đây là một số giải pháp đưa ra để giải quyết vần đề lưu trữ thông tin bản màu.

Để tạo một bản đồ ta cần phải tuân theo một chuẩn màu nhất định do một tổ chức nào đó định ra, ở Việt Nam tổ chức đó là Bộ Tài Nguyên và Môi Trường . Bảng qui định màu “Màu loại đất thể hiện trên bản đồ hiện trạng sử dụng đất và bản đồ qui hoạch sử dụng đất.(Bộ Tài Nguyên và Môi Trường)) được chúng tôi sử dụng tham khảo để thể hiện các giải pháp về lưu trữ thông tin và truy xuất thông tin về màu của bản đồ.

Giải quyết vấn đề bảng màu tôi đưa ra 3 giải pháp:


  1. Lưu trữ bảng màu dưới dạng file text.

  2. Lưu trữ bảng màu dưới dạng file cấu trúc.

  3. Lưu trữ bảng màu bằng cơ sở dữ liệu.



File Text

File Cấu Trúc

Cơ Sở Dữ Liệu

Bảng màu được lưu trữ dưới dạng file text bằng cách lưu tên của các lọai đất không có khoảng trắng, sau đó các thông tin về mã đất, thông số màu R, G, B cách nhau bằng 1 TAB.

Cách xử lý dữ liệu lưu trữ bằng file text. Dữ liệu được lấy lên thông qua FileReader…Dữ liệu lấy lên đều ở dạng String.



Bảng màu được lưu trữ dưới dạng file cấu trúc bằng cách lưu đối tượng lọai đất (mã đất, tên đất có khỏang trắng, R, G, B)từ trên mã Java xuống thành file .dat .

Cách xử lý dữ liệu lưu trữ bằng file cấu trúc, dữ liệu được lấy lên thông qua RandomAccessFile…Dữ liệu lấy lên là đối tượng lọai đất.



Bảng màu được lưu trữ dưới dạng cơ sở dữ liệu bằng cách xây dựng bảng màu loại đất bao gồm các cột mã đất, tên đất có khoảng trắng, R, G, B

Cách xử lý dữ liệu bằng cơ sở dữ liệu bằng cách thiết lập cầu nối jdbc với các hệ quản trị cơ sở dữ liệu, lấy các thông tin dứơi dạng String, int



Ưu điểm:

Cách lưu trữ này đơn giản và người dùng có thể dễ dàng thay đổi cập nhật thông tin bằng cách tác động vào file text.

Có thể đóng gói để chạy Applet.


Ưu điểm:

Cách lưu trữ này khắc phục được nhược điểm của của file text là các lưu trữ và truy xuất tốt các đối tượng chuỗi có khỏang trắng.

Dữ liệc đọc lên tử file cấu trúc là đối tượng không cần phải xây dựng lại đối được lúc đọc từ file cấu trúc lên.

Có thể đóng gói để chạy Applet.



Ưu điểm:

Cách lưu trữ này có khả năng truy xuất tìm kiếm phức tạp và update tốt.



Khuyết điểm:

  • Do là file text nên dữ liệu phải là dữ liệu đơn giản, không lưu trữ dạng đối tượng được. Lưu trữ tốt đối với các con số trong các bảng của môn xác xuất thông kê,….Lưu trữ không có hiệu quả đối với các String có khỏang trắng.



  • Ví dụ: Nếu ta lưu trữ bảng màu bằng file text mà tên loại đất được viết có khỏang trắng thì khi truy xuất dữ liệu ta sẽ gặp phải vấn đề khi file text được chương trình đọc lên sẽ trả về danh sách các dòng có trong text, để lấy được dữ liệu từng dòng ta lại dùng StringTokenizer với phương thức hasMoreTokens() và nextToken() để lấy từng phần của dòng. Nhưng mà hàm lại lấy các phần tử phân cách nhau bằng khỏang trắng nên nếu lúc đầu nếu ta viết file text tên đất có khỏang trắng thì ở đây khi đọc lên tên đất sẽ bị tách ra thành từng phần nhỏ chẳng hạn tên đất là Đất chuyên trồng lúa nước trong file text thì khi chương trình đọc lên sẽ là “Đất”, ”chuyên”, ”trồng”, ”lúa”, “nước”. Như vậy ứng với mỗi tên đất khác nhau sẽ có số lượng từ khác nhau dẫn đến không có khả năng đọc lên chính xác tên của từng loại đất khi dùng file text có tên loai đất có khỏang trắng.

Khuyết điểm:

  • Phải tạo dữ liệu trước từ trên Java rồi lưu xuống thành file cấu trúc.

  • Khả năng cập nhật dữ liệu kém.

Khuyết điểm:

Vì được lưu trữ bởi hệ quản trị cơ sở dữ liệu nên nó không thể đóng gói để chạy Applet được.




Bảng 3: So sánh các giải pháp cho bảng màu

Qua thực nghiệm và so sánh cùng với điều kiện thực tế là thể hiện trên nền Web chúng tôi đã chọn giải pháp file cấu trúc để hiện thực.



Hình 3.9 Mô hình UML bảng màu



CÁCH SỬ DỤNG BẢNG MÀU TRONG CHƯƠNG TRÌNH.

Để sử dụng màu từ bảng màu ta làm như sau:



  • Bước 1: Khởi tạo Bảng Màu Lọai Đất:

LandPallet bangmau = new LandPallet();

  • Bước 2: Gọi đến các phương thức trong bảng màu

Các phương thức có trong bảng màu:

    1. Hàm findColorByLandName(String tenDat) trả về Object. Đây là hàm chính.Chức năng của hàm là giúp ngừơi dùng có thể tìm kiếm các màu của lọai đất mình mong muốn. Hàm sẽ trả về Color nếu tên đất nhận vào là chính xác, trả về danh sách các LandColor có landName chứa chuỗi nhận vào. Nếu chuỗi nhận vào không có trong bất kỳ một landName nào hàm sẽ trả về Input string is invalid.

    2. Hàm absoluteFind_LandName(String tenDat) trả về List các LandColor. Chức năng của hàm: nhận vào tên đất trả về danh sách các LandColor có landName chứa tất cả các từ trong chuỗi nhận vào.

    3. Hàm List relativeFind_LandName(String tenDat) trả về List các LandColor. Chức năng của hàm: nhận vào tên đất trả về danh sách các LandColor có landName chứa 1  tất cả các từ trong chuỗi nhận vào.

    4. Hàm exactlyFind_LandName(String tenDat) trả về Color của đất thông qua tên đất, nếu không tìm thấy trả về null.

    5. Hàm exactlyFind_LandCode(String maDat) trả về Color của đất thông qua mã đất, nếu không tìm thấy trả về null.



        1. Каталог: data
          data -> HƯỚng dẫn càI ĐẶt và SỬ DỤng phần mềm tạo bài giảng e-learning
          data -> CỘng hòa xã HỘi chủ nghĩa việt nam độc lập Tự do Hạnh phúc
          data -> Qcvn 81: 2014/bgtvt
          data -> Trung taâm tin hoïC Ñhsp ñEÀ thi hoïc phaàn access
          data -> PHỤ LỤC 2 TỔng hợp danh mục tài liệu tham khảO
          data -> Công ty cổ phần Xây dựng Điện vneco3
          data -> Nghiên cứu một số đặc điểm
          data -> NHỮng đÓng góp mới của luậN Án tiến sĩ CẤP ĐẠi học huế Họ và tên ncs : Nguyễn Văn Tuấn
          data -> Mẫu 01/hc-sn-dn (Ban hành kèm theo Thông tư số 83/2007/tt-btc ngày 16/7/2007 của Bộ Tài chính) TỜ khai hiện trạng sử DỤng nhà, ĐẤt thuộc sở HỮu nhà NƯỚc và ĐỀ xuất phưƠng án xử LÝ

          tải về 5.55 Mb.

          Chia sẻ với bạn bè của bạn:
1   ...   13   14   15   16   17   18   19   20   ...   34




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương