def get2point(points, z): zminindex = z.index(min(z)) zmaxindex = z.index(max(z)) minpoint = points[zminindex] maxpoint = points[zmaxindex] fmtdevices = connmysql.get_fmtdevice() fmtdloc = [] for index, fmtdevice in fmtdevices.iterrows(): wgsloc = projtrans.bd09_to_wgs84(float(fmtdevice['lon']), float(fmtdevice['lat'])) utmloc = projtrans.wgs2utm(wgsloc[0], wgsloc[1]) fmtdloc.append( [utmloc[0] / 1000, utmloc[1] / 1000, fmtdevice['deviceid']]) k = (maxpoint[1] - minpoint[1]) / (maxpoint[0] - minpoint[0]) C = minpoint[1] - k * minpoint[0] M = math.sqrt(k * k + 1) if (max(z) - min(z)) < 2: x0 = (minpoint[0] + maxpoint[0]) / 2 y0 = (minpoint[1] + maxpoint[1]) / 2 else: x0 = (minpoint[0] + 2 * maxpoint[0]) / 3 y0 = (minpoint[1] + 2 * maxpoint[1]) / 3 k1 = -1 / k C1 = y0 - k1 * x0 M1 = math.sqrt(k1 * k1 + 1) do = 500 px, py = 0, 0 for fmt in fmtdloc: dl = abs(k * fmt[0] - fmt[1] + C) / M dl1 = abs(k1 * fmt[0] - fmt[1] + C1) / M1 d = math.sqrt(dl * dl + dl1 * dl1) if d < do: do = d px = fmt[0] py = fmt[1] # print(px,py) px = (px + maxpoint[0]) / 2 py = (py + maxpoint[1]) / 2 return px, py
def get1point(x, y): fmtdevices = connmysql.get_fmtdevice() fmtdloc = [] do = 500 px, py = 0, 0 for index, fmtdevice in fmtdevices.iterrows(): wgsloc = projtrans.bd09_to_wgs84(float(fmtdevice['lon']), float(fmtdevice['lat'])) utmloc = projtrans.wgs2utm(wgsloc[0], wgsloc[1]) fmtdloc.append( [utmloc[0] / 1000, utmloc[1] / 1000, fmtdevice['deviceid']]) for fmt in fmtdloc: dp = math.sqrt((fmt[0] - x)**2 + (fmt[1] - y)**2) if dp > 10 and dp < do: do = dp px = fmt[0] py = fmt[1] px = (2 * x + px) / 3 py = (2 * y + py) / 3 return px, py
def getlineloc(minpoint, maxpoint): fmtdevices = connmysql.get_fmtdevice() fmtdloc = [] for index, fmtdevice in fmtdevices.iterrows(): wgsloc = projtrans.bd09_to_wgs84(float(fmtdevice['lon']), float(fmtdevice['lat'])) utmloc = projtrans.wgs2utm(wgsloc[0], wgsloc[1]) fmtdloc.append( [utmloc[0] / 1000, utmloc[1] / 1000, fmtdevice['deviceid']]) k = (maxpoint[1] - minpoint[1]) / (maxpoint[0] - minpoint[0]) C = minpoint[1] - k * minpoint[0] M = math.sqrt(k * k + 1) do = 500 px, py = 0, 0 if maxpoint[0] > minpoint[0]: for fmt in fmtdloc: if fmt[0] > maxpoint[0]: dl = abs(k * fmt[0] - fmt[1] + C) / M dp = math.sqrt((fmt[1] - maxpoint[1])**2 + (fmt[0] - maxpoint[0])**2) d = math.sqrt(dl * dl + dp * dp) if d < do: do = d px = fmt[0] py = fmt[1] else: for fmt in fmtdloc: if fmt[0] < maxpoint[0]: dl = abs(k * fmt[0] - fmt[1] + C) / M dp = math.sqrt((fmt[1] - maxpoint[1])**2 + (fmt[0] - maxpoint[0])**2) d = math.sqrt(dl * dl + dp * dp) if d < do: do = d px = fmt[0] py = fmt[1] return px, py
def pred_location(fm, starttime, endtime): result = connmysql.get_fmdata(fm, starttime, endtime) data_clean = rssiclean.get_rssidata_c(result) xy_vex = countor_predvex.get_predvex(starttime, endtime) x = [] y = [] z = [] utmloc_0 = [] locpx = 0 locpy = 0 for data in data_clean: wgsloc = projtrans.bd09_to_wgs84(float(data['lon']), float(data['lat'])) wgsloc_0 = projtrans.bd09_to_wgs84(float(data['fmlon']), float(data['fmlat'])) utmloc = projtrans.wgs2utm(wgsloc[0], wgsloc[1]) utmloc_0 = projtrans.wgs2utm(wgsloc_0[0], wgsloc_0[1]) data['lon'], data['lat'] = utmloc[0], utmloc[1] data['fmlon'], data['fmlat'] = utmloc_0[0], utmloc_0[1] x.append(utmloc[0] / 1000) y.append(utmloc[1] / 1000) z.append(data['db']) print(utmloc_0) print(z) print(x) print(y) if len(z) < 8 and max(z) > -45 and max(z) < -40: print(max(z)) zindex = z.index(max(z)) locpx, locpy = x[zindex], y[zindex] print( '距离差', math.sqrt((y[zindex] * 1000 - utmloc_0[1])**2 + (x[zindex] * 1000 - utmloc_0[0])**2)) elif len(z) < 7: print(max(z)) zindex = z.index(max(z)) print(x[zindex], y[zindex]) print( '距离差', math.sqrt((y[zindex] * 1000 - utmloc_0[1])**2 + (x[zindex] * 1000 - utmloc_0[0])**2)) else: points = [] px = [] py = [] for i in range(len(x)): point = [] point.append(x[i]) px.append(x[i]) point.append(y[i]) py.append(y[i]) points.append(point) points = np.array(points) print(utmloc_0) print("X的差值:", max(x) - min(x)) print("Y的差值:", max(y) - min(y)) print("Z的max:", max(z)) xinternal = 0.1 yinternal = 0.1 xstep = int((max(x) - min(x)) / xinternal) ystep = int((max(y) - min(y)) / yinternal) xxi = np.linspace(min(x), max(x), xstep) yyi = np.linspace(min(y), max(y), ystep) xi, yi = np.meshgrid(xxi, yyi) # print("xymeshgrid",xi, yi) zi = griddata(points, z, (xi, yi), method='cubic') #, fill_value=-10 # print(xi.shape,yi.shape, zi.shape[0],zi.shape[1]) locpreds = [] zpred = [] pi = 0 while pi < len(px): locx = int((px[pi] - min(x)) // xinternal) locy = int((py[pi] - min(y)) // yinternal) # print(locx,locy) temp = 0 while locx < len(xxi) - 1 and locy < len(yyi) - 1: if zi[locy][locx] < zi[locy + 1][locx]: locy += 1 elif zi[locy][locx] < zi[locy][locx + 1]: locx += 1 elif zi[locy][locx] < zi[locy - 1][locx]: locy -= 1 elif zi[locy][locx] < zi[locy][locx - 1]: locx -= 1 else: # print(locx, locy) print(zi[locy][locx]) if abs(zi[locy][locx] - max(z)) < 5 or zi[locy][locx] > max(z): locpreds.append([ min(x) + locx * xinternal, min(y) + locy * yinternal ]) break pi += 1 locpred = np.array(list(set([tuple(t) for t in locpreds]))) locpx = 0 locpy = 0 count = 0 # for locp in locpreds: # vexp = math.sqrt((locp[1]*1000-utmloc_0[1])**2+(locp[0]*1000-utmloc_0[0])**2) # print(locp, vexp) # print("------------------") resdata = [] for locp in locpred: count = 0 for locps in locpreds: # print((np.array(locp)==np.array(locps)).all()) if (np.array(locp) == np.array(locps)).all(): count += 1 print(locp, count) locpx += locp[0] * count locpy += locp[1] * count if len(locpreds) > 0: locpx = locpx / len(locpreds) locpy = locpy / len(locpreds) # print(locpx, locpy) # print(math.sqrt((locpy*1000-utmloc_0[1])**2+(locpx*1000-utmloc_0[0])**2)) print(locpx, locpy) print( '距离差', math.sqrt((locpy * 1000 - utmloc_0[1])**2 + (locpx * 1000 - utmloc_0[0])**2)) print(xy_vex) locpx -= xy_vex[0] locpy -= xy_vex[1] print(locpx, locpy) print( '距离差', math.sqrt((locpy * 1000 - utmloc_0[1])**2 + (locpx * 1000 - utmloc_0[0])**2))
def get_predvex(starttime, endtime): fmdatas = ['93.4', '94', '99'] #['87.9', '93.4', '91.4', '89.9', '107.7'] x_vex = 0 y_vex = 0 lenfm = 0 for fmdata in fmdatas: try: result = connmysql.get_fmdata(fmdata, starttime, endtime) data_clean, deviceids = rssiclean.get_rssidata_c(result, dbmax=-40, dbmin=-95) x = [] y = [] z = [] utmloc_0 = [] for data in data_clean: if data['lon'] is not None and float(data['lon']) > 100: wgsloc = projtrans.bd09_to_wgs84(float(data['lon']), float(data['lat'])) utmloc = projtrans.wgs2utm(wgsloc[0], wgsloc[1]) data['lon'], data['lat'] = utmloc[0], utmloc[1] x.append(utmloc[0] / 1000) y.append(utmloc[1] / 1000) z.append(data['db']) if data['fmlon'] is not None and float(data['fmlon']) > 100: wgsloc_0 = projtrans.bd09_to_wgs84(float(data['fmlon']), float(data['fmlat'])) utmloc_0 = projtrans.wgs2utm(wgsloc_0[0], wgsloc_0[1]) data['fmlon'], data['fmlat'] = utmloc_0[0], utmloc_0[1] points = [] px = [] py = [] for i in range(len(x)): point = [] point.append(x[i]) px.append(x[i]) point.append(y[i]) py.append(y[i]) points.append(point) points = np.array(points) # print(utmloc_0) # print("X的差值:",max(x)-min(x)) # print("Y的差值:",max(y)-min(y)) # print("Z的max:",max(z)) xinternal = 0.1 yinternal = 0.1 xstep = int((max(x) - min(x)) / xinternal) ystep = int((max(y) - min(y)) / yinternal) xxi = np.linspace(min(x), max(x), xstep) yyi = np.linspace(min(y), max(y), ystep) xi, yi = np.meshgrid(xxi, yyi) # print("xymeshgrid",xi, yi) zi = griddata(points, z, (xi, yi), method='cubic') #, fill_value=-10 # print(xi.shape,yi.shape, zi.shape[0],zi.shape[1]) locpreds = [] # zpred = [] pi = 0 while pi < len(px): locx = int((px[pi] - min(x)) // xinternal) locy = int((py[pi] - min(y)) // yinternal) # print(locx,locy) # temp = 0 while locx < len(xxi) - 1 and locy < len(yyi) - 1: if zi[locy][locx] < zi[locy + 1][locx]: locy += 1 elif zi[locy][locx] < zi[locy][locx + 1]: locx += 1 elif zi[locy][locx] < zi[locy - 1][locx]: locy -= 1 elif zi[locy][locx] < zi[locy][locx - 1]: locx -= 1 else: # print(locx, locy) # print(zi[locy][locx]) if abs(zi[locy][locx] - max(z)) < 1 or zi[locy][locx] > max(z): locpreds.append([ min(x) + locx * xinternal, min(y) + locy * yinternal ]) break pi += 1 locpred = np.array(list(set([tuple(t) for t in locpreds]))) locpx = 0 locpy = 0 count = 0 # for locp in locpreds: # vexp = math.sqrt((locp[1]*1000-utmloc_0[1])**2+(locp[0]*1000-utmloc_0[0])**2) # print(locp, vexp) # print("------------------") # resdata = [] for locp in locpred: count = 0 for locps in locpreds: # print((np.array(locp)==np.array(locps)).all()) if (np.array(locp) == np.array(locps)).all(): count += 1 # print(locp, count) locpx += locp[0] * count locpy += locp[1] * count if len(locpreds) > 0: locpx = locpx / len(locpreds) locpy = locpy / len(locpreds) # print(math.sqrt((locpy*1000-utmloc_0[1])**2+(locpx*1000-utmloc_0[0])**2)) print("1", x_vex, y_vex, locpx - utmloc_0[0] / 1000, (locpy - utmloc_0[1] / 1000)) if locpx > 300: x_vex += (locpx - utmloc_0[0] / 1000) y_vex += (locpy - utmloc_0[1] / 1000) lenfm += 1 except: pass # print("+",x_vex,y_vex) print("vex:", x_vex, y_vex, lenfm) if lenfm > 0: x_vex = x_vex / lenfm y_vex = y_vex / lenfm print("vex", x_vex, y_vex) return [x_vex, y_vex]
def pred_location(fm, starttime, endtime): try: result = connmysql.get_fmdata(fm, starttime, endtime) data_clean, deviceids = rssiclean.get_rssidata_c(result) xy_vex = cpo.get_predvex(starttime, endtime) x = [] y = [] z = [] utmloc_0 = [] locpx = 0 locpy = 0 points = [] px = [] py = [] typenum = 0 for data in data_clean: # print(data['lon']) if data['lon'] is not None and float(data['lon']) > 100: wgsloc = projtrans.bd09_to_wgs84(float(data['lon']), float(data['lat'])) utmloc = projtrans.wgs2utm(wgsloc[0], wgsloc[1]) data['lon'], data['lat'] = utmloc[0], utmloc[1] x.append(utmloc[0] / 1000) y.append(utmloc[1] / 1000) z.append(data['db']) # print("1") # print(data) try: if float(data['fmlon']) > 100: wgsloc_0 = projtrans.bd09_to_wgs84(float(data['fmlon']), float(data['fmlat'])) utmloc_0 = projtrans.wgs2utm(wgsloc_0[0], wgsloc_0[1]) data['fmlon'], data['fmlat'] = utmloc_0[0], utmloc_0[1] except: pass # print(utmloc_0) # print(z) # print(x) # print(y) for i in range(len(x)): point = [] point.append(x[i]) px.append(x[i]) point.append(y[i]) py.append(y[i]) points.append(point) points = np.array(points) # print("X的差值:",max(x)-min(x)) # print("Y的差值:",max(y)-min(y)) # print("Z的max:",max(z)) if len(z) == 1: locpx, locpy = getlinloc.get1point(x[0], y[0]) typenum = 5 # print(locpx, locpy) elif len(z) == 2: locpx, locpy = getlinloc.get2point(points, z) typenum = 4 # print(locpx, locpy) # if len(utmloc_0)>0: # print(utmloc_0) # print('距离差', math.sqrt((locpy*1000-utmloc_0[1])**2+(locpx*1000-utmloc_0[0])**2)) elif len(z) > 2 and len(z) < 4: zminindex = z.index(min(z)) zmaxindex = z.index(max(z)) pnearx, pneary = getlinloc.getlineloc(points[zminindex], points[zmaxindex]) # print(pnearx, pneary) # print(points[zmaxindex][0], points[zmaxindex][1]) locpx = (points[zmaxindex][0] + pnearx) / 2 locpy = (points[zmaxindex][1] + pneary) / 2 typenum = 4 # print(locpx, locpy) # if len(utmloc_0)>0: # print(utmloc_0) # print('距离差', math.sqrt((locpy*1000-utmloc_0[1])**2+(locpx*1000-utmloc_0[0])**2)) else: xinternal = 0.1 yinternal = 0.1 xstep = int((max(x) - min(x)) / xinternal) ystep = int((max(y) - min(y)) / yinternal) xxi = np.linspace(min(x), max(x), xstep) yyi = np.linspace(min(y), max(y), ystep) xi, yi = np.meshgrid(xxi, yyi) # print("xymeshgrid",xi, yi) zi = griddata(points, z, (xi, yi), method='cubic') #, fill_value=-10 # print(xi.shape,yi.shape, zi.shape[0],zi.shape[1]) # zminindex = z.index(min(z)) # zmaxindex = z.index(max(z)) # lineparam = cj.IsCircle(points[zminindex], points[zmaxindex],min(x),max(x), xxi.tolist(), yyi.tolist(), zi) # if len(z)<8 and max(z)>-45 and max(z)<-40: # # print(max(z)) # zindex = z.index(max(z)) # locpx, locpy = x[zindex], y[zindex] # print(locpx,locpy) # if len(utmloc_0)>0: # print('距离差', math.sqrt((y[zindex]*1000-utmloc_0[1])**2+(x[zindex]*1000-utmloc_0[0])**2)) # elif len(z)<7: # # print(max(z)) # zindex = z.index(max(z)) # print(x[zindex], y[zindex]) # if len(utmloc_0)>0: # print('距离差', math.sqrt((y[zindex]*1000-utmloc_0[1])**2+(x[zindex]*1000-utmloc_0[0])**2)) # else: locpreds = [] # zpred = [] pi = 0 while pi < len(px): locx = int((px[pi] - min(x)) // xinternal) locy = int((py[pi] - min(y)) // yinternal) # print(locx,locy) # temp = 0 while locx < len(xxi) - 1 and locy < len(yyi) - 1: if zi[locy][locx] < zi[locy + 1][locx]: locy += 1 elif zi[locy][locx] < zi[locy][locx + 1]: locx += 1 elif zi[locy][locx] < zi[locy - 1][locx]: locy -= 1 elif zi[locy][locx] < zi[locy][locx - 1]: locx -= 1 else: # mx, my = min(x)+locx*xinternal, min(y)+locy*yinternal # print(min(x), min(y)) # print(zi[locy][locx]) if locx > 50 and locy > 50 and locx < len( xxi) - 50 and locy < len(yyi) - 50: if abs(zi[locy][locx] - max(z)) < 5 or zi[locy][locx] > max(z): locpreds.append([ min(x) + locx * xinternal, min(y) + locy * yinternal ]) break pi += 1 if len(locpreds) > 0: #and len(z)>=6 locpred = np.array(list(set([tuple(t) for t in locpreds]))) locpx = 0 locpy = 0 count = 0 # for locp in locpreds: # vexp = math.sqrt((locp[1]*1000-utmloc_0[1])**2+(locp[0]*1000-utmloc_0[0])**2) # print(locp, vexp) # print("------------------") # resdata = [] for locp in locpred: count = 0 for locps in locpreds: # print((np.array(locp)==np.array(locps)).all()) if (np.array(locp) == np.array(locps)).all(): count += 1 # print(locp, count) locpx += locp[0] * count locpy += locp[1] * count if len(locpreds) > 0: locpx = locpx / len(locpreds) locpy = locpy / len(locpreds) # print("0",locpx, locpy) # print(xy_vex) locpx -= xy_vex[0] locpy -= xy_vex[1] typenum = 1 # print("1",locpx, locpy) # if len(utmloc_0)>0: # print(utmloc_0) # print('距离差', math.sqrt((locpy*1000-utmloc_0[1])**2+(locpx*1000-utmloc_0[0])**2)) else: # print(locpx, locpy) # print(math.sqrt((locpy*1000-utmloc_0[1])**2+(locpx*1000-utmloc_0[0])**2)) # print(locpx, locpy) # if len(utmloc_0)>0: # print('距离差', math.sqrt((locpy*1000-utmloc_0[1])**2+(locpx*1000-utmloc_0[0])**2)) # print(xy_vex) zminindex = z.index(min(z)) zmaxindex = z.index(max(z)) pnearx, pneary = getlinloc.getlineloc(points[zminindex], points[zmaxindex]) # print(pnearx, pneary) # print(points[zmaxindex][0], points[zmaxindex][1]) locpx = (points[zmaxindex][0] + pnearx) / 2 locpy = (points[zmaxindex][1] + pneary) / 2 typenum = 2 # print(locpx, locpy) # if len(utmloc_0)>0: # print('距离差', math.sqrt((locpy*1000-utmloc_0[1])**2+(locpx*1000-utmloc_0[0])**2)) # if max(z)>-45 :#and max(z)<-40 # # print(max(z)) # zindex = z.index(max(z)) # locpx, locpy = x[zindex], y[zindex] # typenum = 2 # print(locpx,locpy) # if len(utmloc_0)>0: # print('距离差', math.sqrt((y[zindex]*1000-utmloc_0[1])**2+(x[zindex]*1000-utmloc_0[0])**2)) # else: # # print(max(z)) # zindex = z.index(max(z)) # print(x[zindex], y[zindex]) # if len(utmloc_0)>0: # print('距离差', math.sqrt((y[zindex]*1000-utmloc_0[1])**2+(x[zindex]*1000-utmloc_0[0])**2)) # else: # xx = np.linspace(lineparam[1] ,lineparam[3] ,10000) # yy = np.float(lineparam[0])*(xx-np.float(lineparam[1]))+ np.float(lineparam[2]) # plt.plot(xx, yy, color='red') # plt.contourf(xi,yi,zi,8,alpha=1,cmap=plt.cm.hsv)#画上颜色 # c = plt.contour(xi,yi,zi,[0,10]) #等高线绘制 # plt.plot(px,py,'ro') # # plt.plot(utmloc_0[0]/1000,utmloc_0[1]/1000,'yo') # # 线条标注的绘制 # plt.clabel(c,inline=True,fontsize=10) # # plt.show() # # fig = plt.figure() # ax = plt.axes(projection='3d') # ax.contour3D(xi, yi, zi, 50, cmap='CMRmap') # ax.set_xlabel('x') # ax.set_ylabel('y') # ax.set_zlabel('z') # #调整观察角度和方位角。这里将俯仰角设为60度,把方位角调整为35度 # ax.view_init(60, 35) # plt.show() # plt.plot(px,py,'ro') # plt.plot(utmloc_0[0]/1000,utmloc_0[1]/1000,'yo') # plt.plot(locpx, locpy, "r+") # plt.show() wgs = projtrans.utm2wgs(locpx * 1000, locpy * 1000) bd = projtrans.wgs84_to_bd09(wgs[0], wgs[1]) return [fm, bd[0], bd[1], deviceids, typenum] except: return [fm, None, None, deviceids, 0]