Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
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))
Esempio n. 5
0
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]
Esempio n. 6
0
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]