node-gdal實踐-創(chuàng)建shp文件

一 gdal.open解析

gdal.open.png

閱讀api可知,gdal.open方法用于創(chuàng)建和打開數(shù)據(jù)集dataset,如果以‘w’模式的話,會將更改從內(nèi)存提交磁盤,否則,更改將被丟棄無效。
path:創(chuàng)建數(shù)據(jù)集的路徑,如“e:/shp”。
mode:"r","r+","w"三種模式。
drivers:數(shù)據(jù)集的驅(qū)動,字符或數(shù)組類型。
那么問題來了,如果我要創(chuàng)建一個shp,path和mode都很容易確定,而drivers是個什么鬼?查詢api文檔查不到,于是,使用以下代碼,用于瀏覽下到底有哪些驅(qū)動:


    var gdal=require('gdal'); 
        gdal.drivers.forEach(function(drive,i){
        console.log(drive.description);
    })

輸出結(jié)果如下:

VRT
GTiff
NITF
RPFTOC
ECRGTOC
HFA
SAR_CEOS
CEOS
JAXAPALSAR
GFF
ELAS
AIG
AAIGrid
GRASSASCIIGrid
SDTS
DTED
PNG
JPEG
MEM
JDEM
ESAT
XPM
BMP
DIMAP
AirSAR
RS2
PCIDSK
ILWIS
SGI
SRTMHGT
Leveller
Terragen
ISIS3
ISIS2
PDS
VICAR
TIL
ERS
L1B
FIT
RMF
RST
INGR
GSAG
GSBG
GS7BG
COSAR
TSX
COASP
R
MAP
KMLSUPEROVERLAY
PNM
DOQ1
DOQ2
GenBin
PAux
MFF
MFF2
FujiBAS
GSC
FAST
BT
LAN
CPG
IDA
NDF
EIR
DIPEx
LCP
GTX
LOSLAS
NTv2
CTable2
ACE2
SNODAS
KRO
ROI_PAC
ENVI
EHdr
ISCE
USGSDEM
NWT_GRD
NWT_GRC
ADRG
SRP
BLX
SAGA
XYZ
HF2
CTG
E00GRID
ZMap
NGSGEOID
IRIS
ESRI Shapefile
MapInfo File
UK .NTF
OGR_SDTS
S57
DGN
OGR_VRT
REC
Memory
BNA
CSV
GML
GPX
KML
GeoJSON
OGR_GMT
WAsP
OpenFileGDB
XPlane
DXF
Geoconcept
GeoRSS
GPSTrackMaker
PGDUMP
GPSBabel
SUA
OpenAir
OGR_PDS
HTF
AeronavFAA
EDIGEO
SVG
Idrisi
SEGUKOOA
SEGY
SXF
AVCBin
AVCE00

注意,輸出的驅(qū)動描述有ESRI Shapefile和OpenFileGDB,分別對應(yīng)esri的shp和gdb。通過描述可知,新建一個shp的構(gòu)造函數(shù)應(yīng)該如下:
var dataset=gdal.open('b.shp',"w",'ESRI Shapefile');

二 創(chuàng)建shp

2.1 創(chuàng)建圖層

dataset是由layers組成的,我們創(chuàng)建了一個shp的數(shù)據(jù)集,于是,在該數(shù)據(jù)集下創(chuàng)建layer,查看layers.create的api如下:

create( name,srs,geomType,creation_options) 
新增圖層。
參數(shù):
name String類型,圖層名稱。
srs gdal.SpatialReference| Null,圖層投影坐標(biāo)系。
geomType Integer | FunctionGeometry,圖層幾何類型。
creation_options String[] | Object 特殊選項,可選。
返回值:
gdal.Layer
示例:
dataset.layers.create('layername', null, gdal.Point);

創(chuàng)建點圖層示例如下:
dataset.layers.create('b',null, gdal.Point);

2.2 圖層坐標(biāo)系

新建的圖層,坐標(biāo)系是null,我們希望建立的shp圖層坐標(biāo)系是4326的wgs84坐標(biāo),上文創(chuàng)建點圖層如下:

    var ref = gdal.SpatialReference.fromEPSGA(4326);
    dataset.layers.create('b',ref, gdal.Point);

2.3 新增字段

    var layer = dataset.layers.get(0);
    layer.fields.add(new gdal.FieldDefn('name', gdal.OFTString));
    var feature = new gdal.Feature(layer);
    //給字段賦值
    feature.fields.set('name', '測試');
    //構(gòu)造圖形并賦值
    var pt = new gdal.Point(118.5,32.1)
    
    feature.setGeometry(pt);
    layer.features.add(feature);
    layer.flush();

運行之后,發(fā)現(xiàn)name值“測試”是中文亂碼:


result.png

理所當(dāng)然,我們認(rèn)為是字符集的問題。
2.4 設(shè)置shp字符集

    //GBK的code page是CP936
    gdal.config.set('SHAPE_ENCODING','CP936');

本來設(shè)置屬性是gbk,報錯。非要設(shè)置gbk的codepage代碼,漲姿勢了。

三 結(jié)果

完整代碼如下:

    var gdal=require('gdal'); 
    //GBK的code page是CP936
    gdal.config.set('SHAPE_ENCODING','CP936');
    var dataset=gdal.open('b.shp',"w",'ESRI Shapefile');
    var ref = gdal.SpatialReference.fromEPSGA(4326);
    dataset.layers.create('b',ref, gdal.Point);
    var layer = dataset.layers.get(0);
    layer.fields.add(new gdal.FieldDefn('name', gdal.OFTString));
    var feature = new gdal.Feature(layer);
    //給字段賦值
    feature.fields.set('name', '測試');
    //構(gòu)造圖形并賦值
    var pt = new gdal.Point(118.5,32.1)
    feature.setGeometry(pt);
    layer.features.add(feature);
    layer.flush();

可視化結(jié)果如下:

b.shp.png

后人看也許很簡單,因為前人填了很多坑,無論坐標(biāo)系還是模式還是中文亂碼,是耗盡心血點滴測試出來的,且看且珍惜啊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容