应该是由于之前和导师自我介绍的时候说自己会Django,所以还没到学校,就已经开始了这个项目。先来简单介绍下这个项目:它是一个给地理数据做可视化的项目,展示方式是WEB页面,用的是Django框架,必然是Python脚本语言。前端我看了,用的是bootstrap,不过目前我不用处理前端的东西,前端是由另几个学长来对付的。

        先来看下主页:

django实现数据可视化页面 django 数据可视化_django实现数据可视化页面

        我负责的是导航栏里的“功能选择”->“辅助决策”->“目标定位标绘”一栏,具体如图所示:

django实现数据可视化页面 django 数据可视化_django_02

        简单来说,就是实现一个筛选的功能。具体来说就是左边有很多选项,然后“默认”就是不进行处理;“是”是包含该项的“凸包”里的坐标,什么是“凸包”一会讲。;“否”则是“凸包”不得包含该项,也就是说原来要是有的“凸包”虽然包含了很多符合要求的坐标,但其中包含了一个或者几个不该包含的坐标,那这整个凸包的坐标都不显示出来。所以说并不是简单的筛选出满足要求的所有坐标,而是期间使用了一个“凸包算法”,以凸包为单位进行坐标筛选的工作。

        所谓“凸包算法”我询问了负责的学长,基本解释如下:本来有很多离散的点位于二位坐标系中,其中这个坐标系表示的是点的经纬度,即横坐标为经度,纵坐标为维度。设定一定的单位长度,将整个坐标用矩形框划分,每个矩形框成为一个“凸包”,然后我们遍历所有的点,把符合要求的“凸包”用一个个的大矩形给框出来。每一个包含着“凸包”的大矩形,就称作是一个“掩膜”。具体算法在学长给的项目里已经有了大致的代码,基本都定义在了Box类中:

# 点的矩形凸包 构造矩形凸包,划分网格
# xmin-最小x坐标值 xmax-最大x坐标值 ymin-最小y坐标值 ymax-最大y坐标值
# unitLen 单元正方形网格的边长
# maskLen 掩膜的边长
# xUnitSize x轴网格个数 yUnitSize y轴网格个数
# unitGirls 划分后的二维网格数组, unitGirl[i][j]={i,j网格对应的道路坐标索引(即道路条数)} 通过统计单元网格中道路id的个数来统计道路条数
# unitGirlsIsFuPo 二维网格中是否含有需要的坐标的标记(已经不仅仅是湖泊的了)数组

# maskGirls 掩膜的二维数组 maskGirls[j][i]=[0:{合并其中单元网格后的道路set},1:该掩膜中维护的最低高程值,2:该掩膜中维护的最高高程值,3:是否包含[符合要求的]湖泊的字段]
class Box:
    def __init__(self, pointList, maskLen) -> None:
        self.xMin,self.xMax,self.yMin,self.yMax = getRectangleTuKe(pointList)
        self.unitLen = 100.
        self.maskLen = 500.
        self.xUnitSize = math.ceil((self.xMax - self.xMin) / self.unitLen) + 5
        self.yUnitSize = math.ceil((self.yMax - self.yMin) / self.unitLen) + 5
        self.unitGirls = [[set() for i in range(self.xUnitSize)] for j in range(self.yUnitSize)]    # set自动去重
        self.unitGirlsFuPo = [[0 for i in range(self.xUnitSize + 100)] for j in range(self.yUnitSize + 100)]
        self.maskGirls = [[[set(),50000.0,-20000.0,0] for i in range(self.xUnitSize - (math.ceil(self.maskLen / self.unitLen)))] for j in range(self.yUnitSize- (math.ceil(self.maskLen / self.unitLen)))]    
        
    # 初始化单位网格二维数组
    def initUnitGirls(self, LineList):
        for line in LineList:
            # 找到该坐标位于的格子
            i = math.floor((line.x - self.xMin) / self.unitLen)
            j = math.floor((line.y - self.yMin) / self.unitLen)
            # unitGrils二位数组相当于一个哈希表,标记出该坐标在哪个格子中(i行j列的格子)
            self.unitGirls[j][i].add(line.id)
 
    # 初始化掩膜的二维数组
    def initMaskGirls(self, pointWithZList, pointMustInclude, pointNotInclude):

        for key in pointMustInclude.keys():
            if len(pointMustInclude[key]) != 0:
                xMin,xMax,yMin,yMax = getRectangleTuKe(pointMustInclude[key])
                # j对应x,i对应y
                jMin=math.floor((xMin-self.xMin)/self.unitLen)
                iMin=math.floor((yMin-self.yMin)/self.unitLen)
                jMax=math.ceil((xMax-self.xMin)/self.unitLen)
                iMax=math.ceil((yMax-self.yMin)/self.unitLen)
                # (jMin," ",jMax," ",iMin," ",iMax)
                for j in range(jMin, jMax):
                    for i in range(iMin, iMax):
                        # 为1表示存在
                        self.unitGirlsFuPo[j][i] = 1
        for key in pointNotInclude.keys():
            if len(pointNotInclude[key]) != 0:
                xTmpMin,xTmpMax,yTmpMin,yTmpMax = getRectangleTuKe(pointNotInclude[key])
                # j对应x,i对应y
                jTmpMin=math.floor((xTmpMin-self.xMin)/self.unitLen)
                iTmpMin=math.floor((yTmpMin-self.yMin)/self.unitLen)
                jTmpMax=math.ceil((xTmpMax-self.xMin)/self.unitLen)
                iTmpMax=math.ceil((yTmpMax-self.yMin)/self.unitLen)
                for j in range(jTmpMin, jTmpMax):
                    for i in range(iTmpMin, iTmpMax):
                        # 为0表示不满足条件
                        self.unitGirlsFuPo[j][i] = 0

        
        # print(self.unitGirlsFuPo)
        maskSize = math.floor(self.maskLen / self.unitLen)
        # 合并单元格中道路条数
        for i in range(self.xUnitSize - (math.ceil(self.maskLen / self.unitLen))):
            for j in range(self.yUnitSize - (math.ceil(self.maskLen / self.unitLen))):
                for i_increment in range(maskSize):
                    for j_increment in range(maskSize):
                        self.maskGirls[j][i][0] |= self.unitGirls[j+j_increment][i+i_increment]
                        self.maskGirls[j][i][3] = self.maskGirls[j][i][3] or self.unitGirlsFuPo[j+j_increment][i+i_increment]
                        # print("self.unitGirlsFuPo[j+j_increment][i+i_increment]=",self.unitGirlsFuPo[j+j_increment][i+i_increment])
        # 维护掩膜的高程值
        for p in pointWithZList:
            j = math.floor((p.x - self.xMin) / self.unitLen)
            i = math.floor((p.y - self.yMin) / self.unitLen)
            lenn = math.ceil(self.maskLen / self.unitLen)
            for a in range(lenn):
                for b in range(lenn):
                    if j-a > 0 and i-b > 0 and j-a < len(self.maskGirls) and i-b < len(self.maskGirls):
                        self.maskGirls[j-a][i-b][1] = min(self.maskGirls[j-a][i-b][1], p.z)
                        self.maskGirls[j-a][i-b][2] = max(self.maskGirls[j-a][i-b][2], p.z)

    # 得到符合要求的掩膜的左下和右上坐标
    # maxDensity:道路密度高的参数 minDensity:道路密度低的参数 hmin:最低高程值 hmax:最高高程值 isFuPo:是否是湖泊
    # maxDensityResult: 道路密度高的掩膜数组 剩下的以此类推
    def getZb(self ,maxDensity, minDensity,h_min, h_max,isFuPo):
        maxDensityResult=[]
        middleDensityResult=[]
        minDensityResult=[]
        for i in range(self.xUnitSize - (math.ceil(self.maskLen / self.unitLen))):
            for j in range(self.yUnitSize- (math.ceil(self.maskLen / self.unitLen))):
                workArray=[]
                # if(self.maskGirls[j][i][1]<50000):
                #     print(self.maskGirls[j][i][1])
                
                if(self.maskGirls[j][i][1]>float(h_min) and self.maskGirls[j][i][2]<float(h_max) and self.maskGirls[j][i][1] < self.maskGirls[j][i][2] and self.maskGirls[j][i][3]==int(isFuPo)):
                    # print(self.maskGirls[j][i][1])
                    # print(self.maskGirls)
                    # print(self.unitGirlsFuPo)
                    if(len(self.maskGirls[j][i][0])>maxDensity):
                        # Decimal(i*self.unitLen+self.yMin+self.maskLen).quantize(Decimal('0.000'))
                        workArray.append(Point(Decimal(j*self.unitLen+self.xMin).quantize(Decimal('0.000')),Decimal(i*self.unitLen+self.yMin).quantize(Decimal('0.000')),0).toString())
                        workArray.append(Point(Decimal(j*self.unitLen+self.xMin+self.maskLen).quantize(Decimal('0.000')),Decimal(i*self.unitLen+self.yMin+self.maskLen).quantize(Decimal('0.000')),0).toString())
                        maxDensityResult.append(workArray)
                        maxDensityResult.append('<br>')
                    elif(len(self.maskGirls[j][i][0])<=maxDensity and len(self.maskGirls[j][i][0])>minDensity):
                        workArray.append(Point(Decimal(j*self.unitLen+self.xMin).quantize(Decimal('0.000')),Decimal(i*self.unitLen+self.yMin).quantize(Decimal('0.000')),0).toString())
                        workArray.append(Point(Decimal(j*self.unitLen+self.xMin+self.maskLen).quantize(Decimal('0.000')),Decimal(i*self.unitLen+self.yMin+self.maskLen).quantize(Decimal('0.000')),0).toString())
                        middleDensityResult.append(workArray)
                        middleDensityResult.append('<br>')
                    else:
                        workArray.append(Point(Decimal(j*self.unitLen+self.xMin).quantize(Decimal('0.000')),Decimal(i*self.unitLen+self.yMin).quantize(Decimal('0.000')),0).toString())
                        workArray.append(Point(Decimal(j*self.unitLen+self.xMin+self.maskLen).quantize(Decimal('0.000')),Decimal(i*self.unitLen+self.yMin+self.maskLen).quantize(Decimal('0.000')),0).toString())
                        minDensityResult.append(workArray)
                        minDensityResult.append('<br>')
        
        return [minDensityResult, middleDensityResult ,maxDensityResult]

        其中我修改了initMaskGirls一个函数,增加了pointNotInclude参数,用于表示选择“否”的选项所包含的坐标,具体是增加了这一段:

for key in pointNotInclude.keys():
            if len(pointNotInclude[key]) != 0:
                xTmpMin,xTmpMax,yTmpMin,yTmpMax = getRectangleTuKe(pointNotInclude[key])
                # j对应x,i对应y
                jTmpMin=math.floor((xTmpMin-self.xMin)/self.unitLen)
                iTmpMin=math.floor((yTmpMin-self.yMin)/self.unitLen)
                jTmpMax=math.ceil((xTmpMax-self.xMin)/self.unitLen)
                iTmpMax=math.ceil((yTmpMax-self.yMin)/self.unitLen)
                for j in range(jTmpMin, jTmpMax):
                    for i in range(iTmpMin, iTmpMax):
                        # 为0表示不满足条件
                        self.unitGirlsFuPo[j][i] = 0

        我的想法是,先将满足条件的掩膜全部找出标记为1,再将不满足条件的掩膜直接标记为0;那么剩下来是1的掩膜,就全是符合要求的掩膜了。

        接着我看到了学长写的,从数据库里读取坐标的函数,如下所示:

# 从数据库文件中读取点返回
def readPoint(dbName):
    # print("进入"+dbName)
    con = sqlite3.connect(dbName)  # 连接桥
    # print("Open database successfully")  # 打开成功
    cur = con.cursor()
    sql1 = 'SELECT * FROM DN05490062_DZB WHERE leibie="P"'
    cur.execute(sql1)
    pointList=[]
    for line in cur.fetchall():
        if line!=None:
            pointList.append(Point(float(line[2]),float(line[3]),float(line[4])))
    cur.close()
    con.commit()
    con.close()
    return pointList

# 从数据库中读取线返回
def readLine(dbName):
    # print("进入"+dbName)
    con = sqlite3.connect(dbName)  # 连接桥
    # print("Open database successfully")  # 打开成功
    cur = con.cursor()
    sql1 = 'SELECT * FROM DN05490062_DZB WHERE leibie="L"'
    cur.execute(sql1)
    LineList=[]
    for line in cur.fetchall():
        if line!=None:
            LineList.append(Line(line[5],float(line[6]),float(line[7]),line[8]))
    cur.close()
    con.commit()
    con.close()
    return LineList

# 从数据库中读取高程值信息的点返回
def readPointWithZ(dbName):
    # print("进入"+dbName)
    con = sqlite3.connect(dbName)  # 连接桥
    # print("Open database successfully")  # 打开成功
    cur = con.cursor()
    sql1 = "SELECT jzb.LAX as x,jzb.LAY as y,jsx.level as z FROM DN10510744_JZB jzb LEFT JOIN DN10510744_JSX jsx ON jzb.LNUM = jsx.id WHERE jzb.leibie = 'L' AND jsx.leibie = 'L' AND jsx.level is NOT '-32767.00'"
    cur.execute(sql1)
    pointList=[]
    for line in cur.fetchall():
        if line!=None:
            pointList.append(Point(float(line[0]),float(line[1]),float(line[2])))
    cur.close()
    con.commit()
    con.close()
    return pointList

#  读取湖泊
#  返回列表,0:代表字典{湖泊序号,[湖泊序号对应的点]} 1:[湖泊列表点]
def readFuPo(dbName):
    # print("进入"+dbName)
    con = sqlite3.connect(dbName)  # 连接桥
    # print("Open database successfully")  # 打开成功
    cur = con.cursor()
    sql1 = "sELECT ZNUM As fuPoiD, ZZX aS x,ZZY aS y fROM DN05490062_FZB FZB wHere leibie='A'"
    cur.execute(sql1)
    FuPoDict = dict()
    FuPoList = []
    # print(FuPoDict.keys())

    for line in cur.fetchall():
        if line!=None:
            if(line[0] in FuPoDict.keys()):
                # print(line)
                FuPoDict[line[0]].append(Point(float(line[1]),float(line[2]),0))
            else:
                FuPoDict[line[0]]=[]

        if line!=None:
            FuPoList.append(Point(float(line[1]),float(line[2]),0))
    cur.close()
    con.commit()
    con.close()
    print([FuPoDict,FuPoList])
    # print(FuPoList)
    return [FuPoDict,FuPoList]

        依葫芦画瓢,接着写就是了,只要搞清楚对应的数据库即可,有附的总表写的很清楚,按照总表里对应的数据库的表找就可以找到,总表如下所示:

django实现数据可视化页面 django 数据可视化_sql_03

        .XZB文件是X属性的坐标文件,例如.AZB就是属性A,即测量控制点的坐标文件。而.XSX文件则是X属性的属性文件,例如.ASX就是shuxingA测量控制点的属性文件。我按照样子写了如下的代码:

# 读取工农业社会文化设施
def readGongNongYe(dbName):
    con = sqlite3.connect(dbName)
    cur = con.cursor()
    sql1 = "sELECT * fROM DN05490062_BZB WHERE leibie='P'"
    cur.execute(sql1)
    GongNongYeDict = {'P': [], 'A': [], 'L': []}
    GongNongYeList = []
    for line in cur.fetchall():
        if line != None:
            # print(line)
            GongNongYeList.append(Point(float(line[2]), float(line[3]),0))
            if line[0] in GongNongYeDict.keys():
                # print(line)
                GongNongYeDict[line[0]].append(Point(float(line[2]),float(line[3]),0))
            else:
                GongNongYeDict[line[0]]=[]
    cur.close()
    con.commit()
    con.close()
    # print('工农业设施!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
    print(GongNongYeList)
    return [GongNongYeDict, GongNongYeList]

# 读取测量控制点
def readControlPoint(dbName):
    con = sqlite3.connect(dbName)
    cur = con.cursor()
    sql1 = "sELECT * fROM DN05490062_AZB WHERE leibie='P'"
    cur.execute(sql1)
    ControlPointDict = {'P': [], 'A': [], 'L': []}
    ControlPointList = []
    for line in cur.fetchall():
        if line != None:
            # print(line)
            ControlPointList.append(Point(float(line[2]), float(line[3]), 0))
            ControlPointDict[line[0]].append(Point(float(line[2]), float(line[3]), 0))
    cur.close()
    con.commit()
    con.close()
    return [ControlPointDict, ControlPointList]

def readVegetationPoint(dbName):
    con = sqlite3.connect(dbName)
    cur = con.cursor()
    sql1 = "sELECT * fROM DN05490062_LZB WHERE leibie='P'"
    cur.execute(sql1)
    VegetationPointDict = {'P': [], 'A': [], 'L': []}
    VegetationPointList = []
    for line in cur.fetchall():
        if line != None:
            # print(line)
            VegetationPointList.append(Point(float(line[2]), float(line[3]), 0))
            VegetationPointDict[line[0]].append(Point(float(line[2]), float(line[3]), 0))
    cur.close()
    con.commit()
    con.close()
    return [VegetationPointDict, VegetationPointList]

        接着是这这种复选框的操作,如下图所示:

django实现数据可视化页面 django 数据可视化_python_04

        我的想法是这样的:不选就相当于“默认”,选的话相当于“是”,没有“否”的语义。于是代码如下所示:

       

def readResidentAndFacilitiesPoint1(dbName):
    con = sqlite3.connect(dbName)
    cur = con.cursor()
    sql1 = '''SELECT A.leibie,A.AY,A.ZX,B."编码" FROM DN05490062_CZB AS A JOIN DN05490062_CSX AS B ON A.AX=B."要素编号" WHERE B."编码"LIKE"1301%" '''
    cur.execute(sql1)
    readResidentAndFacilitiesPoint1Dict = {'P': [], 'A': [], 'L': []}
    readResidentAndFacilitiesPoint1List = []
    for line in cur.fetchall():
        if line != None:
            # print(line)
            readResidentAndFacilitiesPoint1List.append(Point(float(line[1]), float(line[2]), 0))
            readResidentAndFacilitiesPoint1Dict[line[0]].append(Point(float(line[1]), float(line[2]), 0))
    print("END")
    cur.close()
    con.commit()
    con.close()
    return [readResidentAndFacilitiesPoint1Dict, readResidentAndFacilitiesPoint1List]

def readResidentAndFacilitiesPoint0(dbName):
    con = sqlite3.connect(dbName)
    cur = con.cursor()
    sql1 = '''SELECT A.leibie,A.AY,A.ZX,B."编码" FROM DN05490062_CZB AS A JOIN DN05490062_CSX AS B ON A.AX=B."要素编号" WHERE B."编码"LIKE"1302%" '''
    cur.execute(sql1)
    readResidentAndFacilitiesPoint0Dict = {'P': [], 'A': [], 'L': []}
    readResidentAndFacilitiesPoint0List = []
    for line in cur.fetchall():
        if line != None:
            print(line)
            readResidentAndFacilitiesPoint0List.append(Point(float(line[1]), float(line[2]), 0))
            readResidentAndFacilitiesPoint0Dict[line[0]].append(Point(float(line[1]), float(line[2]), 0))
    print("END")
    cur.close()
    con.commit()
    con.close()
    return [readResidentAndFacilitiesPoint0Dict, readResidentAndFacilitiesPoint0List]

def readResidentAndFacilitiesPoint2(dbName):
    con = sqlite3.connect(dbName)
    cur = con.cursor()
    sql1 = '''SELECT A.leibie,A.AY,A.ZX,B."编码" FROM DN05490062_CZB AS A JOIN DN05490062_CSX AS B ON A.AX=B."要素编号" WHERE B."编码"LIKE"1303%" '''
    cur.execute(sql1)
    readResidentAndFacilitiesPoint2Dict = {'P': [], 'A': [], 'L': []}
    readResidentAndFacilitiesPoint2List = []
    for line in cur.fetchall():
        if line != None:
            print(line)
            readResidentAndFacilitiesPoint2List.append(Point(float(line[1]), float(line[2]), 0))
            readResidentAndFacilitiesPoint2Dict[line[0]].append(Point(float(line[1]), float(line[2]), 0))
    cur.close()
    con.commit()
    con.close()
    return [readResidentAndFacilitiesPoint2Dict, readResidentAndFacilitiesPoint2List]

         对了,还剩下aim里的代码没有交代,aim里的代码主要是调用上面写的这些函数,来实现目标的定位:

# 目标定位
def aim1(request):
    # 下面是表单提交后的内容的格式
    # ddata={"dbName":"DN05490062","maskLen":"500.0","road-density":"0","h_min":"-20000","h_max":"50000","landform[0]":"0","lake":"0","surveyControlPoint":"1","industrial_and_agricultural_social_and_cultural_facilities":"1","residential_land_and_ancillary_facilities[0]":"0","residential_land_and_ancillary_facilities[1]":"1","residential_land_and_ancillary_facilities[2]":"2","pipeline[0]":"0","pipeline[1]":"1","pipeline[2]":"2","plant":"-1","airport":"-1","military_area":"-1"}
    if request.method == 'GET':     # 数据发送方式;get post
        road_density = int(request.GET.get("road-density", None))   # ajax传递字符串
        h_min = request.GET.get("h_min", None)
        h_max = request.GET.get("h_max", None)
        isFuPo = request.GET.get("lake", None)
        dbName = request.GET.get("dbName", None) + '.db'
        maskLen = request.GET.get("maskLen", None)
        isGongNongYe = request.GET.get("industrial_and_agricultural_social_and_cultural_facilities", None)
        isControlPoint = request.GET.get("surveyControlPoint", None)
        isVegetation = request.GET.get("plant", None)
        residentAndFacilities1 = request.GET.get("residential_land_and_ancillary_facilities[1]", None)
        residentAndFacilities0 = request.GET.get("residential_land_and_ancillary_facilities[0]", None)
        residentAndFacilities2 = request.GET.get("residential_land_and_ancillary_facilities[2]", None)

        # 点或者线的List
        daoLuPointList = m.readPoint(dbName)
        LineList = m.readLine(dbName)
        PointWithZList = m.readPointWithZ(dbName)
        AllList = daoLuPointList

        pointNotIncludeDict = {}
        AllDict = {'A': [], 'P': [], 'L': []}


        # 居民地及附属设施
        # 0为居民地,代码1302
        # 1为独立建筑物,代码1301
        # 2为其他建筑物,代码1303
        if residentAndFacilities0 is not None:
            ResidentAndFacilitiesPoint0Dict, ResidentAndFacilitiesPoint0List = m.readResidentAndFacilitiesPoint0(dbName)
            AllList += ResidentAndFacilitiesPoint0List
            AllDict.update(ResidentAndFacilitiesPoint0Dict)
        if residentAndFacilities1 is not None:
            ResidentAndFacilitiesPoint1Dict, ResidentAndFacilitiesPoint1List = m.readResidentAndFacilitiesPoint1(dbName)
            AllList += ResidentAndFacilitiesPoint1List
            AllDict.update(ResidentAndFacilitiesPoint1Dict)
        if residentAndFacilities2 is not None:
            ResidentAndFacilitiesPoint2Dict, ResidentAndFacilitiesPoint2List = m.readResidentAndFacilitiesPoint1(dbName)
            AllList += ResidentAndFacilitiesPoint2List
            AllDict.update(ResidentAndFacilitiesPoint2Dict)




        # 判断“水域”一项的选择
        if isFuPo == '-1':
            pass
        elif isFuPo == '1':
            FuPoDict, FuPoList = m.readFuPo(dbName)
            # 直接取交集
            AllList += FuPoList
            AllDict.update(FuPoDict)
        else:
            FuPoDict, FuPoList = m.readFuPo(dbName)
            # 直接取差集
            pointNotIncludeDict.update(FuPoDict)


        # 判断“工农业社会文化设施”一项的选择
        if isGongNongYe == '-1':
            pass
        elif isGongNongYe == '1':
            GongNongYeDict, GongNongYeList = m.readGongNongYe(dbName)
            # 直接取交集
            AllList += GongNongYeList
            AllDict.update(GongNongYeDict)
        else:
            GongNongYeDict, GongNongYeList = m.readGongNongYe(dbName)
            # 直接取差集
            pointNotIncludeDict.update(GongNongYeDict)

        # 判断“测量控制点”一项的选择
        if isControlPoint == '-1':
            pass
        elif isControlPoint == '1':
            ControlPointDict, ControlPointList = m.readControlPoint(dbName)
            # 直接取交集
            AllList += ControlPointList
            AllDict.update(ControlPointDict)
        else:
            ControlPointDict, ControlPointList = m.readControlPoint(dbName)
            # 直接取差集
            pointNotIncludeDict.update(ControlPointDict)

        # 判断“植被”一项的选择
        if isVegetation == '-1':
            pass
        elif isVegetation == '1':
            VegetationPointDict, VegetationPointList = m.readVegetationPoint(dbName)
            # 直接取交集
            AllList += VegetationPointList
            AllDict.update(VegetationPointDict)
        else:
            VegetationPointDict, VegetationPointList = m.readControlPoint(dbName)
            # 直接取差集
            pointNotIncludeDict.update(VegetationPointDict)

        # 初始化Box数据结构
        b = m.Box(AllList, maskLen)


        # 遍历湖泊字典,维护单元格中是否含有湖泊
        # for key in FuPoDict.keys():
        #     xMin,xMax,yMin,yMax=m.getRectangleTuKe(FuPoDict[key])
        #     jMin=math.floor((xMin-b.xMin)/b.unitLen)
        #     iMin=math.floor((yMin-b.yMin)/b.unitLen)
        #     jMax=math.ceil((xMax-b.xMax)/b.unitLen)
        #     iMax=math.ceil((yMax-b.xMax)/b.unitLen)

        #     for j in range(jMin,jMax+1):
        #         for i in range(iMin,iMax+1):
        #             b.unitGirlsFuPo[j][i]=1

        # 初始化单元网格 、 掩膜的二维数组
        b.initUnitGirls(LineList)
        b.initMaskGirls(PointWithZList, AllDict, pointNotIncludeDict)


        # 获取道路密度返回数组结果
        densityResult = b.getZb(5, 0, h_min, h_max, isFuPo)
        # FuPoDict = m.readFuPo(dbName)

        if road_density == '-1':
            result = densityResult[0] + densityResult[1] + densityResult[2]
            return result

        # 服务器返回结果
        return HttpResponse(densityResult[road_density])

最后,就是这么多。

END