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


Hiển thị và tương tác với các lớp bản đồ theo tùy chọn của người dùng



tải về 5.55 Mb.
trang27/34
Chuyển đổi dữ liệu16.10.2017
Kích5.55 Mb.
#33732
1   ...   23   24   25   26   27   28   29   30   ...   34
Hiển thị và tương tác với các lớp bản đồ theo tùy chọn của người dùng

Trong các chức năng được Geotools hỗ trợ thì chức năng hiển thị và tương tác với các lớp bản đồ là quan trọng nhất và khó nhất vì nó là phần tác động đến hầu hết các chức năng trên.

Một bản đồ được tạo nên bởi nhiều lớp bản đồ thế nhưng mỗi lần người dùng chỉ có thể tương tác với một lớp dữ liệu, lớp đó được gọi là lớp active; các lớp còn lại có trong bản đồ gọi là lớp select.

Bản thân của lớp MapContext trong Geotools không có sự phân biệt đâu là lớp active, đâu là select. MapContext chỉ lưu trữ các lớp bản đồ dưới dạng một mảng, lớp đầu tiên ở vị trí số 0, tiếp đến lớp thứ 2 ở vị trí 1.v.v..Lớp cuối cùng là lớp trên cùng trên màn hình hiển thị. Nói bình dân là cách MapContext lưu trữ và hiển thị các lớp bản đồ giống việc chồng các cục gạch lên nhau. Cục gạch đầu được đánh số 0, cứ thế đánh số các cục gạch tiếp tục. Cuối cùng cái ta nhìn thấy đầu tiên là cục gạch trên cùng, muốn thao tác trên các cục gạch ở dưới thì phải tự chuyển nó lên trên cùng và dời các cục gạch khác xuống phía dưới.

Dựa vào hai dạng bản đồ là bản đồ chỉ để thao tác lấy dữ liệu và bản đồ dùng cho chiết xuất in ấn mà cách thức quản lý hiển thị và tương tác được đưa ra làm hai phần : phần bản đồ dạng thao tác dữ liệu và bản đồ dạng chiết xuất. Về mặt nguyên tắc chung của hai lọai bản đồ thì giống nhau là khi muốn thao tác trên một lớp thì đều phải đưa lớp dữ liệu lên trên cùng nhưng cách thức để thực hiện công việc đó thì bản đồ dạng chiết xuất khó hơn bản đồ dạng thao tác rất nhiều.

a) Bản đồ dạng thao tác dữ liệu:

Khái niệm: bản đồ dạng thao tác với dữ liệu là bản đồ thường không có màu sắc hoặc không quan trọng về phần màu sắc chỉ quan trọng đến dữ liệu của bản đồ. Một lớp chỉ dùng một màu để thể hiện không có sự thể hiện màu riêng biệt cho từng đối tượng địa lý trong lớp đó.



Bản đồ này thường được các chuyên gia GIS sử dụng để thao tác làm việc trên dữ liệu chứ ít được thấy trên Web do hạn chế không thể hiện được màu sắc khác nhau giữa các vùng. Chẳng hạn như đối với lớp dữ liệu là lọai đất thì khi người dùng nhìn vào không phân biệt được sự khác nhau của các màu đất, loại đất.

Hình 3.34. Bản đồ thao tác dữ liệu

Cách thức họat động của chức năng này trong chương trình:

Vùng bên cánh trái của khung hiển thị bản đồ là vùng để quản lý các lớp bản đồ. Vùng này sẽ quản lý thứ tự của các lớp tác động đến hiển thị bản đồ và thông tin chứa trong vùng 1 của phần chức năng tìm kiếm.

Khi người dùng chọn thêm vào một lớp dữ liệu thông qua sự kiện click vào checkbox của bên SelectMapLayer, một lớp bản đồ mới sẽ được thêm vào dưới lớp active, tức lớp đang được thao tác. Lớp này sẽ được hiển thị trong khung hiển thị của bản đồ.

Nếu ta chọn vào checkbox Active thì lớp bản đồ đó sẽ được đưa lên trên cùng cho người dùng thao tác đồng thời trong khung hiển thị bản đồ sẽ xuất hiện lớp được chọn active lên trên cùng trước lớp active trước đó. Bên cạnh đó các thuộc tính của lớp dữ liệu được chọn sẽ thay thế cho phần thuộc tính của lớp active cũ trong vùng 1 của chức năng tìm kiếm.

Cách thức thực hiện chức năng:

Để thực hiện chức năng này ta cần phải có sự tương tác qua lại giữa 2 lớp:



      • HandlerActiveMapLayer: quản lý chức năng active

      • HandlerSelectMapLayer: quản lý chức năng select

        1. Quản lý hành động select một lớp bản đồ:

Khi select là “true” ta thực hiện việc thêm một lớp bản đồ vào bản đồ hiện có và di chuyển nó lên vị trí ngay bên dưới vị trí của lớp active.

Để thực hiện được việc này ta tiến hành đối chiếu tên lớp bản đồ được chọn với lớp bản đồ đã được tạo sẵn trong chương trình và đưa vào bản đồ hiện tại.

Tùy theo từng trường hợp là có lớp highlight hay không có lớp highlight mà vị trí lớp được thêm vào sẽ được xác định. Nếu có lớp highlight thì lớp mới được thêm vào sẽ nằm dưới lớp highlight, lớp active. Còn nếu không thì lớp mới chỉ nằm dưới lớp active.

Cách thức thực hiện việc thêm một lớp bản đồ này giống như cách thức thêm một lớp bản đồ ở phần hướng dẫn tạo một bản đồ cơ bản nhưng nếu muốn hiểu rõ hơn ta có thể vào trong lớp HandlerSelectMapLayer.

Khi select là “false” ta thực hiện việc bỏ một lớp bản đồ ra khỏi bản đồ.

Lưu ý: là một lớp đang được chọn là active thì không thể bỏ được.

Để tạo bỏ đi một lớp bản đồ ta phải lấy tên của file dữ liệu tạo lên lớp bản đồ đó và dùng hàm removeLayer của MapContext bỏ đi các lớp dữ liệu bản đồ được tạo nên từ file .shp đó trong MapContext.

Hàm removeLayer nhận vào thông số là lớp bản đồ cần remove. Nhưng khi dùng hàm này ta không thể tái tạo lại một lớp dữ liệu bản đồ giống với bất kỳ một lớp bản đồ nào có trong kho lưu trữ của MapContext rồi yêu cầu MapContext bỏ đi lớp dữ liệu giống với lớp dữ liệu mà hàm removeLayer nhận vào vì MapContext không hiểu điều đó. Nó cho rằng lớp bản đồ bạn muốn remove chưa được add vào bản đồ và trả về -1. Do đó để remove một lớp bản đồ ta cần lấy chính lớp bản đồ trong trong chính MapContext để đưa vào hàm remove thông qua tên của file dữ liệu tạo nên lớp bản đồ đó.

Cách thực hiện như sau:

Từ tên của lớp bản đồ trên màn hình hiển thị được người dùng chọn ta ánh xa nó với tên của file dữ liệu tạo nên nó nhờ vào TreeMap được tạo ra từ hàm createStore() trong lớp NameLayerTreeMap của project.

Tiếp đến ta thực hiện remove lớp bản đồ thông qua hàm removeMap Layers trong lớp HandlerSelectMapLayer.



public void removeMapLayers(MapContext mc,

String dataStoreName){

MapLayer[] l = mc.getLayers();

for(int i=0 ; i

String name = l[i].getFeatureSource().getSchema(). getTypeName();

if(name.equalsIgnoreCase(dataStoreName)){

mapContext.removeLayer(l[i]);

}

}

}

        1. Quản lý hành động action một lớp bản đồ:

Đối với hành động của active ta chỉ kiểm tra lớp nào được chọn là active chứ không xác định việc một lớp đang được chọn active không được chọn active nữa. Vì trong bản đồ lúc nào cũng phải có một lớp active nên ta chỉ quan tâm đến hành động chọn active. Một active mới được chọn tương ứng với việc đưa lớp được chọn active lên trước lớp active cũ.

Khi một lớp được chọn active thì có 2 trường hợp xảy ra một là lớp bản đồ đó đã có trong bản đồ, hai là lớp bản đồ đó đã có trong chương trình.

Đối với lớp bản đồ được chọn trên màn hình hiển thị mà chưa có trong bản đồ thì ta phải tiến hành thêm lớp đó vào trong bản đồ rồi đưa nó lên trên cùng và sau lớp highlight nếu có.

Để tiến hành công việc này ta sử dụng đến hàm moveLayer của lớp MapContext. Hàm moveLayer này cũng nhận vào hai thông số là vị trí hiện tại của lớp bản đồ được chọn và vị trí mới của lớp bản đồ.

Đầu tiên khi người dùng tương tác chọn lớp active ta sẽ sử dụng ánh xạ tìm kiếm tên file .shp của lớp dữ liệu đó rồi dùng nó để xác định ra lớp được tạo ra bởi file đó rồi tiến hành di chuyển nó lên trên cùng.

Trong chương trình phần để di chuyển lớp được chọn active lên trên cùng được viết trong hàm moveFront trong lớp HandlerActiveMapLayer



public void moveFront(String dataStoreName,

MapLayer highlightLayer){

MapLayer[] l = mapContext.getLayers();

int topIndex = mapContext.getLayerCount()- 1;

for(int i=0 ; i

String name = l[i].getFeatureSource().getSchema().

getTypeName();

if(name.equalsIgnoreCase(dataStoreName)){

int currentIndex = mapContext.indexOf(l[i]);

if((mapContext.indexOf(highlightLayer))>= 0){

if (currentIndex != topIndex) {

mapContext.moveLayer(currentIndex, topIndex - 1);

}

}

else{

if (currentIndex != topIndex) {

mapContext.moveLayer(currentIndex, topIndex );

}

}

controlRight(l[i]);

}

}

b) Bản đồ dạng chiết xuất có màu:



Khái niệm: bản đồ dạng chiết xuất là bản đồ thường dùng cho in ấn. Bản đồ này khắc phục được nhược điểm của bản đồ dạng thao tác dữ liệu đưa ra cái nhìn trực quan hơn của bản đồ, cho thấy được sự khác biệt về màu sắc giữa các đối tượng của một lớp.

Bản đồ dạng chiết xuất thường được dùng trong WebGIS hơn là bản đồ dạng thao tác dữ liệu



Hình 3.35: Bản đồ có chiết xuất màu



Cách thức họat động của chức năng hiển thị và tương tác với các lớp bản đồ theo tùy chọn của người dùng trong bản đồ chiết xuất:

Về mặt giao diện và cách thức chức năng từng phần của giao diện cũng giống như bản đồ để thao tác với dữ liệu. Cái khác ở đây là khác về mặt thể hiện và quản lý các lớp bản đồ.



  1. Hiển thị mỗi đối tượng thuộc lớp bản đồ với các màu sắc khác biệt:

Điểm khác biệt giữa bản đồ chiết xuất và bản đồ thao tác dữ liệu là sự trực quan hơn trong cách thể hiện bản đồ, đặc biệt là các bản đồ chuyên đề chẳng hạn như bản đồ về các lọai đất…Thường các bản đồ chuyên đề thường có một chuẩn màu nhất định cần phải tuân theo, còn bản đồ dạng ranh giới hành chánh thì không có bất cứ qui định nào.

Trong Geotools một MapLayer chỉ có thể được tạo ra với một kiểu thể hiện nhất định nên tất cả các đối tượng địa lý sẽ trên cùng một lớp sẽ chỉ thể hiện được cùng một màu. Do đó muốn các đối tượng của 1 lớp bản đồ của bản đồ thao tác dữ liệu có màu sắc khác biệt thì mỗi đối tượng phải nằm trên một lớp.





Hình 3.36: Mô hình các lớp đối tượng

Do có hai cách thể hiện màu một sử dụng màu sắc tùy chọn không theo chuẩn dành cho lớp bản đồ ranh giới hành chánh, hai là bản đồ chuyên đề tuân theo chuẩn nên ta có hai cách hiển thị màu nâng cao tương ứng.



    1. Lớp bản đồ ranh giới hành chánh:

Do lớp bản đồ kiểu này màu sắc được tùy chọn nên tôi đưa ra hai phương pháp một là sử dùng màu ngẫu nhiên, hai là sử dụng màu từ mảng màu sắc người dùng nhập vào.

      • Màu sắc ngẫu nhiên:

private Color createRandomColor(){

Random r = new Random();

int red = r.nextInt(255);

int green = r.nextInt(255);

int blue = r.nextInt(255);

return new Color(red,green,blue);

}

public MapLayer[] displayDefaultDiffPolygon(){



try {

MySymbolizer ms = new MySymbolizer();

FeatureResults fsResult = fs.getFeatures();

FeatureReader reader = fsResult.reader();

MapLayer[] layerArrays = new MapLayer[fsResult.getCount()];

System.out.println(fsResult.getCount());

int i = 0;

while (reader.hasNext()) {

Feature feature = reader.next();

FeatureCollection fc = FeatureCollections.newCollection();

fc.add(feature);

Color c = this.createRandomColor();

System.out.println("color " + c);

PolygonSymbolizer ps = ms.createPolygonSymbolizer(c,

Color.BLACK,0,0.7);

Style s = ms.addRule(new Symbolizer[]{ps});

DefaultMapLayer l = new DefaultMapLayer(fc,s);

layerArrays[i] = l;

System.out.println("i =" +i);

i++;


}

return layerArrays;

}

catch (Exception ex) {



throw new RuntimeException(ex.fillInStackTrace());

}

}



      • Màu sắc theo người dùng tự quy định:

Sử dụng cách tương tự như trên nhưng ta đưa vào đó là một mảng màu sắc.

public MapLayer[] displayDefaultCustomPolygon(Color[] colors){

try {

MySymbolizer ms = new MySymbolizer();



FeatureResults fsResult = fs.getFeatures();

int countFeature = fsResult.getCount();

int countColor = colors.length;

MapLayer[] layerArrays = new MapLayer[countFeature];

int i =0;

if( countFeature == countColor){

FeatureReader reader = fsResult.reader();

while (reader.hasNext()) {

Feature feature = reader.next();

FeatureCollection fc = FeatureCollections.newCollection();

fc.add(feature);

PolygonSymbolizer ps = ms.createPolygonSymbolizer(

colors[i],

Color.BLACK, 0, 0.7);

Style s = ms.addRule(new Symbolizer[] {ps});

DefaultMapLayer l = new DefaultMapLayer(fc,s);

layerArrays[i] = l;

i++;


}

return layerArrays;

}

else{throw new RuntimeException("colors[] does not match with FeatureIterator[]");}



}

catch (Exception ex) {

throw new RuntimeException(ex.fillInStackTrace());

}

}



Lưu ý:

Để tạo mỗi đối tượng một màu ta phải lấy từng đối tượng ra sau đó lại bỏ vào FeatureCollection rồi mới tạo thành một lớp chứa một đối tượng được vì DefaultMapLayer không có constructor khởi tạo nào nhận vào 1 Feature và Style của nó cả.



    1. Lớp bản đồ chuyên đề:

Để hiển thị màu sắc theo từng vùng của bản đồ ta phải sử dụng chuẩn màu sắc nhất định, ở đây để hiển thị màu sắc khác nhau của từng loại đất ta dùng bảng màu đã được tạo từ phần màu sắc thể hiện của bản đồ ở trên.

/**


* Hien thi mau theo tung vung dat

*/

public MapLayer[] displayWithColorPallet(String columnName){



try {

MySymbolizer ms = new MySymbolizer();

FeatureResults fsResult = fs.getFeatures();

FeatureReader reader = fsResult.reader();

MapLayer[] layerArray = new MapLayer[fsResult.getCount()];

int i =0;

while (reader.hasNext()) {

Feature feature = reader.next();

String tenDat = (String)feature.getAttribute(columnName);

System.out.println(tenDat);

LandPallet pallet = new LandPallet();

Color c = pallet.exactlyFind_LandName(tenDat);

FeatureCollection fc = FeatureCollections.newCollection();

fc.add(feature);

PolygonSymbolizer ps = ms.createPolygonSymbolizer(c,

Color.BLACK,0,0.7);

Style s = ms.addRule(new Symbolizer[]{ps});

DefaultMapLayer l = new DefaultMapLayer(fc, s);

layerArray[i] = l;

i++;

}

return layerArray;



}

catch (Exception ex) {

throw new RuntimeException(ex.fillInStackTrace());

}

}



  1. Quản lý các lớp bản đồ:

Vấn đề đặt ra khi thao tác tìm kiếm thông tin, lấy dữ liệu của một đối tượng ta cần phải thao tác xác định lớp bản đồ đang ở trạng thái active. Nếu ta chỉ đơn thuần lấy từng đối tượng địa lý của shape file cho một kiểu hiện thị màu khác nhau thì khi đưa các lớp bản đồ được tạo ra từ cùng một file .shp lên ở chế độ active ta không thể thao tác với lớp dữ liệu nguyên mẫu từ shape file mà chỉ thao tác được với một đối tượng. Chẳng hạn như hình minh họa phía trên (phần hiển thị) khi lớp bản đồ được tạo từ file X.shp được chọn là active thì ở bên tất cả đối tượng cùng một màu sẽ có thể tìm kiếm , lấy thông tin của tất cả đối tượng trong shape file rất tốt trong khi đó nếu mỗi đối tượng một màu ta chỉ có thể lấy được thông tin của lớp trên cùng.

Để giải quyết vấn đề này ta cần tạo ra một lớp bản đồ chứa tất cả thông tin từ shape file nhưng không có màu sắc để lên trên cùng. Lớp này trong chương trình tôi tạm gọi là lớp blur. Khi thao tác trên một lớp active, lớp blur sẽ được để lên trên cùng trên các lớp thể hiện màu của từng đối tượng từ cùng 1 file .shp để khi lấy dữ liệu sẽ lấy trên lớp đó.





Hình 3.37 Giải pháp bảng màu

Do bây giờ khi thể hiện một file .shp ra bản đồ ta sử dụng rất nhiều lớp phụ trợ nên việc quản lý của nó cũng phức tạp hơn rất nhiều. Về cơ bản việc remove một loại các lớp bản đồ được tạo nên từ một file dữ liệu ta vẫn có thể sử dụng lại các hàm ở phần bản đồ thao tác dữ liệu. Nhưng phần thêm các lớp bản đồ vào bản đồ của HandlerSelectMapLayer và phần điều khiển active trong lớp HandlerActive MapLayer sẽ có sự thay đổi.

Bên phần thêm các lớp bản đồ có cùng file .shp vào bản đồ sẽ phải được viết để những lớp mới được thêm vào phải nằm ở phía dưới tất cả các lớp bản đồ của file .shp được chọn active và phía dưới lớp highlight nếu có. Do đó ta cần phải xác định được số lớp được tạo ra từ file .shp đang active để đặt lớp mới được select vào đúng vị trí. Để biết rõ hơn xin tham khảo trong lớp HandlerSelectMapLayer của project.

Phần lớp HandlerActiveMapLayer phải thực hiện việc di chuyển các lớp bản đồ được tạo từ file .shp được chọn lên trên cùng, dưới lớp highlight nếu có. Đặc biệt lưu ý là phải làm mọi cách để đưa lớp blur lên trên cùng trước các lớp thể hiện màu sắc. Trong chương trình thì để làm việc di chuyển lớp blur lên trên cùng ta sử dụng phương pháp so sánh tìm ra lớp Layer có nhiều đối tượng nhất đưa lên trên cùng. Để biết rõ hơn xin tham khảo trong lớp HandlerActiveMapLayer của project



      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   ...   23   24   25   26   27   28   29   30   ...   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