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 đồ.
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.
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.
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ả.
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());
}
}
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
Chia sẻ với bạn bè của bạn: