文档章节

node-gdal实践-创建shp文件

遥想公瑾当年
 遥想公瑾当年
发布于 2017/06/01 11:12
字数 771
阅读 8
收藏 0
点赞 0
评论 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 ⋅ 1

ArcGIS Runtime加载本地Shape数据和编辑Shape数据

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

长平狐 ⋅ 2012/11/28 ⋅ 0

​python版本gdal中在py文件中创建的栅格影像如何正常关闭并使得其可以删除

python版本gdal中在py文件中创建的栅格影像如何正常关闭并使得其可以删除 测试py文件代码: #coding:gb2312 import os from osgeo import gdal from osgeo import ogr from osgeo.gdalconst...

funnybone ⋅ 2013/11/15 ⋅ 0

简析将shp导入Oracle并利用geoserver将导入的数据发布

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

李晓晖 ⋅ 2015/01/02 ⋅ 0

对象切割和多态

实践是最好的学习方式 例子: #include <iostream> using namespace std; class Shape { public : Shape() {}; ~Shape() {}; virtual void draw() { cout<<"Shape draw..."<<endl; }; }; cl......

ryany ⋅ 2010/11/16 ⋅ 0

GDAL for WinCE的安装与配置

GDAL for WinCE版本对于移动地理信息系统开发者无疑是一个福音,目前,只有1.4版本的wince部分是有效的,下面就具体的配置做一个详细说明,大部分还是官网的,只是翻译,自己再去实际配置了一...

长平狐 ⋅ 2013/12/25 ⋅ 0

GDAL for WINCE编译与配置

目前,GDAL导出为Windows CE平台并不是很容易,编译配置比起桌面版的要稍微复杂一点。 从GDAL1.40版本开始,开始支持winCE,但是据说,后面的版本也不支持windows CE的库,在windows CE上面的...

长平狐 ⋅ 2013/12/25 ⋅ 0

gdal库插件在中文路径下时gdal不能加载插件

我现在编译的gdal库包含插件geoRaster,该插件在gdalplugins文件夹在,当gdal.dll以及插件所在的路径包含中文时,gdal.dll加载插件失败(不是打开在中文路径下的影像文件!),请问如何有没有人...

reme ⋅ 2013/06/08 ⋅ 4

Python GDAL课程笔记

说明: 这是一份来自网上的学习笔记,教程来自于犹他州立大学,课程名称为:Geoprocessing with Python using Open Source GIS 。 这份教程在网上有几个网站进行过发布,也无从判断哪份才是原...

openthings ⋅ 2016/04/25 ⋅ 0

安装PostGIS-2.1.8

版本: proj-4.8.0.tar.gz geos-3.4.2.tar.bz2 gdal-2.0.1.tar.gz PostGIS-2.1.82.1.8 前提条件: 安装PostGIS之前必须先安装proj,geos,gdal. 安装proj4 [root@Darren2 tools]# wget http:/......

Darren_Chen ⋅ 2017/10/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 10分钟前 ⋅ 0

如何使用serverchan微信推送告警

之前实现推送告警信息到微信的方法有如下几种: 1、通过企业公众号实现----收费: 2、通过QQ邮箱,在微信平台上开启收到邮件进行提醒; 3、第三方告警平台API,一般也是收费的; 不过最近看文...

问题终结者 ⋅ 37分钟前 ⋅ 0

TCP的RPC

RPC就是远程方法调用(Remote Process Call ),包含了客户端和服务端,涉及了对象的序列化传输。 1.服务端启动,注册远程调用的类2.客户端发送请求信息包含类、方法、参数的一些信息、序列化传...

Cobbage ⋅ 57分钟前 ⋅ 0

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 今天 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 今天 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 今天 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 今天 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 今天 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部