PilotGaea O'View Map Server API for Python

使用 PilotGaea O'View Map Server API for Python 在 Python 中處理O'View Map Server發布的地圖和地理空間數據。
這個library可讀取、編輯、分析、上架由O'View Map Server發布之地圖圖像與向量資料,並可透過API操作輸出及發佈處理後的成果。
此library只支援由 O'View Map Server 發佈的圖資,暫不支援外部資料處理。

安裝PliotGaea Python Module

pip install OViewPy

安裝Server端Plugin

由於需要透過O'View Map Server 取得圖資,所以需要先安裝相關的Plugin。
相關的Plugin放置於安裝目錄下的Python資料夾下(C:\Program Files\PilotGaea\TileMap\Python)。
請將資料夾內的dll檔複製進安裝目錄下的plugins資料夾內(C:\Program Files\PilotGaea\TileMap\plugins),並重新啟動Server即可完成安裝。

初始化Server物件

本章節為PliotGaea Python Module的起始點,在執行所有操作前須先初始化Server物件,提供Module取得Map Server資源的相關連線資訊。

from OViewPy.server import Server

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")

綁定Server物件後,即可取得Server相關資訊。

from OViewPy.server import Server

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 取得目前Server版本
print("OView Map Server Version:",server.version)
# 取得WMTS URL
print("WMTS URL:",server.wmtsURL)
# 取得WMS URL
print("WMS URL:",server.wmsURL)
# 取得DoCommand URL
print("DoCommand URL:",server.docmdURL)

取得圖層列表

綁定Server物件後,可透過getLayerList取得2D圖層列表詳細資訊。
亦可使用getOViewLayerList取得3D圖層列表詳細資訊。

from OViewPy.server import Server

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
layerList = server.getLayerList()
OViewLayerList = server.getOViewLayerList()
for list in layerList:
    print("圖層名稱:",list["layername"],"圖層類別:",list["type"])
print("===========================================")
for list in OViewLayerList:
    print("圖層名稱:",list["layername"],"圖層類別:",list["type"])

刪除圖層

如果想要刪除Server中已存在的圖層,可透過deleteLayerdeleteOViewLayer分別刪除2D及3D圖層。

注意!此刪除無法復原,請警慎使用。

from OViewPy.server import Server

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
server.deleteLayer(layerName="ne_10m_lakes")
server.deleteOViewLayer(layerName="ModelSet")

上架圖層

將圖片上架至伺服器

透過saveImageToServer可將圖片(JPG、PNG等)上架至Server

需特別注意,上架的圖片需在Server端目錄底下,並有相對應的World File,且確認圖層名稱不是已存在的圖層。

參數名稱 Type 預設值 說明
imageFilePath string None 圖片檔案位置
layerName string None 上架後的圖層名稱
epsg int 4326 座標參考系統
from OViewPy.server import Server
from OViewPy.layer import VectorLayer
from OViewPy.varstruct import GeoBoundary
from OViewPy.da import da

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 綁定Layer物件
layer = VectorLayer(server=server,layerName="Town_MOI")
boundary=GeoBoundary(147522.218692, 2422004.773002,
                         351690.114369, 2813163.248085)
# 取得圖片,取得成功會回傳圖片bytes資料
img = layer.getMapImage(
    boundary=boundary,
    crs="EPSG:3826",
    width=512,
    height=512,
    format="image/png"
)
# 儲存圖片,並生成World File
da.saveImg(
    img=img,
    savePath=".",
    imgName="testImage",
    imgType="png",
    worldFile=True,
    boundary=boundary
)
# 將圖片上架至Server
server.saveImageToServer(
    imageFilePath="D:\\NCHCProject\\jupyter_notebook\\testImage.png",
    layerName="testImage",
    epsg=3826
)

將SHP File上架至伺服器

透過saveVectorFileToServer可將Shp File上架至Server

需特別注意,上架的Shp File需在Server端目錄底下,並確認圖層名稱不是已存在的圖層。

參數名稱 Type 預設值 說明
VectorFilePath string None Shp File位置
layerName string None 上架後的圖層名稱
epsg int 4326 座標參考系統
from OViewPy.server import Server
from OViewPy.layer import VectorLayer
from OViewPy.varstruct import GeoBoundary
from OViewPy.da import da

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 綁定Layer物件
map = VectorLayer(server=server, layerName="Town_MOI")
# 設定搜尋條件
sql = "County_ID==64"
# 取得向量資料
ret = map.getVectorEntity(epsg=3826,sql=sql)
# 將向量資料存成SHP檔
da.saveAsShapeFile(sourceGeo=ret["geo"],sourceAttr=ret["attr"],fileName="TestShp_Kh")
# 將SHP檔上架至伺服器
server.saveVectorFileToServer(VectorFilePath="D:\\NCHCProject\\jupyter_notebook\\TestShp_Kh.shp",layerName="TestShp_Kh",epsg=3826)

將tif檔轉成dem檔,並將dem檔上架伺服器為地形圖層

於3d的轉檔需要較久的時間,因此轉檔的函式會回傳一個id(如: server.tifToDem)
可以透過此id,去跟server詢問進度
當轉檔成功可以透過server.save3dToServer將此圖層上架至伺服器
server.save3dToServer可以透過id或是DB位置將其上架至伺服器

from OViewPy.server import Server
from OViewPy.varstruct import GeoBoundary
from OViewPy.varstruct import LAYER_TYPE

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# tif檔轉成dem檔
id = server.tifToDem(inputTifFile="defaultTIF.tif", outputDemFile="defaultDEM2.dem")
# 回傳轉檔進度直到轉檔完成
server.getConvert3dProgressToFinish(id)
# dem檔轉成地形圖層
id = server.convertTerrain("testDem", "testDem.DB", "./defaultDEM2.dem", "4326")
# 將此地形圖層上架至伺服器
server.save3dToServer(dbLayerName="testDem", layerName="testDem", layerType=LAYER_TYPE.OV_TERRAIN.name, dbUrl="./testDem.DB")

將傾斜攝影上架至伺服器

透過綁定的server物件,並提供欲設定的圖層名稱(layerName)及輸出格式(exportType),將傾斜攝影轉檔並上架至伺服器
由於3d的轉檔需要較久的時間,因此轉檔的函式會回傳一個id(如: server.convertPhotogrammetry)
可以透過此id,去跟server詢問進度
當轉檔成功透過server.save3dToServer依DB位置將圖層上架至伺服器(若輸出檔案格式為3DTILES則不上架)

參數名稱 Type 預設值 可輸入值 說明
layerName string None --- 上架後的圖層名稱
layerDBFile string 預設名稱與layerName相同 --- 轉檔後產生的DB檔名稱
inputFileName string None --- 欲轉檔檔案位置
terrainDBFile string None --- 初始地形圖層位置
terrainName string None --- 初始地形圖層名稱
exportType string None NORMAL、I3S、3DTILES 輸出檔案格式
from OViewPy.server import Server
from OViewPy.varstruct import LAYER_TYPE
# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 設定layer名稱
layerName = "photogrammetry"
# 設定exportType(可輸入'NORMAL' or 'I3S' or '3DTILES')
exportType = "NORMAL"
# 轉檔傾斜攝影圖層,並會生成其對應之DB
id = server.convertPhotogrammetry(layerName=layerName,
                                  layerDBFile=layerName + ".DB",
                                  inputFileName="C:\\Users\\vaness.chen\\Desktop\\3DTEST\\基本圖資\\模型\\一門三節坊\\Acute3D\\一門三節坊\\Data\\LODTreeExport.xml", 
                                  terrainDBFile="C:\\Users\\vaness.chen\\Desktop\\3DTEST\\基本圖資\\高程\\Terrain20M.DB", 
                                  terrainName="terrain",
                                  exportType=exportType)
# 回傳轉檔進度直到轉檔完成
server.getConvert3dProgressToFinish(id)

# 將此圖層上架至伺服器
if exportType.upper() == "NORMAL":
    server.save3dToServer(dbLayerName=layerName, layerName=layerName, layerType=LAYER_TYPE.OV_PHOTOGRAMMETRYMODEL.name, dbUrl = layerName + ".DB")
elif exportType.upper() == "I3S":
    server.save3dToServer(dbLayerName=layerName, layerName=layerName, layerType=LAYER_TYPE.OV_OGCI3S.name, dbUrl = layerName + ".DB")

將管線圖層轉檔並上架至伺服器

透過綁定的server物件,並提供欲設定的圖層名稱(layerName)、檔案格式(mlayerType)及輸出格式(exportType),將管線圖層轉檔並上架至伺服器
由於3d的轉檔需要較久的時間,因此轉檔的函式會回傳一個id(如: server.convertPipeline)
可以透過此id,去跟server詢問進度
當轉檔成功透過server.save3dToServer依DB位置將圖層上架至伺服器(若輸出檔案格式為3DTILES則不上架)

參數名稱 Type 預設值 可輸入值 說明
layerName string None --- 上架後的圖層名稱
terrainName string None --- 初始地形圖層名稱
terrainDBFile string None --- 初始地形圖層位置
sourceFile string None --- 欲轉檔檔案位置
epsg int None --- 座標參考系統
mlayerType string None PIPELINE、MANHOLE、EQUIPMENT 欲轉檔檔案格式
exportType string None NORMAL、I3S、3DTILES 輸出檔案格式
layerDBFile string 預設名稱與layerName相同 --- 轉檔後產生的DB檔名稱
from OViewPy.server import Server
from OViewPy.varstruct import LAYER_TYPE
# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 設定layer名稱
layerName = "EQUIPMENTTry"
# 設定mlayerType(可輸入'PIPELINE' or 'MANHOLE' or 'EQUIPMENT')
mlayerType = "EQUIPMENT"
# 設定exportType(可輸入'NORMAL' or 'I3S' or '3DTILES')
exportType = "NORMAL"
# 轉檔管線、人手孔及設備圖層,並會生成其對應之DB
id = server.convertPipeline(layerName=layerName,
                            terrainName="terrain",
                            terrainDBFile="C:\\Users\\vaness.chen\\Desktop\\3DTEST\\基本圖資\\高程\\Terrain20M.DB", 
                            sourceFile="C:\\Users\\vaness.chen\\Downloads\\台中全區SHP_T\\台中全區SHP_T1\\一般供電_設備.shp",
                            epsg="3826",
                            mlayerType=mlayerType,
                            exportType=exportType,
                            layerDBFile=layerName + ".DB",
                            )
# 回傳轉檔進度直到轉檔完成
server.getConvert3dProgressToFinish(id)
# 將此圖層上架至伺服器
if exportType.upper() == "NORMAL":
    server.save3dToServer(dbLayerName=layerName, layerName=layerName, layerType=LAYER_TYPE.OV_PIPELINE.name, dbUrl = layerName + ".DB")
elif exportType.upper() == "I3S":
    server.save3dToServer(dbLayerName=layerName, layerName=layerName, layerType=LAYER_TYPE.OV_OGCI3S.name, dbUrl = layerName + ".DB")

將點雲圖層轉檔並上架至伺服器

透過綁定的server物件,並提供欲設定的圖層名稱(layerName)及輸出格式(exportType),將點雲圖層轉檔並上架至伺服器
由於3d的轉檔需要較久的時間,因此轉檔的函式會回傳一個id(如: server.convertPointcloud)
可以透過此id,去跟server詢問進度
當轉檔成功透過server.save3dToServer依DB位置將圖層上架至伺服器(若輸出檔案格式為3DTILES則不上架)

參數名稱 Type 預設值 可輸入值 說明
layerName string None --- 上架後的圖層名稱
layerDBFile string 預設名稱與layerName相同 --- 轉檔後產生的DB檔名稱
pointcloudFileNames string None --- 欲轉檔檔案位置
terrainName string None --- 初始地形圖層名稱
terrainDBFile string None --- 初始地形圖層位置
sourceEPSG int None --- 座標參考系統
exportType string None NORMAL、I3S、3DTILES 輸出檔案格式
from OViewPy.server import Server
from OViewPy.varstruct import LAYER_TYPE
# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 設定layer名稱
layerName = "PointcloudTry"
# 設定exportType(可輸入'NORMAL' or 'I3S' or '3DTILES')
exportType = "NORMAL"
# 轉檔管線圖層,並會生成其對應之DB
id = server.convertPointcloud(layerName=layerName,
                              layerDBFile=layerName + ".DB",
                              pointcloudFileNames="C:\\Users\\vaness.chen\\Downloads\\點雲圖層\\點雲圖層\\field-1.las",
                              terrainName="terrain",
                              terrainDBFile="C:\\Users\\vaness.chen\\Desktop\\3DTEST\\基本圖資\\高程\\Terrain20M.DB",
                              sourceEPSG="3826",
                              exportType=exportType
                             )
# 回傳轉檔進度直到轉檔完成
server.getConvert3dProgressToFinish(id)
# 將此圖層上架至伺服器
if exportType.upper() == "NORMAL":
    server.save3dToServer(dbLayerName=layerName, layerName=layerName, layerType=LAYER_TYPE.OV_POINTCLOUD.name, dbUrl = layerName + ".DB")
elif exportType.upper() == "I3S":
    server.save3dToServer(dbLayerName=layerName, layerName=layerName, layerType=LAYER_TYPE.OV_OGCI3S.name, dbUrl = layerName + ".DB")

將shp檔轉成ModelSet並上架至伺服器

透過綁定的server物件,並提供欲設定的圖層名稱(layerName)及輸出格式(exportType),將shp檔轉檔模型集並上架至伺服器
由於3d的轉檔需要較久的時間,因此轉檔的函式會回傳一個id(如: server.shpToModelSet)
可以透過此id,去跟server詢問進度
當轉檔成功透過server.save3dToServer依DB位置將圖層上架至伺服器(若輸出檔案格式為3DTILES則不上架)

參數名稱 Type 預設值 可輸入值 說明
layerName string None --- 上架後的圖層名稱
layerDBFile string 預設名稱與layerName相同 --- 轉檔後產生的DB檔名稱
terrainName string None --- 初始地形圖層名稱
terrainDBFile string None --- 初始地形圖層位置
sourceFileName string None --- 欲轉檔檔案位置
heightField string None --- 屋頂高欄位的名稱
epsg int None --- 座標參考系統
exportType string None NORMAL、I3S、3DTILES 輸出檔案格式
from OViewPy.server import Server
from OViewPy.varstruct import LAYER_TYPE
# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 設定layer名稱
layerName = "shpModelSetTry"
# 設定exportType(可輸入'NORMAL' or 'I3S' or '3DTILES')
exportType = "NORMAL"
# 轉檔管線圖層,並會生成其對應之DB
id = server.shpToModelSet(layerName=layerName,
                          layerDBFile=layerName + ".DB",
                          terrainName="terrain",
                          terrainDBFile="C:\\Users\\vaness.chen\\Desktop\\3DTEST\\基本圖資\\高程\\Terrain20M.DB",
                          sourceFileName="C:\\Users\\vaness.chen\\Desktop\\3DTEST\\基本圖資\\模型\\modelset練習用\\TaipeiBuilding2.shp",
                          heightField="屋頂高程",
                          epsg=4326,
                          exportType=exportType)
# 回傳轉檔進度直到轉檔完成
server.getConvert3dProgressToFinish(id)
# 將此圖層上架至伺服器
if exportType.upper() == "NORMAL":
    server.save3dToServer(dbLayerName=layerName, layerName=layerName, layerType=LAYER_TYPE.OV_MODELSET.name, dbUrl = layerName + ".DB")
elif exportType.upper() == "I3S":
    server.save3dToServer(dbLayerName=layerName, layerName=layerName, layerType=LAYER_TYPE.OV_OGCI3S.name, dbUrl = layerName + ".DB")

將huge檔轉成Model並上架至伺服器

透過綁定的server物件,並提供欲設定的圖層名稱(layerName)及輸出格式(exportType),將huge檔轉檔模型並上架至伺服器
由於3d的轉檔需要較久的時間,因此轉檔的函式會回傳一個id(如: server.hugeModelToModelLayer)
可以透過此id,去跟server詢問進度
當轉檔成功透過server.save3dToServer依DB位置將圖層上架至伺服器(若輸出檔案格式為3DTILES則不上架)

參數名稱 Type 預設值 可輸入值 說明
dbPath string 預設名稱與layerName相同 --- 轉檔後產生的DB檔名稱
layerName string None --- 上架後的圖層名稱
terrainDBFile string None --- 初始地形圖層位置
terrainName string None --- 初始地形圖層名稱
sourceFileName string None --- 欲轉檔檔案位置
exportType string None NORMAL、I3S、3DTILES 輸出檔案格式
from OViewPy.server import Server
from OViewPy.varstruct import LAYER_TYPE

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 設定layer名稱
layerName = "hugeModelTry"
# 設定exportType(可輸入'NORMAL' or 'I3S' or '3DTILES')
exportType = "NORMAL"
# 轉檔HugeModel圖層,並會生成其對應之DB
id = server.hugeModelToModelLayer(dbPath=layerName + ".DB",
                                  layerName=layerName,
                                  terrainDBFile="C:\\Users\\vaness.chen\\Desktop\\3DTEST\\基本圖資\\高程\\Terrain20M.DB",
                                  terrainName="terrain",
                                  sourceFileName="C:\\Users\\vaness.chen\\Desktop\\3DTEST\\基本圖資\\模型\\HugeModel練習用\\-Z_Y.obj",
                                  exportType=exportType
                                 )
# 回傳轉檔進度直到轉檔完成
server.getConvert3dProgressToFinish(id)
# 將此圖層上架至伺服器
if exportType.upper() == "NORMAL":
    server.save3dToServer(dbLayerName=layerName, layerName=layerName, layerType=LAYER_TYPE.OV_MODEL.name, dbUrl = layerName + ".DB")
elif exportType.upper() == "I3S":
    server.save3dToServer(dbLayerName=layerName, layerName=layerName, layerType=LAYER_TYPE.OV_OGCI3S.name, dbUrl = layerName + ".DB")

Layer Module

取得圖層物件

此Module分為RasterLayerVectorLayer兩種圖層,在初始化圖層時請選擇正確的圖層分類。
第一個參數(server)放置已綁定的Server物件,第二個參數(layerName)放置要取得的圖層名稱。
取得圖層物件後,即可透過getLayerInfo取得圖層相關資訊。

from OViewPy.server import Server
from OViewPy.layer import RasterLayer,VectorLayer

server = Server(url="http://127.0.0.1:8080")
raster = RasterLayer(server=server,layerName="GlobalPreview_Rough")
vector = VectorLayer(server=server,layerName="Town_MOI")
print(raster.layerInfo)
print(vector.layerInfo)

透過getMapImage可取得給定範圍內的地圖圖片,此Function的參數如下:

此Function適用於RasterLayerVectorLayer

參數名稱 Type 預設值 說明
boundary GeoBoundary None 欲取得圖片範圍。如未給值,將直接取得完整圖片。
width int 512 圖片寬度
height int 512 圖片高度
crs string EPSG:4326 座標參考系統
format string image/png 圖片格式
from OViewPy.server import Server
from OViewPy.layer import VectorLayer
from OViewPy.varstruct import GeoBoundary
from OViewPy.da import da

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 綁定Layer物件
layer = VectorLayer(server=server,layerName="Town_MOI")
# 取得圖片,取得成功會回傳圖片bytes資料
img = layer.getMapImage(
    boundary=GeoBoundary(147522.218692, 2422004.773002,
                         351690.114369, 2813163.248085),
    crs="EPSG:3826",
    width=512,
    height=512,
    format="image/png"
)
# 顯示圖片
da.showImg(img)

如果圖層物件為VectorLayer,可透過getVectorEntity取得一定範圍內的向量資料。
此Function的參數如下:

參數名稱 Type 預設值 說明
bound GeoBoundary/GeoPolygon None 欲取得向量資料範圍。如未給值,將直接取得完整圖層向量資料。
epsg int 4326 座標參考系統
sql string "" 搜尋條件
from OViewPy.server import Server
from OViewPy.layer import VectorLayer
from OViewPy.varstruct import GeoBoundary

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 綁定Layer物件
map = VectorLayer(server=server, layerName="Town_MOI")
# 設定搜尋條件
sql = "County_ID=64"
# 取得向量資料
ret = map.getVectorEntity(epsg=3826,sql=sql)
print("Geo:", ret["geo"][0].ToDict())
print("Attr:", ret["attr"][0].ToDict())

OViewLayer Module

此Module分為TerrainLayerPipeLineLayerModelLayerModelSetLayer等4種3D模型圖層。
第一個參數(server)放置已綁定的Server物件,第二個參數(layerName)放置要取得的圖層名稱。
取得圖層物件後,即可透過getLayerInfo取得圖層相關資訊。

from OViewPy.server import Server
from OViewPy.oviewlayer import TerrainLayer, PipeLineLayer, ModelLayer, ModelSetLayer

server = Server(url="http://127.0.0.1:8080")
Terrain = TerrainLayer(server=server, layerName="gebco_2021_geotiff_retransfer")
PipeLine = PipeLineLayer(server=server, layerName="TaichungPipeline")
Model = ModelLayer(server=server, layerName="ChungHsingBIM")
ModelSet = ModelSetLayer(server=server, layerName="TaichungKMZ")
print(Terrain.layerInfo)
print(PipeLine.layerInfo)
print(Model.layerInfo)
print(ModelSet.layerInfo)

TerrainLayer

getDEMMatrix

TerrainLayer可透過getDEMMatrix取得地形網格資料,此Function的參數如下:

參數名稱 Type 預設值 說明
boundary GeoBoundary None 欲取得地形網格範圍。
cellDemSize int 500 地形網格數,將取得n*n個網格資料。
epsg int 4326 boundary EPSG
from OViewPy.server import Server
from OViewPy.oviewlayer import TerrainLayer
from OViewPy.varstruct import GeoBoundary

server = Server(url="http://127.0.0.1:8080")
Terrain = TerrainLayer(
    server=server, layerName="gebco_2021_geotiff_retransfer")
boundary = GeoBoundary(119.981273, 21.892673,
                       122.010898, 25.424327)
matrix = Terrain.getDEMMatrix(boundary=boundary, cellDemSize=500, epsg=4326)
print(type(matrix))

hillshadeAnalysis

取得山體陰影分析,分析結果將存為GeoTiff,此Function的參數如下:

參數名稱 Type 預設值 說明
boundary GeoBoundary None 欲取得地形網格範圍。
cellDemSize int 500 地形網格數,將取得n*n個網格資料。
epsg int 4326 boundary EPSG
azimuth int 30 太陽方位角
altitude int 30 太陽高度角
savePath string "." 檔案儲存位置
fileName string "defaultDEM" 檔案名稱
width int 21600 圖片寬
height int 21600 圖片高
from OViewPy.server import Server
from OViewPy.oviewlayer import TerrainLayer
from OViewPy.varstruct import GeoBoundary

server = Server(url="http://127.0.0.1:8080")
Terrain = TerrainLayer(
    server=server, layerName="gebco_2021_geotiff_retransfer")
boundary = GeoBoundary(119.981273, 21.892673,
                       122.010898, 25.424327)
Terrain.hillshadeAnalysis(boundary=boundary, cellDemSize=500, epsg=4326,
                          azimuth=150, altitude=60,
                          savePath=".", fileName="defaultHillShade", width=10800, height=21600)

slopeAnalysis

取得坡度分析,分析結果將存為GeoTiff,此Function的參數如下:

參數名稱 Type 預設值 說明
boundary GeoBoundary None 欲取得地形網格範圍。
cellDemSize int 500 地形網格數,將取得n*n個網格資料。
epsg int 4326 boundary EPSG
savePath string "." 檔案儲存位置
fileName string "defaultDEM" 檔案名稱
width int 21600 圖片寬
height int 21600 圖片高
from OViewPy.server import Server
from OViewPy.oviewlayer import TerrainLayer
from OViewPy.varstruct import GeoBoundary

server = Server(url="http://127.0.0.1:8080")
Terrain = TerrainLayer(
    server=server, layerName="gebco_2021_geotiff_retransfer")
boundary = GeoBoundary(119.981273, 21.892673,
                       122.010898, 25.424327)
Terrain.slopeAnalysis(boundary=boundary, cellDemSize=500, epsg=4326,
                      savePath=".", fileName="defaultSlope", width=10800, height=21600)

aspectAnalysis

取得坡向分析,分析結果將存為GeoTiff,此Function的參數如下:

參數名稱 Type 預設值 說明
boundary GeoBoundary None 欲取得地形網格範圍。
cellDemSize int 500 地形網格數,將取得n*n個網格資料。
epsg int 4326 boundary EPSG
savePath string "." 檔案儲存位置
fileName string "defaultDEM" 檔案名稱
width int 21600 圖片寬
height int 21600 圖片高
from OViewPy.server import Server
from OViewPy.oviewlayer import TerrainLayer
from OViewPy.varstruct import GeoBoundary

server = Server(url="http://127.0.0.1:8080")
Terrain = TerrainLayer(
    server=server, layerName="gebco_2021_geotiff_retransfer")
boundary = GeoBoundary(119.981273, 21.892673,
                       122.010898, 25.424327)
Terrain.aspectAnalysis(boundary=boundary, cellDemSize=500, epsg=4326,
                      savePath=".", fileName="defaultAspect", width=10800, height=21600)

contourLineAnalysis

取得等高線分析,分析結果將存為png/GeoJson,此Function的參數如下:

參數名稱 Type 預設值 說明
boundary GeoBoundary None 欲取得地形網格範圍。
cellDemSize int 500 地形網格數,將取得n*n個網格資料。
epsg int 4326 boundary EPSG
savePath string "." 檔案儲存位置
fileName string "defaultDEM" 檔案名稱
fileType string "image" 儲存類型,"image" / "geojson"
width int 21600 圖片寬
height int 21600 圖片高
from OViewPy.server import Server
from OViewPy.oviewlayer import TerrainLayer
from OViewPy.varstruct import GeoBoundary

server = Server(url="http://127.0.0.1:8080")
Terrain = TerrainLayer(
    server=server, layerName="gebco_2021_geotiff_retransfer")
boundary = GeoBoundary(119.981273, 21.892673,
                       122.010898, 25.424327)
Terrain.contourLineAnalysis(boundary=boundary, cellDemSize=500, epsg=4326,fileType="image",
                      savePath=".", fileName="defaultContourLine", width=10800, height=21600)
Terrain.contourLineAnalysis(boundary=boundary, cellDemSize=500, epsg=4326,fileType="geojson",
                      savePath=".", fileName="defaultContourLine")

OViewEntityLayer

除了TerrainLayer外,其餘三種圖層皆屬於OViewEntityLayer,可透過getVectorEntity取得圖層Entity。 此Function參數如下:

參數名稱 Type 預設值 說明
bound GeoBoundary/GeoPolygon None 欲取得向量資料範圍。如未給值,將直接取得完整圖層向量資料。
epsg int 4326 座標參考系統
sql string "" 搜尋條件
from OViewPy.server import Server
from OViewPy.oviewlayer import PipeLineLayer, ModelLayer, ModelSetLayer

server = Server(url="http://127.0.0.1:8080")
PipeLine = PipeLineLayer(server=server, layerName="TaichungPipeline")
# Model = ModelLayer(server=server, layerName="ChungHsingBIM")
# ModelSet = ModelSetLayer(server=server, layerName="TaichungKMZ")
ret = PipeLine.getVectorEntity()
print("Geo:", ret["geo"][0].ToDict())
print("Attr:", ret["attr"][0].ToDict())

Data Access Module

使用資料處理模組

此模組可將取得的資料轉換成Python常用的Numpy、Shapely等資料格式,以供開發者方便計算。

圖片(Bytes)與Numpy Array轉換

from OViewPy.server import Server
from OViewPy.layer import VectorLayer
from OViewPy.varstruct import GeoBoundary
from OViewPy.da import da
import cv2

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 綁定Layer物件
layer = VectorLayer(server=server,layerName="Town_MOI")
# 取得圖片,取得成功會回傳圖片bytes資料
img = layer.getMapImage(
    boundary=GeoBoundary(147522.218692, 2422004.773002,
                         351690.114369, 2813163.248085),
    crs="EPSG:3826",
    width=512,
    height=512,
    format="image/png"
)
# 將圖片轉換成Numpy Array
npArray = da.imgToNumPyArray(img)
# 透過cv2讀取Numpy Array
image = cv2.imdecode(npArray, cv2.IMREAD_UNCHANGED)
# 處理成高斯模糊
blurred = cv2.GaussianBlur(image, (51, 51), 0)
# 將處理後的圖片轉成jpg編碼
blurred = cv2.imencode('.jpg',blurred)[1]
# 將Numpy Array 轉回 Bytes格式
blurred = da.numPyArrayToImg(blurred)
# 顯示圖片
da.showImg(blurred)
# 儲存圖片
da.saveImg(img=blurred, savePath=".", imgName="高斯模糊", imgType="jpg")

向量格式轉換成Numpy Array

from OViewPy.server import Server
from OViewPy.layer import VectorLayer
from OViewPy.varstruct import GeoBoundary
from OViewPy.da import da

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 綁定Layer物件
map = VectorLayer(server=server, layerName="Town_MOI")
# 設定範圍
geo = GeoBoundary(147522.218692, 2422004.773002,
                  351690.114369, 2813163.248085)
# 取得向量資料
ret = map.getVectorEntity(bound=geo,epsg=3826)
# 將向量資料轉換成Numpy
npRet = da.vectorEntityToNumPyArray(ret["geo"])
# 顯示資料類型
print(type(npRet[0]))

向量格式轉換成Shapely

from OViewPy.server import Server
from OViewPy.layer import VectorLayer
from OViewPy.varstruct import GeoBoundary

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 綁定Layer物件
map = VectorLayer(server=server,layerName="Town_MOI")
# 設定範圍
geo = GeoBoundary(147522.218692, 2422004.773002,
                  351690.114369, 2813163.248085)
# 取得向量資料
ret = map.getVectorEntity(bound=geo)
# 將向量資料轉換成Numpy
shpRet = da.vectorEntityToShapely(ret["geo"])
# 顯示資料類型
print(type(shpRet[0]))

向量格式轉換成TIF

from OViewPy.server import Server
from OViewPy.oviewlayer import TerrainLayer
from OViewPy.varstruct import GeoBoundary
from OViewPy.da import da

# 綁定Server物件
server = Server(url="http://127.0.0.1:8080")
# 綁定Layer物件
Terrain = TerrainLayer(server=server, layerName="terrain")
# 設定範圍
boundary = GeoBoundary(119.981273, 21.892673,
                       122.010898, 25.424327)
# 取得向量資料
matrix = Terrain.getDEMMatrix(boundary=boundary, cellDemSize=400, epsg=4326)
# numpyArray輸出成tif檔
da.numPyArrayToTIF(matrix, boundary=boundary, width=1500, height=1500)
Copyright © NCHC 2022 Version:13.0 all right reserved,powered by Gitbook修訂時間: 2024-11-20 13:52:09