2009-11-09 21 views
6

Khi tiêu đề infers tôi cần phải tìm một múi giờ (hoặc có lẽ chỉ là bù đắp UTC) dựa trên một cặp tọa độ. Tôi đã tìm kiếm các giải pháp khác nhau và có một số dịch vụ web ngoài đó nhưng tôi cần có thể truy cập vào ứng dụng ngoại tuyến. Vì múi giờ không hoàn toàn dựa trên kinh độ, dường như không dễ dàng ...TimeZone theo Tọa độ

Tôi mặc dù về việc truy vấn shapefile ESRI tôi đã chứa tất cả các quốc gia trên thế giới và múi giờ của họ, nhưng có vẻ như phức tạp. Nếu đó là giải pháp, bạn có biết thư viện .NET nào cung cấp chức năng này không?

+1

Xem thêm, [wiki cộng đồng này] (http://stackoverflow.com/q/16086962/634824) –

Trả lời

0

Bạn nói:

tôi mặc dù về truy vấn một shapefile ESRI Tôi đã chứa tất cả các nước trên thế giới và múi giờ của họ, nhưng có vẻ như loại phức tạp. Nếu đó là giải pháp, bạn có biết thư viện .NET nào cung cấp chức năng này không?

Có - chính xác là exists here.

2

Kiểm tra cơ sở dữ liệu tz. Tôi biết nó liên kết tên với múi giờ (như thành phố, quốc gia, EST, v.v.). Nhưng tôi tin rằng có một phần mở rộng cho các tọa độ ở đâu đó.

+0

Tôi đã thử cơ sở dữ liệu tz nhưng dường như không cung cấp hình dạng thực tế của múi giờ .. Các shapefile tôi đã có được từ http://www.manifold.net/download/freemaps.html mặc dù liên kết không hoạt động nữa. Có ai có kinh nghiệm với việc xác định (truy vấn) các đối tượng trong một shapefile theo tọa độ? – Morten

0

Giải pháp là xuất một shapefile ESRI sang SQL Server 2008 bằng cách sử dụng các kiểu dữ liệu không gian mới.

Nếu bất kỳ ai có giải pháp tốt hơn, vui lòng đăng bài!

0

Tôi đã cố gắng xuất bảng nhưng dường như không thể xuất geometry loại văn bản .. tuy nhiên không khó để thực hiện .. Bạn cần google shapefile Manifold được tạo vài năm Sau đó, bạn cần xuất dữ liệu đó sang SQL Server 2008 bằng một số chương trình .. Tôi đã sử dụng Manifold (nhớ sử dụng Enterprise Edition hoặc cao hơn) .. Sau đó, tôi truy vấn dữ liệu bằng cách sử dụng thủ tục được lưu trữ sau đây:

USE [MyDb] 
GO 
/****** Object: StoredProcedure [dbo].[GetTimeZone] Script Date: 11/18/2009 21:23:52 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[GetTimeZone] 
    @Latitude float, 
    @Longitude float 
AS 
    /* SET NOCOUNT ON */ 

DECLARE @g geometry 

/* Validation */ 
IF @Latitude > 90 OR @Latitude < -90 OR @Longitude > 180 OR @Longitude < -180 
    RAISERROR('Latitude or longitude out of range', 16, 1) 

IF @Latitude IS NULL OR @Longitude IS NULL 
    RAISERROR('Latitude or longitude cannot be null', 16, 1) 

SET @g = geometry::Point(@Longitude, @Latitude, 4326); 

IF EXISTS(SELECT * From TimeZones WHERE Shape.STContains(@g) = 1) 
    /* Point exists on map, get the info */ 
    SELECT Name, LocalSumme, Offset, AreaI FROM TimeZones WHERE Shape.STContains(@g) = 1 
ELSE 
    /* Point is an international water */ 
    IF(@Longitude >= 0) 
     SELECT NULL AS Name, NULL AS LocalSumme, FLOOR((@Longitude + 7.5)/15) AS Offset, NULL AS AreaI 
    ELSE 
     SELECT NULL AS Name, NULL AS LocalSumme, -FLOOR(([email protected] + 7.5)/15) AS Offset, NULL AS AreaI 

Có vấn đề trong shapefile vì vùng biển quốc gia không được lập bản đồ. Tôi có thể sử dụng @ g.STBuffer() để giải quyết vấn đề này ..

6

Tôi đã giải quyết vấn đề này với ứng dụng khách. Kỹ thuật này là tạo một bản đồ hình trụ màu của thế giới, mỗi múi giờ có một màu duy nhất. Lat-Lons được chuyển đổi thành các tọa độ hình ảnh và màu của tọa độ được đọc sau đó được tham chiếu chéo với múi giờ của màu đó.

Giải thích ngắn gọn đó không phải là chính xác những gì tôi đã làm nhưng nó có ý tưởng. Tôi thực sự cư một vài từ điển và đã tra cứu từ chúng. Lần hiển thị đầu tiên mất 2 triệu tệp tài nguyên để điền (sau khi tôi xử lý bản đồ của mình và biến nó thành dữ liệu nhị phân). Các lỗi tối đa lý thuyết (đối với các vĩ độ gần xích đạo) cần phải có được +/- khoảng 15 dặm. Đáng tiếc là chính xác bản đồ khởi đầu của tôi là giống như +/- 100 dặm.

Vì vậy, tôi đang làm lại dự án. Tôi đã tham gia vào nó vài ngày nay để tạo ra một bản đồ chính xác hơn và cao hơn về khủng hoảng. Một vài ngày nữa và nó nên được thực hiện. Tệp tài nguyên sẽ khoảng 20M trừ khi tôi chọn chỉ để tài nguyên "các khu vực ngốc nghếch" và tính toán 90% của thế giới có thể được tính toán trực tiếp (phần lớn thế giới có thể được tính toán từ kinh độ). Không chắc chắn nhiều người sẽ quan tâm rằng một tập tin tài nguyên là 20M nhưng một số có thể. Ở mức nào, nếu có vẻ là một số quan tâm, tôi sẽ cố gắng đăng mã cần thiết để chạy nó ở đây và tệp tài nguyên là một trong những trang mã nguồn công cộng. Nếu có vẻ không quan tâm, tôi sẽ không bận tâm.

Chỉ cần lặp lại một chút, mã cần thiết trong ứng dụng của bạn chỉ là một vài dòng, nhưng tệp tài nguyên lớn (w/o thu hẹp nó, tệp mới của tôi đang chạy 22M). Nó cũng nhanh (phiên đầu tiên chạy 100M/giây). Nó yêu cầu tải tệp và mất một chút thời gian. Phiên bản 2M không có sự chậm trễ đáng chú ý nhưng 22M có thể (chưa có).

+1

Cảm ơn, nó chắc chắn có vẻ thú vị. Tôi sẽ đánh giá cao nếu bạn có thể chia sẻ chúng tôi cho chúng tôi giải pháp của bạn. – Morten