我用Python做设计(二)

2 篇文章 0 订阅
2 篇文章 0 订阅

前言

  上次看着生成的图像,可总是感觉少了什么,对了,是不是少了行政区划图,没有行政区划,难怪看着这么别扭。geoplotlib是支持*.shp格式的文件的,这样的行政区划图,在geoplotlib中只要使用geoplotlib.shapefiles()函数加载就行了,可是我手里面并没有当地区界的shp文件,但是有区界的多段线文件。所以本文的内容就是,怎么用在geoplotlib中怎么自己画图。

数据导出

  不知道是CAD设计不合理,还是我不会总,总感觉,CAD中的【数据提取】功能很不好用,比方说,不能按图层提取,相同类型的数据,总是一次提取一大堆,然后再筛选,拖累速度。所以这次用的是CAD中的LIST命令。用法很简单,选中需要得到坐标的对象,然后输入“list”回车,就行了。
  这里写图片描述
  然后就会出来如下的对话框,这个虽然说对于单个对象来说,比较简单,方便,但是也是感觉很坑的是,输入框中能容纳的内容有限,按几次“ENTER”后,前面的内容就没有,所以只能,隔几次就把数据拷贝出来他出保存,然后继续“ENTER”,直到全部枚举结束。
这里写图片描述
  这里得到的是点的信息,还要把它处理成直线信息,其实就是把得到的数据,复制后,全部上移一位,然后最上面的点,移到最下面,最终处理完成后保存为“.csv”文件保存如下表,包含2组经纬度坐标。
这里写图片描述

数据处理

  下面就开始用geoplatlib来显示了,在geoplatlib中,新增一个图层的方法也很简单,首先,新增加的图层,要继承BaseLayer这个基类,然后再重写其中的部分方法,比如,我们这次要重写invalidate(self, proj)这个方法,这个方法的作用,就是在每次geoplatlib相机高度改变,需要重绘的时候,调用的。
  最终实现的效果如下。
  这里写图片描述
  图中蓝色的线条,就是在新增加的图层上绘制的,不过明显的感觉就是,这样每次切换高程,重新绘制的时后,都感觉要好久,没有直接加载.shp文件的快。
  整个的代码如下,已加入注释。这段代码的主要思路就是,在新增的图层中,用proj.lonlat_to_screen(self.data['lon0'], self.data['lat0']),将经纬坐标转为屏幕坐标,然后用self.painter.lines(x0, y0, x1, y1)绘制线段。

import geoplotlib
from geoplotlib.layers import BaseLayer
from geoplotlib.core import BatchPainter
from geoplotlib.utils import BoundingBox
import numpy as np
import com

class AreaLayer(BaseLayer): #基于BaseLayer创建AreaLayer子类

    def __init__(self, data):
        self.data = data
        self.k = 2

    def invalidate(self, proj): #此函数,会在重新映射坐标的时候调用
        self.painter = BatchPainter()
        x0, y0= proj.lonlat_to_screen(self.data['lon0'], self.data['lat0']) #读取线段的起点坐标数组
        x1, y1= proj.lonlat_to_screen(self.data['lon1'], self.data['lat1']) #读取线段的终点坐标数组
        self.painter.lines(x0, y0, x1, y1) #绘制线段

    def draw(self, proj, mouse_x, mouse_y, ui_manager):
        ui_manager.info('Use left and right to increase/decrease the number of clusters. k = %d' % self.k)
        self.painter.batch_draw()

data = geoplotlib.utils.read_csv('data/lh_area.csv') #读取区界数据
geoplotlib.add_layer(AreaLayer(data)) #加载新继承的AreaLayer图层

geoplotlib.set_smoothing(True)
geoplotlib.set_bbox( com.boundingBoxDefault) #这里是我定义的起始经纬坐标
geoplotlib.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值