精华内容
下载资源
问答
  • 导航地图是怎样绘制出来的?

    千次阅读 2015-11-17 11:57:37
    平常我们使用导航有两种情景:一种使用电脑或者智能设备上的...不管怎样,这两种导航方式都需要事先绘制好一张精细的地图。那么,问题来了:导航的地图究竟怎么来的? 两个概念 ▲ 从地图的采集到最终

    http://j.news.163.com/docs/10/2014111507/AB2S374590013746.html

    平常我们使用导航有两种情景:一种是使用电脑或者智能设备上的地图软件来导航;另一种是使用更专业的车载导航或者手持GPS。不管怎样,这两种导航方式都需要事先绘制好一张精细的地图。那么,问题来了:导航的地图究竟是怎么来的?

    两个概念

    从地图的采集到最终应用在导航软件,整个过程将涉及到地图学、地理学、遥感技术以及计算机科学等跨学科知识。我们尽量用浅显的语言解释整个制图过程。不过在此之前,我们必须先了解两个概念。

    GIS:Geographic Information System,即地理信息系统。通俗的说是将实际的地形、建筑等地理信息转换成数字模式,可以将这些数字化了的信息进行存储、分析、管理、计算等操作。

    POI:Point of Interest,即兴趣点。一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。传统的地理信息采集方法需要地图测绘人员采用精密的测绘仪器去获取一个兴趣点的经纬度,然后再标记下来。

    GIS和POI是构成导航内地图不可或缺的两个信息,这些信息在地图上以不同图层显示出来。经过对图层的叠加,显示进行表达的过程。对地图应用目标不同,叠加图层也不同。比如你想查看卫星图,选择“卫星图层”就可以直接显示出来。

    数据来源

    早在春秋战国时期,地图就被当做一项极为重要战略物资。《管子·地图篇》说,凡主兵打仗,必须先看图,知地形,才不致失利。所以在战争前一定要先派出很多间谍去绘制敌方地图,然后以绝密文件形式传送回来。这种人肉绘制地图的方法不仅耗时费力,对绘图者技术水平要求很高。只要出现一丁点差错,可能导致全军覆没。

    于是,先人创造了许多制图的方法,最出名的有刘徽的《海岛算经》,裴秀的《制图六体》等著作。现代制图更多的是依靠卫星、航拍或者地图采集车。当然,在某些特殊的地方还是需要靠人背着设备去采集信息。

    数据分类

    ●地图数据分为这几大类:

    1. 底图数据:

    底图就是地图中最基本的图形数据和一些相关附加信息。底图数据来源有三个:

    官方地图:地图厂商从政府测绘局购买其发布的权威地图。这种地图比我们日常街上买的地图更加精确丰富。

    实地外采:实地外采就是测绘人员利用专业仪器,在实地环境中测绘得到数据。这种实地外采精度高,置信度高,但是缺点是成本高,周期长。所以这种实地外采越来越少的被地图厂家采用。

    航片卫片:通过自己拍摄或者购买高精度航空照片或者卫星照片,作为底图数据。这种地图数据被绝大多数地图厂商采用。目前航拍或者卫星地图精度已经可以达到0.05米甚至更精确,这个精度已经足够所有地图生产商使用。

    2. POI数据:

    上面已经解释了POI数据的概念,我们这里只讨论POI数据来源。

    通过数据采集车采集:采集后数据通过手工标注。这种方式适合大规模采集标注,效率高成本低,尤其适合沿街的店面和场所的采集和标注,是目前数据采集供应商的主要采集手段之一。

    通过专职或者兼职人员利用手机等智能设备进行采集:它是对上一种采集方式的补充,比较适合变动频繁的商户位置。

    地址反向编译:这种方式通过门牌地址号码,运用算法进行定位标注。这种方法的好处是成本非常低,但是精度和准确度都不高。

    从互联网或者企业获取:这些POI直接从专业网站抓取或者购买(比如大众点评,携程)。一些企业也可以利用这些地图开放的API服务为自己互联网产品服务。

    POI数据不需要很多资质限制,所以提供POI数据的服务生比底层数据供应商多很多。比如图吧就是主要的POI数据供应商,很多时候大家互相购买,补充自己的地图。

    3. 其他数据:

    其他常见数据图层包括交通状况图层、卫星图层、三维图层、街景图。交通状况图主要依赖于安装在出租车上的GPS采集实时数据,或者通过激光测速仪、摄像头、雷达测速等专业设备采集交通路况信息。三维图层主要依靠激光扫描和手工建模。街景则依赖实地拍摄。

    数据处理

    在我们获得这些数据后,需要对这些数据需要进行模型化处理。目前有两种建模方式:矢量模型和栅格模型。

    我们目前在互联网公开服务中,或者绝大多数手机App里看到的,都是基于栅格(瓦片)模型的地图服务。其实对于某一块地方的描述,都是通过10多层甚至20多层不同分辨率的图片所组成,当用户进行缩放时,根据缩放的级数,选择不同分辨率的瓦片图拼接成一幅完整的地图。

    对于矢量模型的电子地图来说,所有的数据以矢量的方式存放管理,任何地图元素和数据都可以根据需要自由分类组成,或者划分成不同的图层。各种图层之间关系可以很复杂,例如可以将所有的道路数据做成一个图层,也可以将主干道做成一个图层,支路做成另外一个图层。图层中数据归类和组合比较自由。

    那么既然瓦片图引擎有那么多的限制和缺陷,为什么不都直接使用矢量引擎呢?因为瓦片图引擎有着重大的优势:

    1. 能够负载起大规模并发用户,矢量引擎要耗费大量的服务器运算资源(因为有完整的空间数据引擎),哪怕只是几十上百的并发用户,都需要极其夸张的服务器运算能力了。矢量引擎是无法满足公众互联网服务的要求的。

    2. 由于地图美工介入的渲染工作,瓦片图可以做得非常好看漂亮和易读,比较适合普通用户的浏览。

    编 后

    对地图数据进行加工后,整个地图制作就基本成型了。地图厂商需要将做好的地图进行实地测试,保证地图的完整性和可靠性。最后这些原始地图数据在相关部门做保密技术处理和审查。通过审查后,电子地图就可以公开的在网上发布或者销售。至此,整个地图制作过程基本结束。一般来说,地图厂家还会进行地图数据的更新,更新的频率每家各不相同。只有地图数据更新,才能保证用户在使用地图时候不会出错。

    展开全文
  • “领仕网”最专业的地产链招聘平台:http://www.leenss.com1国内土地市场宗地图绘制标准制图规范在我国,宗地图绘制是有严格的制度规范的,那么,宗地图具体的制图规范是怎样的呢?1、宗地图内容:1、所在图符号...

    领仕网

    ”最专业的地产链

    招聘平台

    http://www.leenss.com

    1

    国内土地市场宗地图的绘制标准制图规范

    在我国,

    宗地图的绘制是有严格的制度规范的,

    那么,

    宗地图具体的制图规范是怎样的

    呢?

    1

    、宗地图内容:

    1

    、所在图符号、地籍区(街道)号、街坊号、宗地号、界址点好、利用分类号、土地

    等级、房屋栋号;

    2

    、本宗地用地面积值和实量界址边长或反算的界址边长;

    3

    、邻宗地的宗地号及相邻宗地间的界址分隔示意线;

    4

    、紧靠宗地的地理名称;

    5

    、宗地内的建筑物构筑物等附着物及宗地外紧靠界址点线的附着物;

    6

    、本宗地界址点位置、界址线、地形地物的现状、界址点坐标表、权利人名称、用地

    性质、用地面积、测图日期、测点(放桩)日期、制图日期;

    7

    、指北方向和比例尺;

    8

    、为保证宗地图的正确性,宗地图要有检查审核、宗地图的制图者、审核者均要在图

    上签名。

    2

    、宗地图的施测与要求:

    施测方法和要求与地籍图一致。

    编绘宗地图时,应做到界址线走向清楚,坐标正确无误,面积准确,四至关系明确,各

    项注记正确齐全,比例尺适当。

    宗地图屠夫规格根据宗地的大小选取,一般为

    32

    开、

    16

    开、

    8

    开等,宗地过大时,原

    则上可按分幅地籍图整饰;

    宗地图必须依比例尺真实绘制;

    宗地图上界址边长必须注记齐全;

    宗地图指北方向必须与相应的地籍图指北方向一致;宗地图的整饰、注记规格同地籍图。

    展开全文
  • 最近在工作项目中遇到一个绘制地图轮廓,并且在地图上根据需求里的学校位置打点,从最初的无从下手到最后完成,中间边看echarts([echarts官网文档][1])文档边尝试,开了一个好头后面越写越顺利,因此谨以此篇文章...

    最近在工作项目中遇到一个绘制地图轮廓,并且在地图上根据需求里的学校位置打点,从最初的无从下手到最后完成,中间是边看echarts([echarts官网文档][1])文档边尝试,开了一个好头后面越写越顺利,因此谨以此篇文章记录下我本次学习的过程。

    首先上图看效果

    qAn2Ej.png

    然后说说地图的实现思路:

    首先需要绘制出地图轮廓;

    请求接口数据,然后在地图上打点;

    地图上的学校点击时异步加载学校数据

    现在开始说正经的:

    第一步:绘制地图轮廓

    在绘制地图的准备工作中,需要事先准备好需要绘制的地区的json文件(主要是区域轮廓图的一些重要拐点经纬度,地图就是依靠它一个点一个点连线绘制出来滴),大概长这样:

    INJ7Vr.png

    然后在代码导入并中注册:

    import echarts from 'echarts'

    var config = require('../../../../static/mock/conf')

    var dingnan = require(`../../../../static/mock/${config.map}`)

    echarts.registerMap('dingnan', dingnan)

    前两句代码基本上可以合并成一句,其意思是说给这个地图Json起了个名字,引入的时候要对号入座(还有其他地域地图)。。。

    这一步完成之后,相当于地图已经注册了,但是需要一个载体来呈现它,这时候echarts就出场了:

    eY3Ena.png

    各种数据初始化准备:

    mYnmyu.png

    另外我封装了一个方法makeMapOption用来装载echarts图表所需的各种参数(主要为了方便后面接口请求数据后传到这个方法中地图打点):

    U7v6rm.png

    当程序解析到

    mounted() {

    this.mapChart = this.$refs.map.chart

    this.mapOption = makeMapOption()

    },

    的时候,地图轮廓已经加载出来了:

    aAF7ri.png

    第二步:地图打点

    这里就需要异步请求接口了,根据后台返回的数据看看该在哪里打点,打点最重要的两个参数就是经度和纬度啦,接口返回的数据大概长这样:

    uEjQre.png

    这个latitude和longitude就是每个学校的经纬度了,而schoolCode则是我们在第三步需要用到的重要参数,接下来就是拿着这些数据封装成我们地图中所需要的结构:

    NjYNjy.png

    mAJzYz.png

    分别是打点的学校的名字,学校id,经纬度,学校类别…

    之后传到刚才说的方法中去,echaerts图表参数主要部分series中其中一个项大概就是这样滴(这个截图对应的是文章开头第一张图中的黄色点学校,该地区高中中职在我们系统中的就这两…,同理小学初中,完全中学,教育局也是一样滴,不同就是经纬度和颜色啦,看到这里如果懵了的话,不要捉急,代码被我截图拆的四零八散,最后我会附上完整代码滴~~~~):

    eiArAr.png

    到这地图打点算是完成了,效果就是图一的样子,但是只有地图和点,没有其他信息,看官也不知道这些点到底是干嘛滴不是吗,所以再看

    第三步:异步获取地图上某个点的信息

    其实本来是很简单的一个echarts图表中的tooltip,就是像echarts官网中的许多例子一样,鼠标放上去出现一个小tips,有什么系统名啊,本item的值啊,百分比啊云云,but我们的需求不按常理出牌啊,tips上的文字是自定义滴,需要展示的数据还是需要请求滴,一开始我还是不会滴…

    qIJRzi.png

    就是图上红框框里那个玩意儿~~

    于是我又去看了看echarts官网关于formatter链接描述的部分,

    buQNNn.png

    划重点aaaaaa

    第二个参数 ticket 是异步回调标识,配合第三个参数 callback 使用。 第三个参数 callback 是异步回调,在提示框浮层内容是异步获取的时候,可以通过 callback 传入上述的 ticket 和 html 更新提示框浮层内容。

    (感谢官网大大)

    然后怎么办?–硬着头皮写啊,异步请求啊,连接字符串啊,显示啊,上代码:

    tooltip: {

    show: true,

    triggerOn: 'click',

    backgroundColor: 'rgba(10, 17, 64, 0.8)',

    formatter(value, ticket, callback) {

    let _this = this

    fetchSchoolDeatail({ unitCode: value.data.schoolCode }).then(({ data, headers }) => {

    let info = data.data

    let str = `

    ${value.name}

    ${info.bxTypeName}

    在册学生${info.studentNum}

    在册职工数${info.teacherNum}

    今日到校学生数${info.studentArriveSchoolNum}

    今日到校职工数${info.teacherArriveSchoolNum}

    `

    callback(ticket, str)

    }).catch(err => {

    console.dir(err)

    _this.$message.error(err.message || '获取学校信息失败,请稍后再试')

    }).finally(() => {

    console.log(1)

    })

    return '加载中...'

    }

    },

    有几点说明:

    为了避免鼠标划过地图点就请求接口导致接口卡顿,触发tooltip的方法改成了click,也就是点击一下学校点才会加载学校信息接口数据;

    由于接口请求发送到成功返回需要一点时间,刚一点上去可能是空白或者tips没出来,所以点击那一瞬间tips显示的是“加载中…”,这就是最外层的return;

    当数据加载完成之后必须要写callback(ticket, str),这是人家formatter回调函数规定滴,ticket异步标识不能改,否则不返回任何东西。

    至此呢,整个地图绘制,打点,加载点信息就完成了,下面补充几个我在写代码时的注意项:

    绘制图表的点的样式可以是一般的ciecle圆点或者rect方形,也可以自定义,比如我地图中的教育局图表,就是引入了一张图片

    const starImg = require('../../../assets/images/secondBg/star.png')

    引入以后vue自己转化成了base64的编码,然后我们在需要使用的地方是“image://http://xxx.xxx.xxx/a/b.png”这种格式,我们自己需要加上’image://’这段字符,

    icon: `image://${starImg}`

    为了方便操作地图上的点,不和页面上其他部分重叠,我设置了地图鼠标缩放和平移漫游(geo坐标系中的roam),也就是鼠标在地图区域内的时候可以拖拽地图移动位置,也可以通过滑轮放大缩小地图面积,有个小瑕疵是有时候拖拽完之后鼠标已经没有左键右键控制了,但是鼠标一挪动,地图还是会跟着走,只有在地图之外的空白处点一下才会丢下拖拽。。。

    本地图series中共有4个不同类型的数据组合,有的点经纬度离得近,地图缩小时会看上去重合,这时候就需要设置好每个类型的zlevel值,这是为了给每个类型绘制canvas时分层,不至于累在一起看不到别的点

    最后附上我的全部代码

    import { allSchools, fetchSchoolDeatail } from '@/services/showView'

    import echarts from 'echarts'

    var config = require('../../../../static/mock/conf')

    var dingnan = require(`../../../../static/mock/${config.map}`)

    const starImg = require('../../../assets/images/secondBg/star.png')

    echarts.registerMap('dingnan', dingnan)

    const makeMapOption = (data) => {

    return {

    legend: {

    show: true,

    orient: 'vertical',

    left: '22%',

    top: '15%',

    symbolKeepAspect: false,

    itemWidth: 15,

    itemHeight: 15,

    data: [

    {

    name: '小学初中',

    icon: 'circle',

    textStyle: {

    color: '#75eef5'

    }

    },

    {

    name: '高中中职',

    icon: 'circle',

    textStyle: {

    color: '#f0ea75'

    }

    },

    {

    name: '完全中学',

    icon: 'circle',

    textStyle: {

    color: '#887bff'

    }

    },

    {

    name: '县教育局',

    icon: `image://${starImg}`,

    textStyle: {

    color: '#da4800'

    }

    }

    ]

    },

    tooltip: {

    show: true,

    triggerOn: 'click',

    backgroundColor: 'rgba(10, 17, 64, 0.8)',

    formatter(value, ticket, callback) {

    let _this = this

    fetchSchoolDeatail({ unitCode: value.data.schoolCode }).then(({ data, headers }) => {

    let info = data.data

    let str = `

    ${value.name}

    ${info.bxTypeName}

    在册学生${info.studentNum}

    在册职工数${info.teacherNum}

    今日到校学生数${info.studentArriveSchoolNum}

    今日到校职工数${info.teacherArriveSchoolNum}

    `

    callback(ticket, str)

    }).catch(err => {

    console.dir(err)

    _this.$message.error(err.message || '获取学校信息失败,请稍后再试')

    }).finally(() => {

    console.log(1)

    })

    return '加载中...'

    }

    },

    geo: {

    map: 'dingnan',

    label: {

    emphasis: {

    show: false

    }

    },

    roam: true,

    itemStyle: {

    normal: {

    color: 'rgba(43,58,113, 0.2)',

    borderColor: '#0c6cd2'

    },

    emphasis: {

    color: 'rgba(43,58,113, 0.2)'

    }

    }

    },

    series: [{

    name: '县教育局', // 地图中心点

    type: 'scatter',

    coordinateSystem: 'geo',

    zlevel: 10,

    symbol: `image://${starImg}`,

    data: [{

    name: '县教育局',

    value: data[3]

    }],

    symbolSize: [20, 20],

    label: {

    normal: {

    formatter: '{b}',

    position: 'top',

    show: false

    },

    emphasis: {

    show: false

    }

    },

    itemStyle: {

    normal: {

    color: '#96edfe'

    },

    emphasis: {

    show: false

    }

    }

    },

    {

    name: '高中中职',

    type: 'effectScatter', // 涟漪

    coordinateSystem: 'geo',

    zlevel: 2,

    rippleEffect: {

    brushType: 'stroke',

    scale: 3

    },

    label: {

    normal: {

    fontSize: 16,

    offset: [12, 0],

    show: false,

    position: 'right',

    formatter: '{b}'

    },

    emphasis: {

    show: false

    }

    },

    symbolSize: 12,

    itemStyle: {

    normal: {

    color: '#f0ea75'

    }

    },

    data: data[1]

    },

    {

    name: '小学初中',

    type: 'effectScatter', //带有涟漪特效动画的散点

    coordinateSystem: 'geo', // 该系统所使用的坐标系,geo地理坐标系

    zlevel: 2, // zlevel用于 Canvas 分层

    rippleEffect: {

    brushType: 'stroke', // 波纹的绘制方式

    scale: 3 // 动画中波纹的最大缩放比例

    },

    label: {

    normal: {

    fontSize: 16,

    offset: [10, 0],

    show: false,

    position: 'right',

    formatter: '{b}'

    },

    emphasis: {

    show: false

    }

    },

    symbolSize: 10, // 标记的大小

    itemStyle: { // 图形样式

    normal: {

    color: '#75eef5'

    }

    },

    data: data[0]

    },

    {

    name: '完全中学',

    type: 'effectScatter', // 涟漪

    coordinateSystem: 'geo',

    zlevel: 2,

    rippleEffect: {

    brushType: 'stroke',

    scale: 3

    },

    label: {

    normal: {

    fontSize: 16,

    offset: [10, 0],

    show: false,

    position: 'right',

    formatter: '{b}'

    },

    emphasis: {

    show: false

    }

    },

    symbolSize: 8,

    itemStyle: {

    normal: {

    color: '#887bff'

    }

    },

    data: data[2]

    }]

    }

    }

    export default {

    name: 'dingnan-map',

    data() {

    return {

    mapname: config.mapname,

    mapOption: {

    series: [

    ]

    },

    mapChart: null,

    coordData: {

    name: '',

    coord: [],

    id: '',

    children: [],

    url3D: ''

    },

    geoCoordMap: {},

    noticeList: [],

    searchDeviceList: [],

    allSecuityList: [],

    isPlay: false,

    playInt: '',

    playCount: 1,

    schoolName: ''

    }

    },

    mounted() {

    this.mapChart = this.$refs.map.chart

    this.mapChart.showLoading({

    text: '正在加载',

    color: '#25D7FB',

    textColor: '#25D7FB',

    maskColor: 'rgba(19, 25, 83, 0.4)'

    })

    allSchools().then(({ data, headers }) => {

    // 地图中的学校

    if (data.resultCode === 0) {

    let map = new Map()

    for (let item of data.data) {

    this.coordData.children.push({

    schoolName: item.schoolName,

    schoolId: item.schoolCode,

    url3D: '',

    coord: [item.longitude, item.latitude],

    showColor: item.showColor

    })

    this.coordData.name = '定南县教体局'

    this.coordData.coord = [115.049, 24.759872]

    this.coordData.id = '3607280000'

    this.coordData.url3D = ''

    map.set(item.schoolName, [item.longitude, item.latitude])

    }

    this.geoCoordMap = map

    this.mapOption = makeMapOption([this.convertEffectData(1), this.convertEffectData(2), this.convertEffectData(3), this.coordData.coord])

    }

    return { data: null }

    }).catch(err => {

    console.dir(err)

    this.$message.error(err.message || '查询失败,请稍后再试')

    }).finally(() => {

    this.mapChart.hideLoading()

    })

    },

    methods: {

    // 涟漪点

    convertEffectData(colorType) {

    var res = [];

    for (var i = 0; i < this.coordData.children.length; i++) {

    var dataItem = this.coordData.children[i];

    if (dataItem.showColor === colorType) {

    res.push({

    name: dataItem.schoolName,

    value: dataItem.coord,

    schoolCode: dataItem.schoolId

    });

    }

    }

    return res;

    }

    }

    }

    .map-wrapper {

    width: 98%;

    height: 100%;

    position: absolute;

    left: 1%;

    right: 1%;

    margin: auto;

    z-index: 1;

    }

    最后再啰嗦一下,我的地图小点点是一颗颗闪亮的小星星,这个主要设置好散点的颜色,涟漪点的圈圈数量,闪动的时间,就很好看啦,我的代码里都有注释。

    第一次写这么多字,有点小鸡冻,分享就这么多了,如果您有幸看到了我的文章,希望能对您遇到的问题有所帮助,与君共勉,fighting!

    展开全文
  • 严格绘制数据地图并不一件简单的事情。专业的做法应当使用 GIS(地理信息系统)的专业软件。在这些软件中需要设置底图、投影方式、坐标、高程等等。不过,对于普通的理工科、社会科学工作来说,有时候我们并不需要...

    6c5625cb7727082a726e916c1f507e7f.png

    严格绘制数据地图并不是一件简单的事情。专业的做法应当使用 GIS(地理信息系统)的专业软件。在这些软件中需要设置底图、投影方式、坐标、高程等等。不过,对于普通的理工科、社会科学工作来说,有时候我们并不需要把地图制作得非常精确。普通的分块填色数据地图就可以满足我们的要求。例如,在上一期中我们给出了姓氏、名字的全国分布地图

    姓氏分布-知乎@纯洁的夏老师optics.dicp.ac.cn

    下面介绍一种用Phython绘制数据地图的方法,可以方便的从大量数据绘制出大量地图。

    一、基本原理

    首先我们需要一张底图。这张地图最好是PNG、BMP等无损格式的。如果是JPG等有损压缩格式,需要用Photoshop之类的图像处理软件进行预先二值化处理。下面是一张中国分省空白底图。

    e7a86e4979900c9caeebd4da7549119b.png

    下面我们如何填充颜色呢?OpenCV 库有一个函数叫 floodFill 可以满足我们的要求。这个函数类似于 Windows 画图中的油漆桶工具,在某一点作用后会填充颜色直到形状的边缘。其调用格式为

    floodFill(image, mask, seedPoint, newVal[, loDiff[, upDiff[, flags]]])

    第一个参数 image 是图像矩阵,第二个参数 mask 在这里不需要设置为None即可。seedPoint就相当于使用油漆桶工具时用鼠标点击的位置坐标。newVal是新颜色的颜色值,可以用(r, g, b)元组来表示, r, g, b是0-255整数。后面的其他参数都是可选,不需要写。

    二、获取所有分区坐标

    现在我们首先需要知道所有省份的位置坐标。中国的省份不多,当然可以逐个在Photoshop里面查看记录坐标。但是如果是地级市地图呢?中国的地级市有1000多个,记录就会非常麻烦。在这里我们提供了一个小工具,可以方便实现坐标位置记录功能:

    from chaco.api import ArrayPlotData, Plot
    from enable.api import BaseTool
    from enable.component_editor import ComponentEditor
    from traits.api import  HasTraits, Instance
    from traitsui.api import Item, View
    import cv2
    
    class CustomTool(BaseTool):
    
        def normal_left_down(self, event):
            print self.component.map_data((event.x, event.y))
    
    
    class ScatterPlot(HasTraits):
    
        plot = Instance(Plot)
    
        traits_view = View(Item('plot', editor=ComponentEditor(), show_label=False),
                           width=800, height=600, resizable=True,
                           title="Custom Tool")
    
        def _plot_default(self):
            # Create the data and the PlotData object
            z = cv2.imread('blank_map.png') #用你的图片替换这一行。
            plotdata = ArrayPlotData(z=z)
            # Create a Plot and associate it with the PlotData
            plot = Plot(plotdata, default_origin="top left")
            # Create a scatter plot in the Plot
            plot.img_plot('z')
            # Add our custom tool to the plot
            plot.tools.append(CustomTool(plot))
            return plot
    
    test = ScatterPlot()
    test.configure_traits()

    这里利用了Chaco提供的交互式工具。运行后会显示一个包含有图片的窗口。只要单击图片,就自动在控制台打印单击位置的坐标。例如在这个截图中,我分别点击了江苏和浙江,这两个省份的坐标就记录在控制台。

    f334ac601bbf8e3415d3a384d1d699c1.png

    我们拉一个表格,把所有省份名字都放进去,然后按表格顺序依次点击省份,再把控制台输出的坐标数据拷贝出来,得到一张表格:

    11 北京市 (1331, 561)
    12 天津市 (1365, 599)
    13 河北省 (1305, 635)
    14 山西省 (1208, 655)
    15 内蒙古自治区 (1122, 549)
    21 辽宁省 (1522, 525)
    22 吉林省 (1585, 398)
    23 黑龙江省 (1594, 256)
    31 上海市 (1520, 924)
    32 江苏省 (1465, 847)
    33 浙江省 (1485,1001)
    34 安徽省 (1376, 912)
    35 福建省 (1437,1152)
    36 江西省 (1342,1072)
    37 山东省 (1385, 708)
    41 河南省 (1271, 830)
    42 湖北省 (1245, 977)
    43 湖南省 (1176,1113)
    44 广东省 (1291,1252)
    45 广西壮族自治区 (1104,1225)
    46 海南省 (1133,1432)
    50 重庆市 (1056,1022)
    51 四川省 (890, 968)
    52 贵州省 (1039,1116)
    53 云南省 ( 847,1249)
    54 西藏自治区 (638, 986)
    61 陕西省 (1082, 833)
    62 甘肃省 (941, 800)
    63 青海省 (698, 750)
    64 宁夏回族自治区 (1010, 685)
    65 新疆维吾尔自治区 (320, 505)
    71 台湾省 (1542,1222)

    三、利用ColorMap得到需要填充的颜色

    72a3c352b120f7501a6cb909915a9003.png
    各式各样的colormap

    61d6c8200b0899b7ef74af9afb5e4835.png
    各式各样的colormap

    Matplotlib给我们提供了多种多样的颜色-值映射关系。调用方法为

    import matplotlib.cm as cm
    cmap = cm.Blues #使用Blues作为映射函数
    color = cmap(int(data[key] / max_ * 255))
    color = [i * 255 for i in color]

    其中 data[key] 是数据,max_ 是最大值。int(data[key]/ max_ *255) 可以把所有的数据转化为一个0-255的整数,这正是cmap函数对参数的要求。cmap函数的返回值是一个长度为 3 的元组,每一个值是 0-1 之间 的浮点数。[i *255for i in color] 可以把 color 转化为 0-255 的列表,这是 opencv 中 floodFill 函数对颜色的要求。

    四、不同的映射函数填充效果

    f4c205a7ce755a0c6a0051c268e41782.png
    jet 作为 colormap 填充数据地图

    37f747230993f2cd38b183025524275a.png
    hsv 作为 colormap 填充数据地图

    ffe0b053abedab2508a5164b29f6da5e.png
    Reds 作为 colormap 填充数据地图
    展开全文
  • 下面分享的地球与地图总结的思维导图模板,以及绘制该思维导图的操作方法介绍,希望对大家有所帮助。  **绘制工具:迅捷画图  绘制方法:**  1.选择在线网站进行编辑使用,搜索迅捷画图进入到该网站,在绘制...
  • 在使用高德地图或者百度地图的...怎样绘制一个正方形的地图容器呢?假设代码如下:在PC端做这个事情简单的很,只要使用类似下面的语句就好#mapContainer {width: 320px;height: 320px;}可是移动端页面宽度有限,我们...
  • “领仕网”最专业的地产链招聘平台:http://www.leenss.com1国内土地市场宗地图绘制标准制图规范在我国,宗地图绘制是有严格的制度规范的,那么,宗地图具体的制图规范是怎样的呢?1、宗地图内容:1、所在图符号...
  • 跑步跑了几千公里之后,一个显而易见的想法是,我到底和之前比快了多少,跑量有何变化,如果能把在这个城市的所有路线全部画出来,会是怎样的景象呢,接下来通过本文给大家介绍Python和Perl绘制中国北京跑步地图的...
  • 我的设想这样的:每5秒将gps传来的值传入一个list里面,然后又立刻读取list中的值,然后将值作为参数 传入划线方法中。但是这样就出现个问题,list的大小未知。反正最后运行也没出现轨迹。ps:运行这程序要走很多路...
  • 滴滴借助出行大数据绘制的“城市星云图”解释了任何交通的流动。此外,这种数据轨迹还能摸索城市“脉络”,探究出 5 种城市结构分类。本文转载自滴滴媒体研究院。 相信很多人对NASA(美国国家航空航天局)发布的全球...
  • 【概述】高德地图api中有个绘制线的api,绘制出来是单色的,要实现纹理是怎样的? 【高德api地址】https://lbs.amap.com/api/android-sdk/guide/draw-on-map/draw-polyline 【实现】: ①单色线条: aMap....
  • 背景技术:地图是空间信息的载体,通过测量地图上两点之间的线条的距离,再根据比例尺换算,即可得到两地的实际距离。地图上的线条很多都为曲线,传统的米尺在测量曲线长度的时候,往往需要借助其它介质,如柔软的...
  • 使用Python和Perl绘制北京跑步地图 当你在一个城市,穿越大街小巷,跑步跑了几千公里之后,一个显而易见的想法是,如果能把在这个城市的所有路线全部画出来,会是怎样的景象呢? 文章代码比较多,为了不吊人...
  • 当你在一个城市,穿越大街小巷,跑步跑了几千公里之后,一个显而易见的想法是,如果能把在这个城市的所有路线全部画出来,会是怎样的景象呢?文章代码比较多,为了不吊人胃口,先看看最终效果,上到北七家,下到南...
  • arcgis for javascript 绘制多边形

    千次阅读 2017-05-23 20:27:50
    怎样绘制呢? 1、读取数据库中的多边形数据 2、在地图上绘制多边形 3、地图放大,并定位到指定的坐标 地图放大很重要。因为一般我们画的多边形,可能放在一幅全国地图里,会非常的小,如果不放大地图比例,还...
  • 这里主要介绍下在R语言中绘制地图的个人琢磨的思路。绘制地图步骤有三: 你得需要绘制地图;(约等于废话) 你得有要绘制地图的地理信息,经纬度啊,边界啊等等; 你得利用2的数据在R中画出来。 以上步骤...
  • R语言时代,你要怎样地图

    千次阅读 2013-12-16 20:05:59
    这里主要介绍下在R语言中绘制地图的个人琢磨的思路。绘制地图步骤有三: 你得需要绘制地图;(约等于废话) 你得有要绘制地图的地理信息,经纬度啊,边界啊等等; 你得利用2的数据在R中画出来。 以上步骤中,目前...
  • 地图是按照一定的法则,有选择地以二维或多维形式与手段在平面或球面上表示地球(或其它星球)若干现象的图形或图像。在数据可视化中,地图也是一个非常非常重要的部分,大多数情况下,都做为主视觉出现。本期给大家...

空空如也

空空如也

1 2 3 4
收藏数 63
精华内容 25
关键字:

地图是怎样绘制的