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


Bản đồ với các chức năng nâng cao



tải về 5.55 Mb.
trang23/34
Chuyển đổi dữ liệu16.10.2017
Kích5.55 Mb.
#33732
1   ...   19   20   21   22   23   24   25   26   ...   34

Bản đồ với các chức năng nâng cao

  1. Sử dụng Shape file

    1. Chức năng hiển thị

      1. Chức năng xem toàn cảnh bản đồ, phóng to, thu nhỏ

Một bản đồ thường có kích thước mặc định, để xem rõ một điểm một vị trí trên bản đồ đôi khi ta phải cần sử dụng đến chức năng phóng to thu nhỏ. Geotools cung cấp cho ta các chức năng đó thông qua việc xác định vị trí con trỏ chuột trên bản đồ tại vị trí cần phóng to, xác định vùng cần hiển thị phóng to hay thu nhỏ đưa nó thành vùng hiển thị thông qua hàm setVisibleArea(newArea) của lớp StyledMapPane.

Để dễ hiểu hơn ta có thể đặt mình ngồi trong một chiếc xe có 1 chiếc kính nhìn ra ngòai đường thì khung cảnh ngòai đường là bản đồ, còn khung cửa sổ là vùng hiển thị cố định của bản đồ. Xem toàn cảnh của bản đồ là đặt toàn bộ khung cảnh xung quanh (bản đồ) thu trọn vẹn vào ô cửa sổ(vùng hiển thị cố định). Phóng to là đưa vị trí, các vùng xung quanh vị trí được phóng to lên trên vùng hiển thị cố định với kích thước lớn hơn. Thu nhỏ là đưa vị trí, các vùng xung quanh vị trí được thu nhỏ lên trên vùng hiển thị cố định với kích thước bé hơn.


            1. Xem toàn cảnh bản đồ

Một bản đồ được tạo nên bởi nhiều lớp nên việc đưa tòan cảnh bản đồ vào vùng hiển thị cố định phải được tiến hành trên tất cả các lớp. Để thực hiện thao tác xem toàn cảnh bản đồ đầu tiên ta phải thao tác với lớp MapContext (lớp quản lý các lớp bản đồ) lấy vùng không gian bao quanh tất cả các lớp bản đồ thông qua phương thức getLayerBounds(). Phương thức này trả về đối tượng Envelope. Envelope giống như một bao thư chứa tất cả các lá thư có hình dạng khác nhau là các MapLayer.

Envelope mapArea = mapContext.getLayerBounds();

Sau đó, gán các giá trị tọa độ x,y, chiều rộng, độ dài sau khi được tính tóan trừ đi phần để làm khung viền xung quanh bản đồ, trong project thì chọn khung viền là 5% vào Rectangle2D.

Cuối cùng gán lại giá trị mới cho vùng hiển thị bằng hình chữ nhật bao quanh tất cả các lớp bản đồ nhờ vào phương thức setVisibleArea() của lớp StyledMapPane quản lý việc hiển thị của tất cả các lớp bản đồ.

public void reset(StyledMapPane mp,MapContext mapContext){

double border = 0.05;

try {

Envelope mapArea = mapContext.getLayerBounds();



double newWidth = mapArea.getWidth();

double newHeight = mapArea.getHeight();

double newX = mapArea.getMinX() - border * width;

double newY = mapArea.getMinY() - border * height;

Rectangle2D.Double newArea = new Rectangle2D.Double(newX, newY,

width + (width * 2 * border), height+ (height * 2 * border));

mp.setVisibleArea(newArea);

}

catch (IOException ex) {



throw new RuntimeException(ex.getMessage());

}

Phương thức trên được tìm thấy trong lớp MethodActionButtons trong project.


            1. Phóng to

Nếu như chức năng xem toàn cảnh bản đồ chỉ tác động đến toàn cảnh các lớp mà không quan tâm đến vị trí chuột trên bản đồ thì chức năng phóng to và thu nhỏ lại rất quan tâm đến vấn đề tọa độ, vị trí của con trỏ chuột.

Khi ta dùng chuột tác động trên một điểm trên bản đồ muốn phóng to lên thì Geotools thực hiện công việc đó qua các công đoạn sau.

Đầu tiên cho lớp JFrame hay lớp Applet, JApplet chứa khung hiển thị của bản đồ implements lớp MouseListener để có cá chức năng và phương thức hỗ trợ việc thực thi các sự kiện chuột. Tiếp đến ta sử dụng phương thức mouseClicked(MouseEvent e) để quản lý việc thực thi của click chuột đối với từng trạng thái của các nút trên thanh toolbar. Trong project mặc định của click chuột là phóng to.

Khi người dùng chọn vào nút Phóng to trên thanh toolbar, tiến hành click vào bất cứ vị trí nào trên vùng hiển thị bản đồ thì hàm mouseClicked() sẽ gọi đến phương thức setZoomIn() nhận vào vị trí chuột và lớp StyleMapPane quản lý việc hiển thị của các lớp nằm trong lớp MethodActionButtons của project.

Phương thức này được viết cũng dựa chung cách thức cơ bản để điều khiển hình ảnh của các lớp bản đồ trong khung hiển thị bản đồ là setVisibleArea() của lớp mapContext đã được đề cập ở phần trên nhưng có sử dụng thêm thông tin về tọa độ vị trí của con trỏ chuột trên bản đồ. Và tọa độ này phải được lấy từ đối tượng GeoMouseEvent của gói org.geotools.renderer.j2d thông qua việc ép kiểu đối tượng MouseEvent, sự kiện chuột thông thường của máy tính.

public void mouseClicked(MouseEvent e) {

Point2D pnt = null;

GeoMouseEvent ge = (GeoMouseEvent) e; // với e là MouseEvent

Point2D center = ge.getMapCoordinate(pnt);

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

int num = getToolInEffect();

switch(num){

case 1:

methods.setZoomOut(center,mp);



break;

case 2:


getInfoFeatureDefault(center);

break;


default:

methods.setZoomIn(center,mp);

}

Cách thức họat động của phương thức phóng to:



Xác định vùng cần phóng to xung quanh con trỏ chuột, vùng này phải có chiều rộng, chiều dài bé hơn n lần so với vùng hiển thị bản đồ.

Xác định lại vị trí bắt đầu của vùng hiển thị của bản đồ. Lấy tọa độ của con trỏ đưa lên làm tọa độ bắt đầu của vùng hiển thị bản đồ.



Vùng hiển thị mới của bản đồ được tái lập bởi vùng cần đựơc phóng to. Do vùng hiển thị của bản đồ cố định nên vùng cần được phóng to có chiều rộng, chiều dài bé hơn vùng hiển thị bao nhiêu lần thì vùng được phóng to sẽ lớn lên gấp bấy nhiêu lần. Để cụ thể hơn ta có thể xem hình dưới đây:

Hình 3.24: Thuật toán phóng to

Xem vùng hiển thị của bản đồ có kích thước cố định là hình chữ nhật lớn ABCD, hình chữ nhật nhỏ A1B1C1D1 là vùng cần phóng to, là điểm E là điểm click chuột.

Đầu tiên ta có hình chữ nhật ABCD và điểm E ở bât cứ đâu trong hình chữ nhật. Ta cần xác định hình chữ nhật A1B1C1D1

Sau khi click chuột tại E, ta tính được chiều dài, chiều rộng của vùng cần phóng to nhỏ hơn n lần so với chiều dài, chiều rộng hình chữ nhật ABCD.

A1B1 = AB / n lần

A1D1 = AD / n lần

Dựa vào tọa độ điểm E và chiều rộng, chiều dài của hình A1B1C1D1 ta tính được tọa độ của điểm A1 sao cho E nằm chính giữa hình A1B1C1D1 .



x1 = p1 - A1B1 / 2

y1 = p2 - A1B1 / 2

Cuối cùng thực hiện kéo dãn hình A1B1C1D cho bằng với khung chữ nhật ABCD



A1 = A

weight = n lần * A1B1

height = n lần * A1D1

Để biết rõ hơn về phương thức phóng to xin đọc đọan code dưới đây hoặc xem trực tiếp trong lớp MethodActionButtons của project.

public void setZoomIn(Point2D point,StyledMapPane mp){

Rectangle2D vizArea = mp.getVisibleArea();

double width = vizArea.getWidth()/ZOOMIN_FACTOR;

double height = vizArea.getHeight()/ZOOMIN_FACTOR;

double x = point.getX() - (0.5*width);

double y = point.getY() - (0.5*height);

Rectangle2D newArea = new Rectangle2D.Double(x,y,width,height);

mp.setVisibleArea(newArea);



}
            1. Thu nhỏ

Chức năng thu nhỏ cũng được viết tương tự như chức năng phóng to nhưng vùng bản đồ cần được thu nhỏ sẽ có kích thước lớn gấp n vùng hiển thị bản đồ.

Hình 3.25: Thuật toán thu nhỏ

Xem vùng hiển thị của bản đồ có kích thước cố định là hình chữ nhật lớn ABCD, hình chữ nhật nhỏ A1B1C1D1 là vùng cần phóng to, là điểm E là điểm click chuột.

Đầu tiên ta có hình chữ nhật ABCD và điểm E ở bât cứ đâu trong hình chữ nhật. Ta cần xác định hình chữ nhật A1B1C1D1

Sau khi click chuột tại E, ta tính được chiều dài, chiều rộng của vùng cần thu nhỏ hơn n lần so với chiều dài, chiều rộng hình chữ nhật ABCD.

A1B1 = AB * n lần

A1D1 = AD * n lần

Dựa vào tọa độ điểm E và chiều rộng, chiều dài của hình A1B1C1D1 ta tính được tọa độ của điểm A1 sao cho E nằm chính giữa hình A1B1C1D1 .



x1 = p1 - A1B1 / 2

y1 = p2 - A1B1 / 2

Cuối cùng thực hiện thu hình A1B1C1D cho bằng với khung chữ nhật ABCD



A1 = A

weight = A1B1 / n lần

height = A1D1 / n lần

Để biết rõ hơn về phương thức phóng to xin đọc đọan code dưới đây hoặc xem trực tiếp trong lớp MethodActionButtons của project.

public void setZoomOut(Point2D point,StyledMapPane mp){

Rectangle2D vizArea = mp.getVisibleArea();

double width = vizArea.getWidth()* ZOOMOUT_FACTOR;

double height = vizArea.getHeight()* ZOOMOUT_FACTOR;

double x = point.getX() - (0.5*width);

double y = point.getY() - (0.5*height);

Rectangle2D newArea = new Rectangle2D.Double(x,y,width,height);

mp.setVisibleArea(newArea);

}


        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   ...   19   20   21   22   23   24   25   26   ...   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