/// <summary> /// 設置行政區 /// </summary> /// <param name="district"></param> public void SetRegionData(District district) { // 分割區域 m_district = district; var lt = m_district.LeftTop.GetMercatorPoint(); var rb = m_district.RightBottom.GetMercatorPoint(); var zoom = lt.Zoom; while (((rb.GetTilePoint().X - lt.GetTilePoint().X) > 2) || ((lt.GetTilePoint().Y - rb.GetTilePoint().Y) > 2)) { zoom--; lt = lt.GetMercatorPoint(zoom); rb = rb.GetMercatorPoint(zoom); } // 加载瓦片 Tiles.Clear(); var tilePoint = lt.GetTilePoint(); Tiles.Add(new BitmapImage(new Uri(tilePoint.Address))); Tiles.Add(new BitmapImage(new Uri(tilePoint.Right.Address))); Tiles.Add(new BitmapImage(new Uri(tilePoint.Right.Right.Address))); Tiles.Add(new BitmapImage(new Uri(tilePoint.Bottom.Address))); Tiles.Add(new BitmapImage(new Uri(tilePoint.Bottom.Right.Address))); Tiles.Add(new BitmapImage(new Uri(tilePoint.Bottom.Right.Right.Address))); Tiles.Add(new BitmapImage(new Uri(tilePoint.Bottom.Bottom.Address))); Tiles.Add(new BitmapImage(new Uri(tilePoint.Bottom.Bottom.Right.Address))); Tiles.Add(new BitmapImage(new Uri(tilePoint.Bottom.Bottom.Right.Right.Address))); // 加载区域線段 var wrappers = new ConcurrentBag <MapLineWrapper>(); Parallel.ForEach(m_district.Regions, region => { var points = region.Points.Select(o => o.GetMercatorPoint(zoom)).ToList(); Parallel.For(0, points.Count - 1, index => { var point1 = new MapPointWrapper { X = points[index].X - tilePoint.X * 256, Y = tilePoint.Y * 256 - points[index].Y + 256 }; var point2 = new MapPointWrapper { X = points[index + 1].X - tilePoint.X * 256, Y = tilePoint.Y * 256 - points[index + 1].Y + 256 }; wrappers.Add(new MapLineWrapper(point1, point2)); }); }); RegionLines = new ObservableCollection <MapLineWrapper>(wrappers); }
/// <summary> /// 构造函数 /// </summary> public MapLineWrapper(MapPointWrapper p1, MapPointWrapper p2) { Point1 = p1; Point2 = p2; }