2010-12-29 3 views
3

비슷한 질문을 여러 번 물어 보았지만 그 중 아무 것도 내가 원하는 것을 정확히 알려주지 못했습니다. Windows Phone에서 Bing Map 컨트롤로 작업하고 있는데 확대/축소 변경으로 제대로 확장되는 타원을 추가하고 싶습니다. 폴리선과 폴리곤을 사용하여이 작업을 수행 할 수 있지만 MapShapeBase에서 파생 된 타원 유형은 없습니다. 나는 다양한 방법을 시도해 봤지만 픽셀 크기로 놀고 수학을 퍼지하여 지리적 좌표와 일렬로 정렬해야합니다. 센터와 x/y 크기를 미터로 사용하여 타원을 만들고 프레임 워크에서 나머지 작업을 수행하려고합니다. 너무 단순 해 보입니다. 나는 그것을 어딘가에 놓쳤는가? 내 다른 접근 방식은 폴리 라인에서 365 개의 선분을 그려내는 것입니다. 그러나 그것은 끔찍하게보기 흉하게 보이고 센터는 움직일 수 있기 때문에 모든 선분의 위치를 ​​묶어야합니다. 그것은 매우 무거운 것 같습니다. 다른 생각?크기 조정 된 맵 원 만들기

는 [구체적으로, 나는 현재 위치 주위에 원로 "GPS 정확도"표시를 추가 할.]

+0

AFAIK, API가 아무튼 (이것은 내가 약 3 미터 회색 원 사이에 표시되어있는 도로 사이에있다 확인할 수 있습니다, 내 집 옆) 위치 정확성을 나타내는 데이터를 반환합니다. 그렇게했다면 직경 2-5m의 원을 보더라도 훨씬 멀리 확대해야합니다. 대부분의 GPS 장치는 이것을 단순히 화면의 어딘가에 표시합니다. – Stonetip

답변

5

업데이트 망고에서

는 전화가 자동적으로 원을 보여줍니다.

orginal 한 포스트

그것은 매우 간단합니다. 드로잉을 할 때 압핀 컨트롤을 사용하면됩니다.

1) 컨트롤에 MapLayer을 추가

<maps:MapLayer> 
    <maps:MapPolygon Fill="Gray" 
         IsHitTestVisible="False" 
         Locations="{Binding AccuracyLocationCollection}" 
         Opacity="0.6" 
         Stroke="Black" 
         StrokeThickness="2" /> 
</maps:MapLayer> 

2)이 GeoCoordinateWatcher_PositionChanged 이벤트 처리기에서 당신의 ViewModel

public LocationCollection AccuracyLocationCollection 
{ 
    get; 
    set; 
} 

3)에서 AccuracyLocationCollection 속성을 추가, 원의 크기를 계산 , AccuracyLocationCollection에 값을 설정하십시오.

ViewModel.AccuracyLocationCollection = DrawMapsCircle(e.Position.Location); 

4) DrawMapsCircle의 코드는 다음과 같습니다 :

private static double ToRadian (double degrees) { return degrees * (Math.PI/180); }

private static double ToDegrees(double radians) 
{ 
    return radians * (180/Math.PI); 
} 

public static LocationCollection DrawMapsCircle(GeoCoordinate location) 
{ 
    double earthRadiusInMeters = 6367.0 * 1000.0; 
    var lat = ToRadian(location.Latitude); 
    var lng = ToRadian(location.Longitude); 
    var d = location.HorizontalAccuracy/earthRadiusInMeters; 

    var locations = new LocationCollection(); 

    for (var x = 0; x <= 360; x++) 
    { 
     var brng = ToRadian(x); 
     var latRadians = Math.Asin(Math.Sin(lat) * Math.Cos(d) + Math.Cos(lat) * Math.Sin(d) * Math.Cos(brng)); 
     var lngRadians = lng + Math.Atan2(Math.Sin(brng) * Math.Sin(d) * Math.Cos(lat), Math.Cos(d) - Math.Sin(lat) * Math.Sin(latRadians)); 

     locations.Add(new Location() 
     { 
      Latitude = ToDegrees(latRadians), 
      Longitude = ToDegrees(lngRadians) 
     }); 
    } 

    return locations; 
} 

결과 : '

Accuracy Circle

+0

꽤 괜찮아 보입니다. 360 포인트 폴리곤이 아닌 실제 타원을 만들 수 있다면 더 저렴할 것 같지만 얻을 수있는 것을 취할 것입니다. 감사! –

+0

기록을 위해 망고에 자동으로 표시되므로 자신의 코드를 작성할 필요가 없습니다. –

+0

@ ClausJørgensen : 저는 망고를 사용하고 있습니다. 정확성의 원이있는 것 같지 않습니다. 설정해야 할 매개 변수가 있습니까? –

관련 문제