2010-03-26 35 views
31

Tôi đang cố gắng tải một loạt các cặp vĩ độ/kinh độ vào một loại địa lý PostGIS để có thể truy vấn theo vị trí.Làm cách nào để chuyển đổi cặp vĩ độ/kinh độ thành loại địa lý PostGIS?

Đặc biệt tôi có một bảng với vĩ độ phao và cột kinh độ và một cột geography(Point, 4326). Tôi muốn làm

update mytable set geography = ??? 

Các tài liệu dường như gợi ý rằng những điều sau đây nên làm việc:

update mytable set geography = ST_GeogFromText('POINT(' || latitude || ' ' || 
                  longitude || ')'); 

Nó không. Tôi không biết những gì nó giải thích điểm này là ý nghĩa, nhưng nó chỉ cho phép kinh độ nằm giữa -90 và 90, vì vậy nó rõ ràng không phải là kinh độ.

Vì vậy, tôi phải làm gì?

+1

gửi email danh sách hoặc truy cập irc.freenode.net #postgis – dassouki

+0

Tôi đang ở #postgis. Nó im lặng. Gửi thư cho danh sách là cổng gọi tiếp theo của tôi. – DRMacIver

Trả lời

36

... thở dài. Sự ngu xuẩn của tôi. Dường như lệnh chính xác là kinh độ, vĩ độ. Tôi đã bị lừa khi nghĩ rằng cả hai tọa độ đều có cùng phạm vi (-180 đến 180) nên nghĩ một điều gì đó tinh tế hơn đang diễn ra.

+7

kinh độ, đặt hàng vĩ độ chắc chắn sẽ giới thiệu rất nhiều lỗi. – kbrock

+0

Đây vẫn là một câu trả lời khủng khiếp, và bạn nên chấp nhận lời khuyên của @MikeT với ST_MakePoint thay vì chuỗi nối mà giới thiệu các lỗi làm tròn. –

+2

Bạn có nghĩa là những người được thực hiện ba và bốn năm sau khi tôi đăng câu hỏi và lâu sau khi tôi không còn có vấn đề? – DRMacIver

5

Để thực hiện trao đổi giữa lat và lng bạn có thể sử dụng:

update mytable set geography = ST_GeographyFromText('SRID=4326;POINT(' || st_x(geom) || ' ' || st_y(geom) || ')'); 

có hoặc không có SRID.

+0

Phương pháp này sẽ có một số lỗi bị lỗi vòng lặp (tức là, 'float8' →' text' → 'float8'). Ngoài ra, 'ST_X' chỉ hoạt động trên các loại hình dạng' POINT'. –

7

Dưới đây là một số cách để làm cho các loại địa lý:

  1. Chuyển đổi số longlat cột để một loại geog địa lý:

    UPDATE mytable SET geog = ST_SetSRID(ST_MakePoint(long, lat), 4326)::geography 
    
  2. Chuyển đổi một cột geom hình học (SRID=4326) vào một geog loại địa lý sử dụng dàn diễn viên đơn giản:

    UPDATE mytable SET geog = geom::geography 
    
  3. Biến đổi một cột geom hình học dự kiến ​​một loại geog địa lý:

    UPDATE mytable SET geog = ST_Transform(geom, 4326)::geography 
    

Lưu ý rằng hai ví dụ cuối cùng làm việc trên bất kỳ loại hình học. Ngoài ra, việc chuyển đổi từ hình học thành địa lý thường là ngầm định, và các ví dụ này hoạt động mà không có ::geography, tuy nhiên các hành động rõ ràng thường là một thực tiễn tốt cho những điều này.

Các vấn đề liên quan