2011-01-14 25 views
8

Làm cách nào để tôi có thể phóng to điều khiển Microsoft.Phone.Controls.Maps.Map về mức thu phóng chính xác trên Windows Phone 7?Làm thế nào để phóng to để phù hợp với WP7 Bing Maps kiểm soát bằng cách sử dụng LocationCollection?

Tôi có một LocationCollection của GeoCoordinates và tôi đã tự tính toán Trung tâm, nhưng bây giờ làm cách nào để tính toán mức thu phóng chính xác để phù hợp với LocationCollection?

P.S. Có một phương pháp hộp để tính toán trung tâm của GeoCoordinates vì ​​vậy tôi không phải tính toán bản thân mình?

EDIT: Tôi đã tìm thấy một giải pháp tốt: http://4mkmobile.com/2010/09/quick-tip-position-a-map-based-on-a-collection-of-pushpins/

map.SetView(LocationRect.CreateLocationRect(points));

Trả lời

8

Bạn có thể sử dụng đoạn mã sau để tính toán LocationRect rằng tiếp giáp một tập hợp các điểm, và sau đó vượt qua LocationRect đến SetView() phương pháp trên điều khiển bản đồ:

var bounds = new LocationRect(
    points.Max((p) => p.Latitude), 
    points.Min((p) => p.Longitude), 
    points.Min((p) => p.Latitude), 
    points.Max((p) => p.Longitude)); 
map.SetView(bounds);

Điều khiển bản đồ xử lý hoạt ảnh từ vị trí hiện tại sang vị trí mới vị trí.

LƯU Ý: Bạn sẽ cần một tuyên bố using cho System.Linq để nhận các phương thức MinMax.

+0

Vâng, đây là cách tôi đã làm. Hoạt động tốt. –

+3

Cảm ơn, tôi sẽ chấp nhận câu trả lời của bạn, tuy nhiên tôi đã tìm thấy một giải pháp tốt khác: map.SetView (LocationRect.CreateLocationRect (points)); // http://4mkmobile.com/2010/09/quick-tip-position-a-map-based-on-a-collection-of-pushpins/ – Buju

+0

Cảm ơn. Rất vui khi bạn tìm thấy một giải pháp. Tôi sẽ phải lưu ý rằng LocationRect giúp đỡ nhiều hơn tôi nghĩ :) –

1

Derek đã đưa ra câu trả lời để bạn nên chấp nhận câu trả lời của mình, tôi cung cấp mã thay thế cho các trường hợp có nhiều điểm. Cách tiếp cận này chỉ lặp lại việc thu thập điểm một lần thay vì 4 lần tuy nhiên nó không phải là như vậy asthetically lòng.

double north, west, south, west; 

north = south = points[0].Latitude; 
west = east = points[0].Longitude; 

foreach (var p in points.Skip(1)) 
{ 
    if (north < p.Latitude) north = p.Latitude; 
    if (west > p.Longitude) west = p.Longitude; 
    if (south > p.Latitude) south = p.Latitude; 
    if (east < p.Longitude) east = p.Longitude 
} 
map.SetView(new LocationRect(north, west, south, east)); 
+0

+1 .. và tôi sẽ không gọi đây là một tối ưu hóa sớm; Tôi muốn gọi câu trả lời được chấp nhận một sự xuống cấp sớm :-) –

0

Được đề xuất bởi các câu trả lời khác tôi sử dụng SetView với LocationRect.

Tuy nhiên tôi thấy rằng nó luôn tạo ra mức thu phóng thấp, vì chỉ sử dụng các giá trị số nguyên. Nếu ví dụ mức thu phóng hoàn hảo sẽ là 5.5, bạn sẽ nhận được 5.0. Để có được một vừa khít tôi tính toán một mức zoom mới từ TargetZoomLevelTargetBoundingRectangle:

viewRect = LocationRect.CreateLocationRect(coordinates); 
map.SetView(viewRect); 
double scale = map.TargetBoundingRectangle.Height/viewRect.Height; 
map.ZoomLevel = map.TargetZoomLevel + Math.Log(scale, 2); 

dụ này thiết lập mức độ phóng để phù hợp với chiều cao viewRect 's trên màn hình.

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