Esempio n. 1
0
def map():
    user_flag = 0
    db = DB()
    # 今までに発生した事件を取得
    sql = 'select * from occur;'
    occurdata = db.select(sql)
    # safeguardの家の場所を取得
    sql = 'select * from safeguard;'
    safeguarddata = db.select(sql)
    # ログインしている(マップを見る)ユーザー情報取得(parent)
    sql = ('select buzzer_num,parent_lat,parent_lon,parent_name'
           ' from parent where parent_ID=%s;')
    inuserdata = db.select(sql, (current_user.id, ))
    if inuserdata == []:  # parentではないときsafeguardの処理
        user_flag = 1
        sql = ('select safeguard_ID,safeguard_lat,safeguard_lon,safeguard_name'
               ' from safeguard where safeguard_ID=%s;')
        inuserdata = db.select(sql, (current_user.id, ))
    # map表示用(JavaScript)に渡す用のJson作成
    create_json = cj.My_Json()
    data = create_json.data_molding(0, occurdata, 1, safeguarddata, inuserdata,
                                    user_flag)
    db.end_DB()
    # マップ表示
    return render_template('map_display.html',
                           data=data,
                           name=inuserdata[0][3])
Esempio n. 2
0
def ab_map():
    if request.method == 'POST':
        buzzer_num = request.form['buzzer_num']
        nowtime = request.form['nowtime'].replace(' ', '-')
    db = DB()
    regular_latlon_sql = ("select * from regular_data "
                          "where date_format(regular_time, \'%Y-%m-%d\')"
                          "=date_format(\'{0}\',\'%Y-%m-%d\') and "
                          "buzzer_num=\'{1}\'").format(nowtime, buzzer_num)
    regular_latlon = db.select(regular_latlon_sql)
    create_json = cj.My_Json()
    abjson = create_json.abnormal_json(regular_latlon)
    db.end_DB()
    return render_template('map_display.html', data=abjson, name='異常検知')
Esempio n. 3
0
def map():
    user_flag = 0
    db = DB()
    # 今までに発生した事件を取得
    sql = 'select * from occur;'
    occurdata = db.select(sql)
    # safeguardの家の場所を取得
    sql = 'select * from safeguard;'
    safeguarddata = db.select(sql)
    # ログインしている(マップを見る)ユーザー情報取得(parent)
    sql = ('select buzzer_num,parent_lat,parent_lon,parent_name'
           ' from parent where parent_ID=%s;')
    inuserdata = db.select(sql, (current_user.id, ))
    if not inuserdata:  # parentではないときsafeguardの処理
        user_flag = 1
        sql = ('select safeguard_ID,safeguard_lat,safeguard_lon,safeguard_name'
               ' from safeguard where safeguard_ID=%s;')
        inuserdata = db.select(sql, (current_user.id, ))
    # map表示用(JavaScript)に渡す用のJson作成
    create_json = cj.My_Json()
    data = create_json.data_molding(0, occurdata, 1, safeguarddata, inuserdata,
                                    user_flag)
    db.end_DB()
    error_text = None
    try:
        is_error = request.args.get('is_error')
        if int(is_error):
            error_text = "すべての項目を入力してください"
        # マップ表示
        return render_template('map_display.html',
                               data=data,
                               name=inuserdata[0][3],
                               error_text=error_text)
    except:
        return render_template('map_display.html',
                               data=data,
                               name='ログイン中 : ' + inuserdata[0][3] + 'さん')
Esempio n. 4
0
def get_wio_data():
    if request.method == 'GET':
        wio_lat = float(request.args.get('lat'))
        wio_lon = float(request.args.get('lon'))
        flag = int(request.args.get('flag'))
        parent_ID = request.args.get('parent_ID')
        buzzer_num = request.args.get('buzzer_num')

    if request.method == 'POST':
        wio_lat = float(request.form['lat'])
        wio_lon = float(request.form['lon'])
        flag = int(request.form['flag'])
        parent_ID = request.form['parent_ID']
        buzzer_num = request.form['buzzer_num']

    if wio_lat == 0:
        wio_lat = 31
    if wio_lon == 0:
        wio_lon = 131

    # latlonを住所変換
    occur_address = cj.iktoaddress(wio_lat, wio_lon)
    if occur_address is None:
        occur_address = 'address'
    # 現在時刻の取得
    jtz = pytz.timezone('Asia/Tokyo')
    nowtime = datetime.now(jtz).strftime('%Y-%m-%d %H-%M-%S')

    mail = My_Mail(app)
    db = DB()

    # ブザーの持ち主(保護者)のデータを取得し送信
    sql = ('select parent_name,parent_mail_address from parent'
           ' where parent_ID=%s')
    pdata = db.select(sql, (parent_ID, ))

    # 定期通信用
    if flag == 0:
        # 危険エリア最適化
        area_flag = 0
        # 危険エリアに入っているか
        sql = ('select occur_ID,area_concentration from Hazardous_area'
               ' where area_a_lat>=%s and area_b_lat<=%s and area_a_lon<=%s'
               ' and area_b_lon>=%s and miss_flag!=1')
        data = (
            wio_lat,
            wio_lat,
            wio_lon,
            wio_lon,
        )
        area_data = db.select(sql, data)
        # 危険エリアに入っていたら
        if area_data:
            for ac in area_data:
                acon_dict = json.loads(ac[1])
                for i in range(1, 6):
                    for j in range(1, 6):
                        key = 'co' + str(i) + str(j)
                        # メッシュ化したマスのどこかを調べる
                        if acon_dict[key][0][0] <= wio_lon and \
                           acon_dict[key][0][1] >= wio_lon and \
                           acon_dict[key][1][0] >= wio_lat and \
                           acon_dict[key][1][1] <= wio_lat:
                            # 濃度を減らす
                            acon_dict[key][2] = acon_dict[key][2] - 1
                            area_flag = 1
                # DBの濃度情報を更新
                sql = ('update Hazardous_area set area_concentration=%s'
                       ' where occur_ID=%s')
                data = (
                    json.dumps(acon_dict),
                    ac[0],
                )
                db.insert_update(sql, data)

        # 家または学校の情報をとる
        school_house_sql = ('select parent_lat,parent_lon,'
                            'school_lat,school_lon from parent'
                            ' where parent_ID=%s')
        school_house_data = db.select(school_house_sql, (parent_ID, ))
        # 学校から現在地の距離を計算
        cd = CalcDistance([[
            school_house_data[0][0], school_house_data[0][1], 'name', 'address'
        ]])
        school_dis = cd.cal_rho(wio_lat, wio_lon)
        # 家から現在地の距離を計算
        cd = CalcDistance([[
            school_house_data[0][2], school_house_data[0][3], 'name', 'address'
        ]])
        home_dis = cd.cal_rho(wio_lat, wio_lon)
        if float(school_dis[0]) >= 100 or float(home_dis[0]) >= 50:
            if area_flag == 1:
                area_flag = 4
            else:
                area_flag = 3

        # 異常検知
        knn = KNN2d(buzzer_num)
        result = knn.main(wio_lat, wio_lon)
        if result:
            # メール送信
            mail.ab_send_mail(pdata, nowtime, occur_address, buzzer_num)

        # 異常検知用のDBに入れる
        sql = "insert into regular_data value (%s,%s,%s,%s)"
        data = (
            buzzer_num,
            wio_lat,
            wio_lon,
            nowtime,
        )
        db.insert_update(sql, data)
        db.end_DB()
        return str(area_flag)

    # ボタンが押された用
    elif flag:
        sql = 'select * from occur'
        lendata = len(db.select(sql))
        # 事件をoccurに保存
        sql = ('insert into occur(occur_ID,parent_ID,buzzer_num,occur_lat,'
               'occur_lon,occur_time,occur_address)'
               ' value (%s,%s,%s,%s,%s,%s,%s)')
        data = (
            lendata + 1,
            parent_ID,
            buzzer_num,
            wio_lat,
            wio_lon,
            nowtime,
            occur_address,
        )
        db.insert_update(sql, data)
        # 保存した事件のoccur_IDを取得
        sql = ('select occur_ID from occur'
               ' where parent_ID=%s and occur_lat=%s and occur_lon=%s')
        data = (
            parent_ID,
            wio_lat,
            wio_lon,
        )
        occur_ID = db.select(sql, data)[-1][0]
        # 保護者にメール送信
        mail.pbz_send_mail(pdata, nowtime, occur_address, occur_ID, parent_ID,
                           buzzer_num, wio_lat, wio_lon)
        # safeguardの情報取得
        sql = ('select'
               ' safeguard_lat,safeguard_lon,'
               'safeguard_name,safeguard_mail_address'
               ' from safeguard')
        sdata = db.select(sql)
        cd = CalcDistance(sdata)
        # 発生地点から500m以内にある家のリストを取得し、送信
        s_namail_list = cd.choice_senduser(cd.cal_rho(wio_lat, wio_lon))
        if s_namail_list:
            mail.sbz_send_mail(s_namail_list, nowtime, occur_address, wio_lat,
                               wio_lon)
        # 対角の座標取得(発生地点を中心)
        edge_ab = great_circle(distance=100 * math.sqrt(2),
                               azimuth=[135, -45],
                               latitude=wio_lat,
                               longitude=wio_lon)
        # 濃度を保持するJsonの作成
        create_json = cj.My_Json()
        coo_dict = create_json.concentration_json(edge_ab)
        # JsonをHazardous_areaに保存
        sql = ('insert into Hazardous_area'
               '(occur_ID,area_a_lat,area_a_lon,'
               'area_b_lat,area_b_lon,area_concentration)'
               'value (%s,%s,%s,%s,%s,%s)')
        data = (
            occur_ID,
            coo_dict['a'][0],
            coo_dict['a'][1],
            coo_dict['b'][0],
            coo_dict['b'][1],
            json.dumps(coo_dict['latlon']),
        )
        db.insert_update(sql, data)
        db.end_DB()
        return '2'
    return '0'