python-2.7
  • list
  • pickle
  • qgis
  • cpython
  • 2017-09-03 2 views -1 likes 
    -1

    모든 x ad y 좌표 (래스터 레이어의 각 픽셀 중앙에 위치)를 텍스트 파일의 목록으로 저장하려고합니다. 먼저 테스트를 위해 코드 아래에 올바른 코드를 작성합니다.목록을 텍스트 파일로 저장하는 방법은 무엇입니까?

    import os 
    import pickle 
    
    mylist = [(12, 25), (65, 96), (10, 15)] 
    
    path = r"data/listfile" 
    
    file = 'file.txt' 
    
    if not os.path.exists(path): 
        os.makedirs(path) 
    
    
    with open(os.path.join(path, file), 'wb') as handle: 
        pickle.dump(mylist, handle) 
    
    with open(os.path.join(path, file), 'rb') as handle: 
        aa = pickle.loads(handle.read()) 
    print aa 
    

    다음 단계에서는이 코드를 실제 래스터 레이어로 사용했습니다. 그 코드의 MCVE는 다음과 같습니다

    from qgis.core import * 
    from PyQt4 import * 
    import os 
    import pickle 
    
    ds = QgsRasterLayer("/LData/Pop/lorst.tif", "Raster") 
    
    pixelWidth = ds.rasterUnitsPerPixelX() 
    pixelHeight = ds.rasterUnitsPerPixelY() 
    originX, originY = (ext.xMinimum(), ext.yMinimum()) 
    src_cols = ds.width() 
    src_rows = ds.height() 
    
    path = r"LData/Pop" 
    
    file = 'List.txt' 
    
    if not os.path.exists(path): 
        os.makedirs(path) 
    
    
    def pixel2coord(x, y): 
        xp = (pixelWidth * x) + originX + (pixelWidth/2) 
        yp = (pixelHeight * y) + originY + (pixelHeight/2) 
        return QgsPoint(xp, yp) 
    
    list =[] 
    
    for i in range(0, src_cols): 
        for j in range(0, src_rows): 
         rspnt = pixel2coord(i, j) 
         list.append(rspnt) 
    
    with open(os.path.join(path, file), 'wb') as handle: 
        pickle.dump(list, handle) 
    
    with open(os.path.join(path, file), 'rb') as handle: 
        lst = pickle.loads(handle.read()) 
    

    하지만이 오류 접수 :

    Traceback (most recent call last): 
        File "<input>", line 1, in <module> 
        File "/tmp/tmp4rPKQ_.py", line 70, in <module> 
        pickle.dump(pntRstList, handle) 
        File "/usr/lib/python2.7/pickle.py", line 1376, in dump 
        Pickler(file, protocol).dump(obj) 
        File "/usr/lib/python2.7/pickle.py", line 224, in dump 
        self.save(obj) 
        File "/usr/lib/python2.7/pickle.py", line 286, in save 
        f(self, obj) # Call unbound method with explicit self 
        File "/usr/lib/python2.7/pickle.py", line 606, in save_list 
        self._batch_appends(iter(obj)) 
        File "/usr/lib/python2.7/pickle.py", line 621, in _batch_appends 
        save(x) 
        File "/usr/lib/python2.7/pickle.py", line 306, in save 
        rv = reduce(self.proto) 
        File "/usr/lib/python2.7/copy_reg.py", line 71, in _reduce_ex 
        state = base(self) 
    TypeError: the sip.wrapper type cannot be instantiated or sub-classed 
    

    텍스트 파일로 XY 목록을 변환 할 수있는 방법이 있나요를 다시 숫자 형식이 str에하지에 읽어?

    +0

    당신은 아마 당신의 자신의 일 직렬화를하고있는 (그리고 구문 분석)을 코딩 할 필요가 –

    +3

    '때문에 sip.wrapper 쉽게 튜플의리스트에 같은 지점의 목록을 변환 할 수 있습니다 말했다 '인스턴스화 할 수 없거나 하위 클래스로 분류 할 수 없습니다. 다른 것으로 교체해야합니다. 그러나 질문에 MCVE를 제공하지 않으므로이 질문에 답할 수 없습니다. –

    +2

    또한 텍스트 파일에 저장하지 않고 그 사전에서 피클 오류가 발생하지 않습니다 –

    답변

    1

    가장 쉬운 방법은 QgsPoint(xp, yp)을 사용하지 말고 대신 튜플을 사용하는 것입니다 (예 : (xp, yp)). QgsPoint은 C++ 클래스의 SIP 래퍼입니다. SIP 래퍼는 산세에 대해 알지 못합니다.

    Note

    The tuples (x,y) are not real tuples, they are QgsPoint objects, the values are accessible with x() and y() methods.

    그들은 단지 튜플처럼 보이지만 그들이 튜플처럼 아무것도, 당신도 개인이 t[0] 좌표에 액세스 할 수 없습니다 위치 :

    주의는 또한 pyqgis documentation이 말한다.

    당신이

    lst = [(p.x(), p.y()) for p in lst] 
    pickle.dump(lst, handle) 
    
    +0

    매우 감사합니다 :), 당신은 전문 프로그래머입니다. – nickan

    +0

    답변을 기반으로 저장된 파일을 읽는 올바른 방법은 무엇입니까? 만약 내가'(x, y)'가 아닌'x()와 y()'로 읽고 싶다면. 새로운 질문에서 이것을 묻는 것을 선호합니까? – nickan

    +1

    @nickan 파일을 읽으면 QgsPoints가 아닌 튜플이됩니다. –

    관련 문제