赞
踩
阅读api可知,gdal.open方法用于创建和打开数据集dataset,如果以‘w’模式的话,会将更改从内存提交磁盘,否则,更改将被丢弃无效。
path:创建数据集的路径,如“e:/shp”。
mode:"r","r+","w"三种模式。
drivers:数据集的驱动,字符或数组类型。
那么问题来了,如果我要创建一个shp,path和mode都很容易确定,而drivers是个什么鬼?查询api文档查不到,于是,使用以下代码,用于浏览下到底有哪些驱动:
-
- var gdal=require('gdal');
- gdal.drivers.forEach(function(drive,i){
- console.log(drive.description);
- })
输出结果如下:
- 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
注意,输出的驱动描述有ESRI Shapefile和OpenFileGDB,分别对应esri的shp和gdb。通过描述可知,新建一个shp的构造函数应该如下:var dataset=gdal.open('b.shp',"w",'ESRI Shapefile');
dataset是由layers组成的,我们创建了一个shp的数据集,于是,在该数据集下创建layer,查看layers.create的api如下:
- create( name,srs,geomType,creation_options)
- 新增图层。
- 参数:
- name String类型,图层名称。
- srs gdal.SpatialReference| Null,图层投影坐标系。
- geomType Integer | FunctionGeometry,图层几何类型。
- creation_options String[] | Object 特殊选项,可选。
- 返回值:
- gdal.Layer
- 示例:
- dataset.layers.create('layername', null, gdal.Point);
创建点图层示例如下:dataset.layers.create('b',null, gdal.Point);
新建的图层,坐标系是null,我们希望建立的shp图层坐标系是4326的wgs84坐标,上文创建点图层如下:
- 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', '测试');
- //构造图形并赋值
- var pt = new gdal.Point(118.5,32.1)
-
- feature.setGeometry(pt);
- layer.features.add(feature);
- layer.flush();
运行之后,发现name值“测试”是中文乱码:
理所当然,我们认为是字符集的问题。
2.4 设置shp字符集
- //GBK的code page是CP936
- gdal.config.set('SHAPE_ENCODING','CP936');
本来设置属性是gbk,报错。非要设置gbk的codepage代码,涨姿势了。
完整代码如下:
- 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', '测试');
- //构造图形并赋值
- var pt = new gdal.Point(118.5,32.1)
- feature.setGeometry(pt);
- layer.features.add(feature);
- layer.flush();
可视化结果如下:
后人看也许很简单,因为前人填了很多坑,无论坐标系还是模式还是中文乱码,是耗尽心血点滴测试出来的,且看且珍惜啊。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。