系列文章目录

一步一步手写GIS开源项目-(1)500行代码实现基础GIS展示功能

一步一步手写GIS开源项目-(2)地图平移缩放实现

项目github地址:https://github.com/HuHongYong/ATtuingMap

1. 地图平移

地图平移分为三步:

1鼠标按下-首先要取得鼠标按下地图的屏幕坐标,以及保存这时候的地图图片。

/// <summary>
/// 鼠标按下
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param> private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
//鼠标按下的屏幕坐标位置
_mousedrag = e.Location;
//鼠标按下,为了区分普通鼠标移动和鼠标按下移动
_mousedragging = true;
//当前地图 图片
_mousedragImg = pictureBox1.Image;
}

2鼠标移动-平移过程对上一步的地图图片进行切割,以模拟地图拖放效果。如图:

/// <summary>
/// 鼠标移动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
var point = Transform.MapToWorld(new PointF(e.X, e.Y), myMap);
label1.Text = $"坐标X:{point.X} Y:{point.Y}";
//拖动已有图像
if (_mousedragging)
{
Bitmap _dragImg1 = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(_dragImg1);
g.Clear(Color.Transparent); //图片裁剪
g.DrawImageUnscaled(_mousedragImg,
new System.Drawing.Point(e.Location.X - _mousedrag.X,
e.Location.Y - _mousedrag.Y));
g.Dispose();
pictureBox1.Image = _dragImg1;
}
}

3鼠标弹起-zoom地图缩放不变,只需重新定位地图中心点,对地图进行重新绘制。

/// <summary>
/// 鼠标弹起事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
//地图的新中心
System.Drawing.Point pnt = new System.Drawing.Point(pictureBox1.Width / + (_mousedrag.X - e.Location.X),
pictureBox1.Height / + (_mousedrag.Y - e.Location.Y));
//修改鼠标拖动后的地图中心空间坐标点
myMap.Center = Transform.MapToWorld(pnt, myMap);
pictureBox1.Image = myMap.GetMap();
//取消鼠标拖动
_mousedragging = false;
}

2.地图缩放

地图缩放比较难理解,这里我们以下图的例子为例,黑色边框为地图可视区域,红色矩形代表的地图上的一个矢量图形,这时候鼠标在左上角或者任意一点,如图1、2,

    

滚动鼠标滚轮对地图进行放大,这是展示不同鼠标点放大后的地图如图3、4

   

我们知道地图的两个核心要素为zoom和新的地图中心点坐标,zoom=zoom*缩放倍数,新的地图中心点坐标怎么算呢?我们可以通过第5、6图进行简单的转化便可以算出。

首先通过把地图中心点定位到鼠标点,鼠标点的空间坐标已经知道,可以从六张图中看出,鼠标点到未来中心点的紫色线是恒定的,那我们知道了未来中心点的屏幕坐标,便可以求出他的未来中心点的空间坐标。实现代码如下:

   

/// <summary>
/// 鼠标滚轮触发缩放地图事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MapImage_Wheel(object sender, MouseEventArgs e)
{
//重新定位鼠标位置为中心点
myMap.Center = Transform.MapToWorld(new System.Drawing.Point(e.X, e.Y), myMap);
//e.Delta常数,鼠标滚轮滚一下
double scale = (e.Delta / 120.0);
//缩放1.2倍
double scaleBase = + (2.0 / );
//重新设置zoom缩放等级
myMap.Zoom *= Math.Pow(scaleBase, scale); //如图第5、6中的未来中心点的屏幕坐标
int NewCenterX = (pictureBox1.Width / ) + ((pictureBox1.Width / ) - e.X);
int NewCenterY = (pictureBox1.Height / ) + ((pictureBox1.Height / ) - e.Y);
//修改鼠标缩放后的地图中心点空间坐标
myMap.Center = Transform.MapToWorld(new System.Drawing.Point(NewCenterX, NewCenterY), myMap);
pictureBox1.Image = myMap.GetMap();
}

3.总结

本节主要讲了一下地图的平移和缩放的实现,展示地图操作的最基础的操作功能,相信大家可以通过简单的代码理解到GIS最核心的展示功能,下一节主要讲一下shape文件中的.dbf属性文件的读取以及鼠标点击查询,敬请期待。

本节代码上传github,生成一个release,大家可以参考调试一下项目源码。

github项目地址:https://github.com/HuHongYong/ATtuingMap

作者:ATtuing

出处:http://www.cnblogs.com/ATtuing

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

一步一步手写GIS开源项目-(2)地图平移缩放实现的更多相关文章

  1. 一步一步手写GIS开源项目-(1)500行代码实现基础GIS展示功能

    1.开篇 大学毕业工作已经两年了,上学那会就很想研读一份开源GIS的源码,苦于自己知识和理解有限,而市面上也没有什么由浅入深讲解开源gis原理的书籍,大多都是开源项目简介以及项目的简单应用.对于初级程 ...

  2. pytorch 手写数字识别项目 增量式训练

    dataset.py ''' 准备数据集 ''' import torch from torch.utils.data import DataLoader from torchvision.datas ...

  3. js手写图片查看器(图片的缩放、旋转、拖拽)

    在做一次代码编辑任务中,要查看图片器.在时间允许的条件下,放弃了已经封装好的图片jq插件,现在自己手写js实现图片的缩放.旋转.推拽功能! 具体代码如下: <!DOCTYPE html> ...

  4. 深度学习之PyTorch实战(3)——实战手写数字识别

    上一节,我们已经学会了基于PyTorch深度学习框架高效,快捷的搭建一个神经网络,并对模型进行训练和对参数进行优化的方法,接下来让我们牛刀小试,基于PyTorch框架使用神经网络来解决一个关于手写数字 ...

  5. 如何把开源项目发布到Jcenter

    转载自:https://www.jianshu.com/p/f66972f0607a 首先我们应该注册一个JFrog Bintray的账号 Jfrog Bintray官网 这里我们可以注意到那个绿色的 ...

  6. 个人开源项目如何上传maven中央仓库

    最近在写一些开源项目,想把自己写的东西放到maven中央仓库,提供给更多的人使用.所以写这一篇文章,记录一下自研开源项目jar包上传同步maven中央仓库成功的整个过程,这其中还是有不少的坑的. 目录 ...

  7. C#.NET开源项目、机器学习、商务智能

    所以原谅我,不能把所有的都发上来,太杂了,反而不好. 1..NET时间周期处理组件 这个组件很小,主要是对时间日期,特别是处理时间间隔以及时间范围非常方便.虽然.NET自带了时间日期的部分功能,但可能 ...

  8. .NET跨平台:在Mac上跟着错误信息一步一步手写ASP.NET 5程序

    今天坐高铁时尝试了一种学习ASP.NET 5的笨方法,从空文件夹开始,根据运行dnx . kestrel命令的错误信息,一步一步写代码,直至将一个最简单的ASP.NET程序运行起来. 尝试的具体步骤如 ...

  9. 手写开源ORM框架介绍

    手写开源ORM框架介绍 简介 前段时间利用空闲时间,参照mybatis的基本思路手写了一个ORM框架.一直没有时间去补充相应的文档,现在正好抽时间去整理下.通过思路历程和代码注释,一方面重温下知识,另 ...

随机推荐

  1. 什么是 FOUC(无样式内容闪烁)?你如何来避免 FOUC?

    css引入了@import 或者存在多个style标签以及css文件在页面底部 使得css文件加载在html之后导致页面闪烁.花屏 用link加载css文件,放在head标签里面

  2. x64内核强删文件.

    目录 x64内核中强删文件的实现 一丶简介 1.步骤 2.Nt驱动代码 x64内核中强删文件的实现 一丶简介 说道删除文件.有各种各样的方法. 有ring3 也有ring0. 而且也有许多对抗的方法. ...

  3. 高斯混合模型(GMM)及MATLAB代码

    之前在学习中遇到高斯混合模型,卡了很长一段时间,在这里记下学习中的一些问题以及解决的方法.希望看到这篇文章的同学们对高斯混合模型能有一些基本的概念.全文不废话,直接上重点. 本文将从以下三个问题详解高 ...

  4. Markdown文字添加颜色

    转自:原文地址 添加红色 效果: 写法: $\color{red}{red}$ 添加绿色 效果: 写法: $\color{green}{green}$ 添加蓝色 效果: 写法: $\color{blu ...

  5. 【2019.11.27】SDN课程阅读作业(2)

    过去20年中可编程网络的发展可以分为几个阶段?每个阶段的贡献是什么? Making computer networks more programmable enables innovation in ...

  6. 027_MacOs上如何将多页word打印到一个页面上

    工作中需要把word的多页面内容打印到同一张A4纸,所以就想了办法,首先word导出到pdf. 然后使用MacOs默认的PDF阅读器进行多页打印. 操作如下: 文件-打印布局选择每张纸需要打印的页数左 ...

  7. 一文读懂ZooKeeper (转)

    什么是ZooKeeper ZooKeeper 是一个分布式的,开放源码的分布式应用程序协同服务.ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集 ...

  8. C++全排列 next_permutation

    全排列函数  next_permutation 这是C++的STL中专门用来排列的函数(可以自动处理存在重复数据集的排列问题) 使用时要加上头文件 #include <algorithm> ...

  9. Java环境配置-jdk和jre的安装

    java 是直接在 jdk 下就可以运行 jdk会自带jre 所以只需要下载jdk配置一下环境就可以了 一般编辑java是需要 myeclipse 也可以用 记事本TXT文档 或者用 notepad+ ...

  10. SQL查询优化思维即SQL子查询

    一. 什么叫子查询 定义及分类 子查询又称内部查询,而包含子查询的语句称之外部查询(又称主查询).所有的子查询可以分为两类,即相关子查询和非相关子查询. 非相关子查询是独立于外部查询的子查询,子查询总 ...