Bản đồ Phạm vi Máy bay


10

Tôi muốn tạo một bản đồ (web), hiển thị phạm vi của Máy bay quanh một số sân bay.

Tôi đã cố gắng tính toán một bộ đệm với phạm vi của máy bay. Ở đây bạn có thể thấy kết quả ở đây .

Nhưng bây giờ tôi đã nhận ra rằng kết quả là sai vì máy bay không đi theo đường thẳng mà bay theo một đường cong vì nó ngắn hơn.

Có cách nào để tính toán phạm vi với đường cong ngắn hơn?

Câu trả lời:


20

Bạn có thể sử dụng thư viện proj4 để mô tả một vòng tròn bằng khoảng cách vòng tròn lớn.

Ví dụ: đây là bán kính 3000km từ Edinburgh, Tokyo, Cape Town và Quito trong wss84 / Equir chữ nhật. Chỉ có một mình mơ hồ là 'vòng', do nằm gần xích đạo. Tôi cũng đã thêm vào một dòng nói dày đặc ở góc phương vị 36 độ (khoảng NE)

nhập mô tả hình ảnh ở đây

Nếu chúng ta thay đổi thành một phép chiếu tương đương góc phương vị tập trung vào Edinburgh, bạn sẽ thấy bán kính xung quanh Edinburgh phân giải thành một vòng tròn ...

nhập mô tả hình ảnh ở đây

Trên Mercator (như ứng dụng web của bạn), bạn sẽ thấy nhiều biến dạng hơn khi bạn di chuyển ra khỏi đường xích đạo, nhưng bộ đệm có nhiều hình elip hơn.

nhập mô tả hình ảnh ở đây

Mã python sau đây thực hiện điều đó (yêu cầu pyproj và tạo hình )

import pyproj
from shapely.geometry import Polygon, MultiPoint, LineString
import math

def geodesicpointbuffer(longitude, latitude,
                        segments, distance_m,
                        geom_type=MultiPoint):
    """
    Creates a buffer in meters around a point given as long, lat in WGS84
    Uses the geodesic, so should be more accurate over larger distances

    :param longitude: center point longitude
    :param latitude: center point latitude
    :param segments: segments to approximate (more = smoother)
    :param distance_m: distance in meters
    :param geom_type: shapely type (e.g. Multipoint, Linestring, Polygon)
    :return: tuple (proj4 string, WKT of buffer geometry)
    """
    geodesic = pyproj.Geod(ellps='WGS84')
    coords = []
    for i in range(0, segments):
        angle = (360.0 / segments) * float(i)
        x1, y1, z1 = geodesic.fwd(lons=longitude,
                                  lats=latitude,
                                  az=angle,
                                  dist=distance_m,
                                  radians=False)
        coords.append((x1, y1))
        # makes a great circle for one spoke.
        if i==200:
            example = geodesic.npts(longitude,latitude,x1,y1,1000)
            coords2 = []
            for xx,yy in example:
                coords2.append((xx,yy))
            coords2.append((x1,y1)) # make sure we include endpoint ;-)
            flight = LineString(coords2)
            print(flight.wkt)

    ring = geom_type(coords)
    return "+init=EPSG:4326", ring.wkt


def main():
    # example : Cape Town. 3000km buffer.
    spec, wkt = geodesicpointbuffer(18.4637082653, -33.8496404007, 2000, 3000000.0, Polygon)
    print(spec)
    print(wkt)

if __name__ == "__main__":
    main()

Bạn có thể dán đầu ra WKT vào QGIS bằng cách sử dụng plugin QuickWKT hữu ích .

Bạn có thể sử dụng các phương pháp khác - như coneypylon đã đề cập, bạn có thể tạo một vòng tròn trên hình chiếu tương đương tùy chỉnh tính bằng mét, tập trung vào điểm bắt đầu của bạn. Mặc dù vậy, tôi thấy rằng đối với các khoảng cách lớn, một lỗi xuất hiện (chỉ một vài km ở 2000 km, nhưng đối với các khoảng cách liên lục địa, các lỗi này có thể tăng lên)

Từ bộ nhớ, plugin mmqgis cho phép đệm theo km. Tôi không chắc chắn nó sử dụng phương pháp nào, mặc dù.

Lưu ý rằng bạn có thể gặp vấn đề khi hiển thị đa giác trong QGIS vượt qua phản hạt nếu bạn bắt đầu ở Châu Á - ogr2ogr với tùy chọn -wrapdateline có thể giúp đỡ ở đây. Bạn có thể thấy đây không phải là vấn đề với openlayers / tờ rơi, IIRC họ cho phép kinh độ lớn hơn 180 và nhỏ hơn -180.

Có một bài viết hay về bộ đệm trắc địa ở đây trên blog esri .


8

Tùy thuộc vào nơi thông tin khoảng cách của bạn đến từ đâu, điều này có thể không quan trọng. Nếu bạn có một số đơn giản cho khoảng cách, khoảng cách sẽ giống nhau trên bất kỳ phép chiếu bản đồ nào cho thấy khoảng cách chính xác (không phải Mercator, hãy suy nghĩ khá nhiều bất kỳ phép chiếu "tương đương" nào, chẳng hạn như phép chiếu chính tả phương vị hoặc tương tự. như Lambert Conformal Conic sẽ làm một công việc khá hợp lý ở khoảng cách xa.). Nếu bạn tính toán và tạo bộ đệm trong phép chiếu cách đều, chúng sẽ chính xác (khá), xem tại đây về cách tính khoảng cách: Trợ giúp ArcGIS

Hãy chắc chắn đặt hệ tọa độ của lớp nằm trong một phép chiếu tương đương, không chỉ khung dữ liệu.

Sau khi tính toán, bộ đệm sẽ cong vênh tương ứng khi được đưa vào Web Mercator hoặc bất kỳ trình chiếu web nào khác mà bạn định sử dụng.

Theo như lý do tại sao các đường cong lại bị cong và tại sao điều này có thể tạo ra vấn đề:

Vấn đề chính là các tuyến máy bay trên một hình chiếu Mercator như cái này được hiển thị dưới dạng cong, như vậy:

Bản đồ đường bay của Canada

Đây là một vấn đề cơ bản với các bản đồ Mercator, vì chúng được dành cho điều hướng hải lý, trong đó các thuộc tính của các đường thẳng trên các hình chiếu này là có giá trị (một đường thẳng trên hình chiếu Mercator là một đường thẳng, một đường thẳng có cùng la bàn đi qua toàn bộ hành trình).

Tuy nhiên, các máy bay không bay trên các đường thẳng, vì hiệu quả nhiên liệu quan trọng hơn điều hướng đơn giản, và do đó bay dọc theo Vòng tròn lớn, xuất hiện dưới dạng các đường cong trên hình chiếu Mercator.


tiết kiệm nhiên liệu và đến đích càng nhanh càng tốt .
cffk

... đó là lý do tại sao đường dẫn thực tế sẽ đưa Jet Stream vào tài khoản.
Vince

2
Gall-Peters là hình chiếu diện tích bằng nhau không bằng nhau. Đối với bình đẳng, bạn muốn một cái gì đó giống như Phép chiếu Chính tả Azimuthal tập trung vào nguồn của bạn.
HeikkiVesanto

Vâng, tôi đã không suy nghĩ. Một phép chiếu phù hợp cũng sẽ thực hiện một công việc hợp lý trong việc giữ khoảng cách, yeah
coneypylon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.