zoukankan      html  css  js  c++  java
  • Gmap离线地图下载功能

    行政区域下载地址

    http://datav.aliyun.com/tools/atlas/#&lat=30.332329214580188&lng=106.72278672066881&zoom=3.5

    自定义方法

    using GMap.NET;
    using GMap.NET.MapProviders;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Demo.WindowsPresentation.Windows
    {
       class MapDownloadHelper
       {
          public static List<GPoint> GetPointToDownload(List<PointLatLng> pointsAll, GMapProvider provider, int zoom)
          {
             List<GPoint> listReturn = new List<GPoint>();
             List<GPoint> listGPoints = pointsAll.Select(t => provider.Projection.FromPixelToTileXY(provider.Projection.FromLatLngToPixel(t, zoom))).ToList();
    
             long minX = listGPoints.Min(t => t.X);
             long maxX = listGPoints.Max(t => t.X);
    
             long minY = listGPoints.Min(t => t.Y);
             long maxY = listGPoints.Max(t => t.Y);
    
             List<long> listY = listGPoints.Select(t => t.Y).ToList();
             List<long> listX = listGPoints.Select(t => t.X).ToList();
    
             for (long x = minX; x <= maxX; x++)
             {
                for (long y = minY; y <= maxY; y++)
                {
                   if (PositionPnpoly(listY.Count, listY, listX, y, x))
                   {
                      listReturn.Add(new GPoint(x, y));
                   }
                }
             }
             return listReturn;
          }
    
    
          /// <summary>
          /// 判断当前位置是否在不规则形状里面
          /// </summary>
          /// <param name="nvert">不规则形状的定点数</param>
          /// <param name="vertx">当前x坐标</param>
          /// <param name="verty">当前y坐标</param>
          /// <param name="testx">不规则形状x坐标集合</param>
          /// <param name="testy">不规则形状y坐标集合</param>
          /// <returns></returns>
          private static bool PositionPnpoly(int nvert, List<long> vertx, List<long> verty, double testx, double testy)
          {
             int i, j, c = 0;
             for (i = 0, j = nvert - 1; i < nvert; j = i++)
             {
                if (((verty[i] > testy) != (verty[j] > testy)) && (testx < (vertx[j] - vertx[i]) * (testy - verty[i]) / (verty[j] - verty[i]) + vertx[i]))
                {
                   c = 1 + c; ;
                }
             }
             if (c % 2 == 0)
             {
                return false;
             }
             else
             {
                return true;
             }
          }
       }
    }

    使用自定义方法下载

    RectLatLng area = MainMap.SelectedArea;
            
                for (int i = (int)MainMap.Zoom; i <= MainMap.MaxZoom; i++)
                {
                   MessageBoxResult res = MessageBox.Show("是否下载第 " + i + " 层地图?", "消息提示", MessageBoxButton.YesNoCancel);
    
                   if (res == MessageBoxResult.Yes)
                   {
                      TilePrefetcher obj = new TilePrefetcher();
                      obj.Owner = this;
                      obj.ShowCompleteMessage = true;
                      var listdownload = MapDownloadHelper.GetPointToDownload(pointLatLngs, MainMap.MapProvider, i);
                      obj.Start(area, i, MainMap.MapProvider, 100, true, listdownload);
                   }
                   else if (res == MessageBoxResult.No)
                   {
                      continue;
                   }
                   else if (res == MessageBoxResult.Cancel)
                   {
                      break;
                   }
                }

    测试离线地图

    new Thread(() => GMaps.Instance.ImportFromGMDB(IMSSettings.Instance.GMapDataPath)).Start();
                mapControl.Manager.Mode = AccessMode.CacheOnly;
                mapControl.MapProvider = mapControl.MapProvider = m_mapOberationCollection.Where(x => x.Name == IMSConfigHelper.Instance.IMSConfiguration.GISParameters.GISMapName).ToList().FirstOrDefault().Value;
                mapControl.MinZoom = IMSConfigHelper.Instance.IMSConfiguration.GISParameters.GISMinZoom;  //最小缩放
                mapControl.MaxZoom = IMSConfigHelper.Instance.IMSConfiguration.GISParameters.GISMaxZoom; //最大缩放
                mapControl.Zoom = IMSConfigHelper.Instance.IMSConfiguration.GISParameters.GISZoom;     //当前缩放
                mapControl.ShowCenter = true; //显示中心十字点
                mapControl.DragButton = MouseButton.Right;
                mapControl.CacheLocation = IMSSettings.Instance.GMapDataFolder;
  • 相关阅读:
    微信助力活动表结构设计
    mysql的in查询分析
    PHP从数组中找到指定元素的位置
    Java程序使用Alpine Linux报错java.lang.NoClassDefFoundError: Could not initialize class org.xerial.snappy.Snappy解决
    Eclipse/Idea 代码格式化部分忽略
    修改Linux桌面高分屏下QT程序界面的缩放
    折腾linux随笔 之 关闭Budgie默认自动隐藏应用的菜单栏 与 Gnome系桌面应用菜单无内容解决
    Debian Buster 使用Lxde在界面中打开url提示错误解决
    Portainer容器可视化管理工具使用文档
    Lxde添加触摸板双击功能、防误触
  • 原文地址:https://www.cnblogs.com/dangnianxiaoqingxin/p/14011836.html
Copyright © 2011-2022 走看看