1. 程式人生 > >在Gmap中“”變相“”實現按行政區劃邊界下載地圖

在Gmap中“”變相“”實現按行政區劃邊界下載地圖

        來到新的公司,剛開始學習Gmap沒幾天,考慮到以後的專案中地圖方面可能不再使用arcengine來開發,從而向開源gis入手,接到的第一項任務就是在gmap中實現地圖按照各地行政區劃下載,給了我一份wpf版本的gmap原始碼,我先用了一下,第一印象感覺就是個開源的離線地圖下載工具,下載的方式為按住alt選擇一塊矩形區域。

         由於做engine開發一年了,慣性的思維促使我想要實現這個功能,首先找到一份全國省市邊界的shp資料,以及建立一張省市關聯的行政區劃表來供使用者選擇地區,根據選擇的name去shp中查詢屬性欄位等於選擇選擇的name那一塊然後高亮顯示一下,然後將其轉為gmap的下載型別,在網上查了一天,看了很多例子也下了一些程式碼,似乎根本就沒法直接載入shp,然後繼續搜尋,一邊看原始碼,發現其繪製的下載區域其實是GMapPolygon,而GMapPolygon是很多PointLatLng合成,也就是熟悉的地理經緯度座標,一開始測試的時候我還是在winform版本下用的,而到了wpf版本則沒有了圖層這一概念,下面附上核心程式碼,傳入的引數為所選擇的省市名稱

 public void LoadDistrictPloygon(string province,string city)
      {
          string path="";
          StreamReader sr = null;
              if (city == "全部")
              {
                   path= @"d:\\china\\province\\" + province + ".txt";
              }
              else
              {
                   path = @"d:\\china\\city\\" + city + ".txt";
              }
              try
              {
                   sr = new StreamReader(path, Encoding.Default);
                   String line = sr.ReadLine();
                   //while (line != null)
                   //{
                   gmapPolygon = new GMapPolygon(null);
                   string[] latlng = line.Split(new char[] { ';' });

                   for (int i = 0; i < latlng.Length; i++)
                   {
                       PointLatLng pointss = new PointLatLng();
                       string[] data = latlng[i].Split(',');
                       double x = Convert.ToDouble(data[0]);
                       double y = Convert.ToDouble(data[1]);
                       pointss.Lat = y;
                       pointss.Lng = x;
                       gmapPolygon.AddPoint(pointss);
                   }
              }
              catch (Exception ex)
              {
                  MessageBox.Show("未找到該地區資料!");
                  return;
              }
             


              MainMap.Markers.Add(gmapPolygon);
              gmapPolygon.RegenerateShape(MainMap);

              _currentMapTool = MapTool.Default;
              startPoint = true;
          
         
         
      }