문제

제목이 주어 지므로 한 쌍의 좌표를 기반으로 시간대 (또는 아마도 UTC 오프셋)를 찾아야합니다. 다른 솔루션을 검색하고 있으며 몇 가지 웹 서비스가 있지만 오프라인에서 응용 프로그램에 액세스 할 수 있어야합니다. Timezones는 경도를 완전히 기반으로하지 않기 때문에 그렇게 쉽지 않은 것 같습니다 ...

나는 ESRI ShapeFile을 쿼리하는 것에 대해 전 세계와 그들의 시간대에 모든 나라를 포함하고 있지만 복잡한 것 같습니다. 그것이 해결책이어야한다면,이 기능을 제공하는 .NET 라이브러리를 알고 있습니까?

다른 팁

클라이언트 응용 프로그램으로 이것을 해결했습니다. 이 기술은 세계의 색상으로 구분 된 원통형지도를 만드는 것이었고, 각 시간대는 독특한 색상을 가지고 있습니다. Lat Lons는 그림 코디네이트로 변환되며 좌표의 색상을 읽은 다음 해당 색상의 시간대와 교차 참조됩니다.

그 짧은 설명은 내가 한 일이 아니라 아이디어를 얻습니다. 나는 실제로 몇 가지 사전을 채우고 그들로부터 조회했다. 첫 번째 표현은 2m의 리소스 파일을 채웠습니다 (지도를 처리 한 후 이진 데이터로 전환 한 후). 이론적 최대 오류 (적도 근처의 위도의 경우)는 약 15 마일이어야합니다. 불행히도 내 시작지도의 정확도는 +/- 100 마일과 비슷했습니다.

그래서 저는 프로젝트를 다시 만들고 있습니다. 나는 며칠 동안 더 정확하고 더 높은 레즈 맵을 만들었습니다. 며칠 더 끝나야합니다. 자원 파일은 "구피 영역"을 자원으로 만 선택하고 직접 계산할 수있는 세계의 90%를 수학적으로 계산하지 않는 한 약 20m 정도입니다 (대부분의 세계는 경도에서 수학적으로 도출 될 수 있음). 많은 사람들이 리소스 파일이 20m 이었지만 일부는 할 수 있다고 확신하지 못합니다. 어쨌든 관심이있는 것 같으면 여기에서 실행하는 데 필요한 코드를 게시하고 리소스 파일 하나를 공공 코드 사이트 중 하나입니다. 관심이없는 것 같으면 귀찮게하지 않을 것입니다.

약간의 반환을 위해, 앱에 필요한 코드는 단지 몇 줄에 불과하지만 리소스 파일은 크다 (O O가 줄어들면서 새 새로운 것은 22m를 실행하고있다). 또한 빠릅니다 (첫 번째 표현은 100m / sec). 파일로드가 필요하고 약간의 시간이 걸립니다. 2M 버전은 눈에 띄는 지연이 없었지만 22m는 아직 없을 수도 있습니다.

을 체크하다 TZ 데이터 베이스. 나는 그것이 이름을 시간대 (도시, 국가, EST 등)와 연관 시킨다는 것을 알고 있습니다. 그러나 나는 어딘가에 좌표에 대한 확장이 있다고 생각합니다.

테이블을 내보내려고했지만 내보내는 것은 불가능한 것 같습니다. geometry 텍스트 유형 .. 그러나 어쨌든 그렇게하기 어렵지 않았습니다. 몇 년 전에 Shapefile Manifold를 생산 한 Google이 필요합니다. 일부 프로그램을 사용하는 SQL Server 2008 .. 나는 Manifold를 사용했습니다 (Enterprise Edition 이상을 사용해야합니다). 그런 다음 다음 저장 프로 시저를 사용하여 데이터를 쿼리합니다.

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((-@Longitude + 7.5) / 15) AS Offset, NULL AS AreaI

National Waters가 매핑되지 않기 때문에 ShapeFile에는 문제가 있습니다. 이 문제를 해결하기 위해 @g.stbuffer ()를 사용했을 수도 있습니다.

이 솔루션은 새로운 공간 데이터 유형을 사용하여 ESRI ShapeFile을 SQL Server 2008로 내보내는 것이 었습니다.

누구든지 더 나은 솔루션이 있다면 자유롭게 게시하십시오!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top