2010-08-23 28 views
6

Đây là lần đầu tiên tôi sử dụng GeoDjango với postGIS. Sau khi cài đặt và một số thử nghiệm với mọi thứ chạy tốt, tôi lo ngại về hiệu năng truy vấn khi các hàng trong bảng sẽ tăng lên.Cần hiệu suất trên postGIS với GeoDjango

Tôi đang lưu trong một vĩ độ và vĩ độ điểm hình học mà tôi nhận được từ mã hóa địa lý của Google (WGS84 hoặc SRID 4326). Vấn đề của tôi là các hoạt động khoảng cách rất phổ biến trong ứng dụng của tôi. Tôi thường cần phải nhận được gần các điểm từ một mốc. Toán học hình học rất phức tạp, vì vậy ngay cả khi tôi có chỉ mục không gian, có thể sẽ mất quá nhiều thời gian trong tương lai có hơn 1000 điểm trong khu vực lân cận.

Vì vậy, có cách nào để chiếu loại hình học này để thực hiện các hoạt động khoảng cách nhanh hơn không? không ai biết một thư viện Django có thể làm cho một bản đồ Google có chứa một số những điểm này?

Bất kỳ lời khuyên nào về cách tăng tốc truy vấn không gian trên GeoDjango?

+1

Chỉ cần làm rõ, bạn có thực sự gặp sự cố về hiệu suất với PostGIS không? Nếu bạn chỉ lo lắng về những gì có thể xảy ra, hãy chống lại việc tối ưu hóa sớm! Mọi người có kết quả tốt với các truy vấn như của bạn bằng cách sử dụng các bảng có nhiều triệu bản ghi. Tìm hiểu thêm về truy vấn từ xa: http://www.bostongis.com/?content_name = postgis_tut02 # 21 – tcarobruce

+0

Vâng, tôi không chắc chắn tôi sẽ gọi tối ưu hóa sớm này (mặc dù tôi chưa có vấn đề về hiệu suất). Tôi chỉ đơn giản là cần biết GeoDjango sẽ được thử thách khi cần thiết. Tôi biết postGIS và cách cải thiện các truy vấn khoảng cách bằng cách sử dụng các hộp & & chồng lên nhau, nhưng ví dụ GeoDjango sử dụng tính năng này? Mặt khác, tôi không thực sự cầu kỳ với độ chính xác, vì vậy tôi không nên sử dụng hình học, vì nó có giá. – maraujop

Trả lời

0

Nói chung, GeoDjango sẽ tạo và sử dụng các chỉ mục không gian trên cột hình học khi thích hợp.

Đối với ứng dụng xử lý chủ yếu với khoảng cách giữa các điểm, Geography type (được giới thiệu trong PostGIS 1.5 và được hỗ trợ bởi GeoDjango) có thể phù hợp. GeoDjango cho biết nó mang lại "hiệu suất tốt hơn nhiều trên các truy vấn khoảng cách WGS84" [link].

+1

Điều đó đúng, như bạn có thể đọc trong http://docs.djangoproject.com/en/1.2/ref/contrib/gis/model-api/#spatial-index GeometryField.spatial_index -> Mặc định là True. Tạo chỉ mục không gian cho trường hình học đã cho. Django hỗ trợ loại địa lý kể từ phiên bản ổn định cuối cùng 1.2.1 nên nó khá mới. Trong tài liệu, bạn cũng có thể đọc: Do tính toán địa lý liên quan đến nhiều toán học hơn: http://docs.djangoproject.com/en/dev/ref/contrib/gis/model-api/#selecting-an-srid Vì vậy, những gì tôi hỏi là địa lý thực sự phù hợp? nó sẽ quy mô đúng cách? – maraujop

3

Nếu bạn có thể phù hợp với khu vực làm việc của bạn vào một phép chiếu bản đồ, điều đó sẽ luôn nhanh hơn, vì có ít cuộc gọi toán học cần thiết hơn cho những thứ như tính toán khoảng cách. Tuy nhiên, nếu bạn có dữ liệu thực sự toàn cầu, hãy hút nó: sử dụng địa lý. Nếu bạn chỉ có dữ liệu lục địa Hoa Kỳ, hãy sử dụng một số thông tin như EPSG: 2163 http://spatialreference.org/ref/epsg/2163/

Khu vực làm việc bị hạn chế càng nhiều, kết quả chính xác hơn bạn có thể nhận được trong bản đồ. Xem các dự báo mặt bằng của tiểu bang về các dự đoán chính xác, có độ ràng buộc cao đối với các khu vực trong khu vực ở Hoa Kỳ. Hoặc dự đoán UTM cho các vùng phụ cận lớn hơn.

+0

Tôi hiểu việc chiếu nhanh hơn, nhưng tôi đang quản lý geodata của Tây Ban Nha và không chắc chắn cách chuyển đổi, lưu trữ và xử lý nó trong GeoDjango. Đồng thời, không chắc liệu các điểm do Google cung cấp có nằm trong SRID 4326 hoặc EPSG 900913 – maraujop

+1

API Google trả về và tiêu thụ tọa độ trong EPSG: 4326 hay không. Đối với một hệ thống được chiếu ở Tây Ban Nha, hãy thử EPSG: 25831. –

2

Tôi đang nghiên cứu về chủ đề này. Theo như tôi đã tìm thấy, tọa độ mà bạn nhận được từ thư viện địa lý là ở định dạng SRID 4326, vì vậy bạn có thể lưu trữ chúng trong một kiểu trường hình học mà không có vấn đề gì. Đây sẽ là một ví dụ về một GeoDjango mô hình sử dụng hình học:

class Landmark(models.Model): 
    point = models.PointField(spatial_index = True, 
          srid = 4326, 
          geography = True) 

    objects = models.GeoManager() 

Bằng cách này, phải rất cẩn thận để vượt qua kinh độ/vĩ độ với PointField, theo thứ tự chính xác. geopy trả về vĩ độ/kinh độ, vì vậy bạn sẽ cần phải đảo ngược chúng.

Để chuyển đổi điểm trong một hệ toạ độ này sang hệ toạ độ khác, chúng tôi có thể sử dụng GEOS với GeoDjango. Trong ví dụ này tôi sẽ làm thay đổi một điểm trong 4326 để chiếu Google nổi tiếng 900.913:

from django.contrib.gis.geos import Point 
punto = Point(40,-3) 
punto.set_srid(900913) 
punto.transform(4326) 
punto.wkt 
Out[5]: 'POINT (0.0003593261136478 -0.0000269494585230)' 

Bằng cách này chúng ta có thể lưu trữ tọa độ trong hệ thống máy chiếu, trong đó sẽ có toán hiệu suất tốt hơn. Để hiển thị các điểm trong bản đồ Google trong giao diện trang web quản trị. Chúng ta có thể sử dụng this great article.

Tôi đã quyết định tiếp tục với các loại địa lý và tôi sẽ chuyển đổi chúng trong tương lai, trong trường hợp tôi cần cải thiện hiệu suất.

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