>

먼저 플라스크 앱을 사용하고 있습니다. 이 코드를 사용하여 자바 스크립트에서 뒤로 데이터를 수집합니다.

@app.route('/getFormData', methods=['POST'])
def get_javascript_data():
    params = request.json
    sunElevation = params['sunElevation']
    cloudCoverage = params['cloudCoverage']
    thresholdNDVI = params['thresholdNDVI']
    limitScene = params['limitScene']
    city = params['city']
    coords = params['coords']
    data_search = passData(sunElevation, cloudCoverage, thresholdNDVI, limitScene, city, coords)
    run_script = passData.calcul(data_search)
    return jsonify(data_search.data_dict)

여기 내 계산법이 있습니다 :

class passData():
    def __init__(self, sunElevation, cloudCoverage, thresholdNDVI, limitScene, city, coords):
        self.sunElevation = sunElevation
        self.cloudCoverage = cloudCoverage
        self.thresholdNDVI = thresholdNDVI
        self.limitScene = limitScene
        self.city = city
        self.coords = coords
        self.coords.append(self.coords[0])
        self.data_dict = [{'sunElevation':self.sunElevation,
                            'cloudCoverage':self.cloudCoverage,
                            'thresholdNDVI':self.thresholdNDVI,
                            'limitScene':self.limitScene,
                            'city':self.city,
                            'coords':self.coords
                            }]
    def calcul(self):
        main_script(self.sunElevation, self.cloudCoverage, self.thresholdNDVI, self.limitScene, self.city, self.coords)
        return (print("traitement terminé"))

결국 ndvi 데이터는 테이블 이름 'ndvi_ + city'로 데이터베이스에 저장됩니다. 이 모든 것이 잘 작동하지만 결과를 시각화하기 위해이 데이터를 앞쪽으로 다시 보내려는 경우 사용하는 경로는 다음과 같습니다

@app.route('/ndviAuto')
def get_ndviAuto():
    query = select([NdviAuto.ogc_fid.label('ogc_fid'), func.ST_AsGeoJSON(func.ST_Transform(NdviAuto.wkb_geometry,4326)).label('wkb_geometry')]).where(NdviAuto.wkb_geometry!=None)
    dataQuery = db.session.execute(query).fetchall()
    data_all = []
    for ndvi in dataQuery:
        ndvi = dict(ndvi)
        data_all.append({
                    'type': 'Feature',
                    'properties':{
                            'id':ndvi['ogc_fid'],
                        },
                        'geometry':json.loads(ndvi['wkb_geometry'])
                        })
    return jsonify(data_all)

그렇게하기 위해 NdviAuto 클래스를 다음과 같이 정의했습니다 :

class NdviAuto(db.Model):
    __tablename__ = 'ndvi_' // + city ?
    ogc_fid = db.Column(db.Integer, primary_key=True)
    wkb_geometry = db.Column(Geometry(geometry_type='POLYGON', srid=32631))

내 문제는 올바른 테이블을 자동으로 얻기 위해 'city'값을 사용 하여이 클래스를 구성하는 방법을 모른다는 것입니다. 지금은 데이터를 다시 보내는 경로가 작동하지만 매번 테이블 이름을 변경해야합니다. postgreSQL 데이터베이스를 사용합니다.

  • 답변 # 1

    __tablename__ 를 수정할 수 없습니다  선언적 클래스가 작성된 후 속성 또는 다른 말로 할 수는 있지만 아무런 영향을 미치지 않습니다. 와이즈 비즈  오브젝트가 이미 작성되어 Table 에 지정되었습니다.  속성 및 메타 데이터. 선언적 __table__  또한 생성 된 클래스의 레지스트리를 유지하므로 다른 테이블로 클래스를 재정의 할 때 경고가 표시되며 문자열 클래스 이름을 사용하는 미래 관계 등이 재정의를 나타냅니다. 일반적으로 항상 그런 것은 아니지만 동적 테이블 이름을 갖는 것은 DB 디자인에 문제가 있음을 나타냅니다.

    동적 테이블이 이미 있으므로 경량 Base 를 사용할 수 있습니다.  그리고 table()  완전 선언 클래스 또는 column() 대신 구문  인스턴스. 올바른 경량 테이블을 생성하는 도우미 함수를 만들고 다음을 사용하십시오.

    Table
    
    

    그러면보기 :

    def ndvi_auto(city):
        return table(
            'ndvi_{}'.format(city),
            column('ogc_fid', db.Integer),
            column('wkb_geometry', Geometry(geometry_type='POLYGON',
                                            srid=32631)))
    
    

    @app.route('/ndviAuto') def get_ndviAuto(): ndvi_table = ndvi_auto('some_city') query = select([ndvi_table.c.ogc_fid, func.ST_AsGeoJSON( func.ST_Transform( ndvi_table.c.wkb_geometry, 4326 ) ).label('wkb_geometry')]).\ where(ndvi_table.c.wkb_geometry != None) result = db.session.execute(query) data = [{'type': 'Feature', 'properties': { 'id': ndvi.ogc_fid }, 'geometry': json.loads(ndvi.wkb_geometry)} for ndvi in result] return jsonify(data)

관련 자료

  • 이전 javascript - D3js에서 노드를 가리키면 여러 노드의 툴팁 표시
  • 다음 rust - 언제 타입 어노테이션으로 명시해야합니까?