文档章节

node-gdal实践-创建shp文件

遥想公瑾当年
 遥想公瑾当年
发布于 2017/06/01 11:12
字数 771
阅读 12
收藏 0

一 gdal.open解析

gdal.open.png 阅读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');

二 创建shp

2.1 创建图层

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);

2.2 图层坐标系

新建的图层,坐标系是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值“测试”是中文乱码: result.png 理所当然,我们认为是字符集的问题。 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();

可视化结果如下:

b.shp.png

后人看也许很简单,因为前人填了很多坑,无论坐标系还是模式还是中文乱码,是耗尽心血点滴测试出来的,且看且珍惜啊。

© 著作权归作者所有

共有 人打赏支持
遥想公瑾当年
粉丝 6
博文 11
码字总数 17519
作品 0
南京
高级程序员
私信 提问
GDAL不支持SHP文件中的中文字符

我最近使用了一个别人的用GDAL编写的软件,是国外的,软件功能是将SHP文件中的部分属性字段导入到CSV文件中,还有就是简化SHP文件边界点,并提取每一个节点坐标和质心坐标,但在使用中不支持...

dr_gis_jyx
2014/11/15
961
1
ArcGIS Runtime加载本地Shape数据和编辑Shape数据

问题的提出 ArcGIS Runtime 支持MPK,APK,TPK,GPK这些打包之后的数据,这些也都是ArcGIS 10.1 中新增的数据格式(MPK除外,MPK是在ArcGIS 10中增加的,但是并不能支持ArcGIS Runtime),我们经...

长平狐
2012/11/28
3.6K
0
简析将shp导入Oracle并利用geoserver将导入的数据发布

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。 1.环境准备 1.1 软件准备 首先要安装有支持空间数据的Oracle,其次有安装版或免安装版的...

李晓晖
2015/01/02
0
0
用C++语言 利用GDAL读写遥感多波段的时候,只能用读取单波段的信息,多波段功能实现不了,我用的是多波段数据,想读取部分波段信息

#include "gdal_priv.h" #include"gdal.h" #include #include typedef unsigned char BYTE; using namespace std; int main() { GDALAllRegister();//注册所有驱动 GDALDataset* poDataset1;......

毛毛真nice
2018/11/04
40
0
在基友中山野鬼,宏哥,师兄铂金小猪多方意见考虑后,准备找个明主投奔、、、

1、GDAL处理矢量shp、mif、eoo、dxf、coverage等格式(有的格式是自己开发的 @铂金小猪 我师兄了解点)与栅格数据Geotiff、tiff、img、grid等格式在大地与平面坐标系,利用控制点除了常用布尔...

地瓜儿
2013/01/08
2.6K
22

没有更多内容

加载失败,请刷新页面

加载更多

给windows server中的“未识别的网络”或“无法识别的网络”设置网络位置类型

在windows server中,如果网络没有被正确的识别,那么就需要手工设置一下网络位置类型。 将“公用网络”指定设置为“专用网络“ 【控制面板】--【系统和安全】--【管理工具】--【本地安全策略...

gugudu
45分钟前
1
0
阿里强制要求的21条Java开发规范,可以避免很多坑

1. 【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。 2. 【强制】所有的覆写方法,必须加@Override注解。 说明:getObject...

天王盖地虎626
今天
6
0
oracle dg 备库未设置convert参数导致ORA-01111,ORA-01110

查看trace 文件: MRP0: Background Managed Standby Recovery process started (amls) started logmerger process Sun Jan 20 07:55:53 2019 Managed Standby Recovery starting Real Time ......

hnairdb
今天
2
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linux-tao
今天
2
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxprobe16
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部