应该是由于之前和导师自我介绍的时候说自己会Django,所以还没到学校,就已经开始了这个项目。先来简单介绍下这个项目:它是一个给地理数据做可视化的项目,展示方式是WEB页面,用的是Django框架,必然是Python脚本语言。前端我看了,用的是bootstrap,不过目前我不用处理前端的东西,前端是由另几个学长来对付的。
先来看下主页:
我负责的是导航栏里的“功能选择”->“辅助决策”->“目标定位标绘”一栏,具体如图所示:
简单来说,就是实现一个筛选的功能。具体来说就是左边有很多选项,然后“默认”就是不进行处理;“是”是包含该项的“凸包”里的坐标,什么是“凸包”一会讲。;“否”则是“凸包”不得包含该项,也就是说原来要是有的“凸包”虽然包含了很多符合要求的坐标,但其中包含了一个或者几个不该包含的坐标,那这整个凸包的坐标都不显示出来。所以说并不是简单的筛选出满足要求的所有坐标,而是期间使用了一个“凸包算法”,以凸包为单位进行坐标筛选的工作。
所谓“凸包算法”我询问了负责的学长,基本解释如下:本来有很多离散的点位于二位坐标系中,其中这个坐标系表示的是点的经纬度,即横坐标为经度,纵坐标为维度。设定一定的单位长度,将整个坐标用矩形框划分,每个矩形框成为一个“凸包”,然后我们遍历所有的点,把符合要求的“凸包”用一个个的大矩形给框出来。每一个包含着“凸包”的大矩形,就称作是一个“掩膜”。具体算法在学长给的项目里已经有了大致的代码,基本都定义在了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]
依葫芦画瓢,接着写就是了,只要搞清楚对应的数据库即可,有附的总表写的很清楚,按照总表里对应的数据库的表找就可以找到,总表如下所示:
.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]
接着是这这种复选框的操作,如下图所示:
我的想法是这样的:不选就相当于“默认”,选的话相当于“是”,没有“否”的语义。于是代码如下所示:
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