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


Tạo kiểu hiển thị cho các đối tượng địa lý



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

Tạo kiểu hiển thị cho các đối tượng địa lý


Trong Geotools để tạo kiểu hiển thị cho dữ liệu địa lý ta phải tương tác với gói org.geotools.styling, dưới đây mô hình thể hiện mối liên hệ giữa các lớp trong gói:

Hình 3.10: Mô hình gói org.geotools.styling

Để tạo kiểu hiển thị cho đối tượng địa lý ta cần xác định kiểu của đối tượng địa lý được đọc lên từ file hình .shp là kiểu đường, kiểu vùng hay kiểu điểm mà sử dụng Style Builder kết hợp với việc tạo các kiểu dữ liệu tương ứng với công cụ hỗ trợ là các lớp trong gói styling. nếu kiểu đường dùng LineSymbolizer, kiểu vùng dùng PolygonSymbolizer, kiểu điểm dùng PointSymbolizer, kiểu Text dùng TextSymbolizer, kiểu ảnh Raster dùng RasterSymbolizer.

Các Symbolizer sau khi được tạo ra phải được tích hợp vào trong Style để tạo thành kiểu hiện thị thực sự của một lớp bản đồ. Một Style có thể chứa một hay nhiều Symbolizer chẳng hạn như khi hiển thị bản đồ phục vụ cho việc chiết xuất bản đồ ta phải xuất bản đồ ra màn hình vừa có hình ảnh của đối tượng địa lý vừa phải có một số thông tin thuộc tính của đối tượng chẳng hạn đối tượng đó tên gì, diện tích bao nhiêu… thì ta phải tạo ra hai Symbolizer, một Symbolizer phục vụ cho việc tạo kiểu bản đồ chẳng hạn như PolygonSymbolizer, một Symbolizer phục vụ cho việc lấy thông tin thuộc tính của đối tượng và hiện thị dưới dạng văn bản là TextSymbolizer, cả hai Symbolizer này sẽ cùng được tích hợp vào cùng một Style.


Hướng dẫn cách sử dụng các lớp Symbolizer

( Phần code trong phần hướng dẫn này được viết trong lớp MyStyle của chương trình.)

Để tạo ra các Symbolizer trước hết ta phải tạo ra StyleBuilder, nó đóng vai trò như một bộ máy tạo ra các kiểu thể hiện hiện.



StyleBuilder sb = new StyleBuilder();

  1. Kiểu điểm – lớp PointSymbolizer:

Khi nói đến kiểu điểm thì việc quan trong nhất trong cách thể hiện một điểm là hình ảnh thể hiện của điểm đó. Geotools cung cấp cho chúng ta một thư viện một số hình ảnh cơ bản nhưng đồng thời cũng cung cấp cách thể hiện một điểm thông qua các hình ảnh của người dùng đưa vào, các ảnh này phải có đuôi .jpg hay .png.

  • Cách thể hiển một điểm dựa vào các kiểu mặc định của Geotools:

Sử dụng kiểu hiện thị điểm với kích cỡ và hình ảnh được lấy từ thư viện mặc định của Geotools.

Hình 3.11 Các kiểu hiển thị điểm của geotools

Để tạo ra hình ảnh hiển thị từ thư viện mặc định của Geotools ta sử dụng đến lớp Mark, lớp này được tạo ra để chứa để chứa hình ảnh mặc định được người dùng cá nhân hóa thông qua cách lựa chọn các màu sắc.

Mark aMark = sb.createMark(styleDefault, fill, border, width);

StyleDefault dạng chuỗi nhận vào tên của hình ảnh muốn thể hiện trong lớp StyleBuilder. Cách sử dụng lớp StyleBuilder chấm gọi trực tiếp các thuộc tính static của lớp này. Chẳng hạn muốn sử dụng hình ảnh hiển thị của một điểm là hình ngôi sao ta dùng StyleBuilder.MARK_STAR.

Ngoài ra Geotools còn hỗ trợ cho ta tô màu các đối tượng hiển thị cơ bản thông qua các thông số fill, border,width. Fill màu nền bên trong của hình. Border là màu đường viền bao quanh hình. Width là độ dầy của đường viền.

Sau khi đã tạo ra đối tượng Mark, ta tạo ra đối tượng Graphic chứa đối tượng này bằng phương thức createGraphic của lớp StyleBuilder. Phương thức này có 3 thông số nhưng ta chi nhập thông số thứ 2 dành cho đối tượng Mark, còn hai thông số còn lại thông số 1 dành cho ExternalGraphic, thông sô thứ 3 dành cho Symbolizer nên ta để ở là null.

Graphic pGraphic = sb.createGraphic(null, aMark, null);

Cuối cùng để tạo thành kiểu PointSymbolizer phục vụ cho việc hiển thị kiểu điểm ta sử dụng phương thức createPointSymbolizer của StyleBuilder nhận vào đối tựơng Graphic đã được tao ở trên.

PointSymbolizer ps = sb.createPointSymbolizer(pGraphic);

Để tham khảo cách viết một cách cụ thể của kiểu điểm thì tham khảo đoạn code dưới đây.

public PointSymbolizer createDefaultPointSymbolizer(String styleDefault , Color fill,Color border, double width) {

Mark aMark = sb.createMark(styleDefault, fill, border, width);

Graphic pGraphic = sb.createGraphic(null, aMark, null);

return sb.createPointSymbolizer(pGraphic);

}


  • Đối với cách thể hiện một điểm như trên thì ta không thể chỉnh sửa được kích thước của hình ảnh thể hiện của điểm. Để cá nhân hóa luôn cả kích thước của hình ảnh hiển thị của điểm ta cùng thêm phương thức setSize() của lớp Graphic sau khi tạo ra nó. Tuy nhiên trong Geotools không phải khi setSize là ta nhập vào đó trực tiếp kích cỡ cần thay đổi mà phải thông qua Expression. Expression ở đây ta dùng là LiteralExpression dành cho các kiểu nhận vào dạng số học.

Để tạo ra LiteralExpression ta cần thông qua lớp FilterFactory, lớp này đóng vai trò như bộ lọc trong Geotools, nó hỗ trợ chủ yếu cho việc truy vấn trong Geotools(phần này sẽ được nói rõ hơn trong phần chứa năng mở rộng của Geotools) và tạo ra các Expression.

FilterFactory ff = FilterFactory.createFilterFactory();

Sau khi đã tạo ra FilterFactory, ta tiến hành các bước giống như cách làm ở trên nhưng trước khi tạo thành PointSymbolizer thì ta setSize của Graphic bằng cách:

pGraphic.setSize(ff.createLiteralExpression(size));



Để tham khảo cách viết một cách cụ thể của kiểu điểm thì tham khảo đoạn code dưới đây.

//Change size Mark

public PointSymbolizer createPointSymbolizer(String styleDefault,double size, Color fill,

Color border, double width) {

FilterFactory ff = FilterFactory.createFilterFactory();

Mark aMark = sb.createMark(styleDefault, fill, border, width);

Graphic pGraphic = sb.createGraphic(null, aMark, null);

pGraphic.setSize(ff.createLiteralExpression(size));

sb.createFill();



return sb.createPointSymbolizer(pGraphic);

}

Hình 3.12 Hiển thị lớp kiểu điểm của geotools



  • Cách thể hiện một điểm dựa vào các hình ảnh được người dùng đưa vào:

Trước nhu cầu cá nhân hóa cách hình ảnh hiển thị không chỉ dừng lại ở việc thay đổi màu sắc, kích thước của các đối tượng đã có sẵn của người dùng mà muốn thay luôn cả hình dạng của đối tượng hiển thị bằng các hình ảnh mà họ có, Geotools đưa ra lớp ExternalGraphic với mục đích hiển thị các hình ảnh nằm ngòai Geotools thành kiểu hiển thị của điểm độc đáo của người dùng.

Để tạo ra ExternalGraphic ta sử dụng phương thức createExternalGraphic() của StyleBuilder, phương thức này nhận vào đường dẫn đến file hình và một string đặc biệt được viết theo kiểu:

image/” + tên đuôi của file hình (png hay jpg)

Để tự động hóa hơn và tránh sai sót từ phía người dùng khi nhập đuôi của file ảnh vào phương thức tôi đã viết thêm phương thức hỗ trợ trong lớp ReadDataStoreFile của project với tên là getTypeOfFile(pathPicture).

ExternalGraphic icon = sb.createExternalGraphic(new File(pathPicture).toURL(), "image/"+ReadDataStoreFile.getTypeOfFile(pathPicture));

Khi tạo Graphic ta cũng sử dụng phương thức createGraphic() của StyleBuilder nhưng lại sử dụng createGraphic() với 5 thông số nhận vào để ta có thể chỉnh sửa kích cỡ của hình ảnh, lưu ý là kích cỡ ảnh ở đây là dạng pixel nếu nhận vào kích cỡ là 32 tức là 32 * 32 pixel, các kích cỡ thông dụng được hỗ trợ là 16, 32.

Graphic graphic = sb.createGraphic(icon,null,null,1,pixel,0);

Để tham khảo cách viết một cách cụ thể của kiểu điểm thì tham khảo đoạn code dưới đây.

//Default PointSymbolizer

public PointSymbolizer createCustomPointSymbolizer(String pathPicture, int pixel) throws MalformedURLException {

ExternalGraphic icon = sb.createExternalGraphic(new File(pathPicture).toURL(), "image/" + ReadDataStoreFile.getTypeOfFile(pathPicture));

Graphic graphic = sb.createGraphic(icon,null,null,1,pixel,0);

PointSymbolizer pSym = sb.createPointSymbolizer(graphic);

return pSym;



}

Hình 3.13 Hiển thị lớp kiểu điểm bằng hình ảnh bên ngoài

Để tham khảo cách viết một cách cụ thể của kiểu điểm thì tham khảo lớp MySymbolizer trong project. Và muốn rõ hơn về cách sử dụng của phương thức trên thì vào lớp LHa_UBXa trong project của đề tài để xem làm thế nào để hiển thị các ủy ban của huyện Lâm Hà.


  1. Kiểu đường – lớp LineSymbolizer:

Cách hiển thị kiểu đường cũng giống cách hiển thị kiểu điểm nhưng đơn giản hơn. Cách cách thể hiện như kiểu điểm cũng được dùng cho kiểu đường nhưng không được dùng phổ biến lắm nên tạm thời không đề cập ở đây.

Cách tạo kiểu đường đơn giản nhất và thường dùng nhất là sử dụng phương thức createLineSymbolizer() nậhn vào 2 thông số là màu sắc và độ dầy của đường.

Để tham khảo cách viết một cách cụ thể của kiểu điểm thì tham khảo đoạn code dưới đây.

public LineSymbolizer createLineSymbolizer(Color color, double width) {



return sb.createLineSymbolizer(color, width);

}

Hình 3.14 Hiển thị lớp kiểu đường

Để tham khảo cách viết một cách cụ thể của kiểu đường thì tham khảo lớp MySymbolizer trong project. Và muốn rõ hơn về cách sử dụng của phương thức trên thì vào lớp LHa_Song trong project của đề tài để xem làm thế nào để hiển thị các con sông của huyện Lâm Hà.


  1. Kiểu vùng – lớp PolygonSymbolizer:

Để hiển thị kiểu vùng cũng sử dụng lớp StyleBuilder gọi phương thức createPolygonSymbolizer(fill, border, width) với fill là màu nền, border là màu đường viền,width là độ dầy đường viền.

PolygonSymbolizer ps = sb.createPolygonSymbolizer(fill, border, width);

Đối với kiểu vùng người ta thường sử dụng kèm với độ trong, đục (Opacity) bằng cách hiệu chỉnh trực tiếp trên PolygonSymbolizer thông qua phương thức setOpacity(). Việc hiệu chỉnh này giúp cho khi xây dựng các lớp dữ liệu cùng kiểu vùng ta có thể nhìn xuyên qua.

Để tham khảo cách viết một cách cụ thể của kiểu điểm thì tham khảo đoạn code dưới đây.

//Polygon Symbolizer

public PolygonSymbolizer createPolygonSymbolizer(Color fill, Color border, double width, double opacity) {

PolygonSymbolizer ps = sb.createPolygonSymbolizer(fill, border, width);

ps.getFill().setOpacity(sb.literalExpression(opacity));



return ps;

}

Hình 3.15: Hiển thị lớp kiểu vùng

Để tham khảo cách viết một cách cụ thể của kiểu vùng thì tham khảo lớp MySymbolizer trong project. Và muốn rõ hơn về cách sử dụng của phương thức trên thì vào lớp LHa_RGHC trong project của đề tài để xem làm thế nào để hiển thị ranh giới giữa các xã của huyện Lâm Hà.


  1. Kiểu text – lớp TextSymbolizer:

Thực ra kiểu text không là một kiểu thể hiện của đối tượng bản đồ, nó được xây dựng chỉ với mục đích hiển thị thông tin thuộc tính của đối tượng địa lý lên trên lớp bản đồ để phục vụ cho việc chiết xuất bản đồ.

Cách sử dụng lớp TextSymolizer cần ta phải xác định một số thông số cơ bản như kiểu chữ thể hiện, màu sắc của chữ, tên cột dữ liệu cần lấy thông tin. Lưu ý cho dù trong bảng thông tin dữ liệu thuộc tính của đối tượng địa lý có các tên các cột được viết theo kiểu chữ thường hay kiểu có chữ cái đầu viết hoa thì khi viết tên cột cần lấy dữ liệu trong Geotools thì tên cột phải được viết hoàn toàn bằng chữ hoa.

ts = sb.createTextSymbolizer(colorText, font, columnData);

Để tham khảo cách viết một cách cụ thể của kiểu điểm thì tham khảo đoạn code dưới đây.

public TextSymbolizer createTextSymbolizer(Font fontText,Color color, String columnData){

org.geotools.styling.Font font = sb.createFont(fontText);

TextSymbolizer ts = null;

try {


ts = sb.createTextSymbolizer(colorText, font, columnData);

ts.setHalo(sb.createHalo(Color.WHITE, 1, 2));

return ts;

}

catch (Exception ex) {



throw new RuntimeException(ex.fillInStackTrace());

}

}



  1. Kiểu raster – lớp RasterSymbolizer:

Dữ liệu raster được lấy từ nhiều nguồn có thể sử dụng các công nghệ hiện địa như ảnh hàng không, ảnh viễn thám nhưng chúng không là dữ liệu bản đồ. Chúng ở khuôn dạng các đĩa từ, các tệp. Chúng thường mô tả các dữ liệu có tính chất thay đổi theo thời gian, thay đổi theo độ cao… chẳng hạn sự tahy đổi của thảm thực vật rừng…Các dữ liệu số không ở dạng điểm, dạng đường, dạng vùng thể hiện đối tượng thực tế mà chúng ở dạng ma trận điểm, mỗi điểm ảnh được gọi là pixel. Chính vì thế đọan code dưới đây chỉ nhằm minh họa cho chức năng hỗ trợ ảnh raster dưới định dạng .dem chứ không được sử dụng trong phần project minh họa của đề tài.

ColorMap cm =

sb.createColorMap(

new double[] { 1000, 1200, 1400, 1600, 2000 },

new Color[] {

new Color(0, 255, 0),

new Color(255, 255, 0),

new Color(255, 127, 0),

new Color(191, 127, 63),

new Color(255, 255, 255)},

ColorMap.TYPE_RAMP);

RasterSymbolizer rsDem = sb.createRasterSymbolizer(cm, 1);

Style demStyle = sb.createStyle(rsDem);

Cách tích hợp Symbolizer vào Style

Sau khi tạo ra các Symbolizer ta có thể dùng phương thức createStyle()của lớp StyleBuilder nhận vào thông số là Symbolizer vừa để tạo nên kiểu thực sự của đối tượng địa lý. Chúng ta sẽ thấy thật vô lý nếu như ta đã tạo ra Symbolizer rồi lại phải tạo ra Style chứa Symbolizer điều này thật là rắc rối. nhưng thực tế thì Style có nhiệm vụ riêng của nó. Nó có khả năng tích hợp được nhiều Symbolizer hay nói đơn giản Style là một tập hợp các Symbolizer. Đối với việc chiết xuất bản đồ thì đòi hỏi đối tượng được không chỉ được hiển thị mà còn phải hiển thị kèm với thông tin dữ liệu thuộc tính thì Style thật sự hữu ích.

Để sử dụng được Style chứa nhiều Symbolizer ta cần phải tạo ra Rule bằng cách dùng phương thức createRule() của lớp StyleBuilder nhận vào một mảng các Symbolizer.

Rule rules = sb.createRule(s);

Tạo Style thông qua phương thức createStyle()của lớp StyleBuilder không có thông số, sử dụng phương thức addFeatureTypeStyle() để gắn vào đó các Symbolizer.

public Style addRule(Symbolizer[] s){

Rule rules = sb.createRule(s);

Style style = sb.createStyle();

style.addFeatureTypeStyle(sb.createFeatureTypeStyle(null,rules));

return style;

}

Phương thức trên được viết trong lớp MySymbolizer của project mỗi lần để tao ra Style ta chỉ cần nhận vào một mảng Symbolizer. Nếu mảng Symbolizer chứa nhiều Symbolizer cùng một kiểu thì Symbolizer nào có được đứng trước trong mảng Symbolizer thì sẽ được hiển thị thành cái ở dưới cùng.



Chẳng hạn nếu ta tạo ra hai kiểu hiển thị cho sông bằng hai kiểu LineSymbolizer, kiểu 1 Symbolizer màu xanh , độ dày của đường là 2; kiểu 2 Symbolizer màu trắng , độ dày của đường là 1, kiểu 1 trước kiểu 2 trong mảng Symbolizer thì kết quả là con sông có màu trắng ở giữa, hai bên là màu xanh. Tạo kiểu hiện thị cho ủy ban xã huyện Lâm Hà kèm với thông tin tên ủy ban xã.

Hình 3.16 Bản đồ huyện Lâm Hà



  1. Xây dựng lại lớp bản đồ bằng Geotools: một lớp bản đồ (MapLayer, DefaultMapLayer) được tạo nên bởi dữ liệu về lớp bản đồ và kiểu thể hiện của nó.

  2. Quản lý các lớp bản đồ: một bản đồ được tạo nên bởi nhiều lớp bản đồ. Tập hợp các lớp bản đồ được liên kết với nhau nhờ vào lớp MapContext của Geotools.

Quản lý việc hiển thị bản đồ: từ tập hợp các lớp bản đồ được quản lý trong lớp MapContext Geotools cung cấp lớp StyledMapPane để chứa MapContext và quản lý việc hiển thị của bản đồ. StyledMapPane kết hợp với các lớp trong gói render hỗ trợ các chức năng cơ bản có sẵn của gói thư viện như phóng to, thu nhỏ, di chuyển bản đồ. StyledMapPane thực chất là một JComponent trong Java Swing chứa các lớp bản đồ nên để StyledMapPane có thể xuất hiện. sử dụng, tương tác được ta cần phải gắn nó vào JFrame, Applet, JApplet với sự hỗ trợ của chương trình JBuilder chạy tại máy tính cục bộ hoặc gắn vào Applet, JApplet đóng gói chạy tách biệt với JBuilder, sử dụng máy ảo Java. nếu chạy tại máy tính cục bộ

        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   ...   14   15   16   17   18   19   20   21   ...   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