当前位置:   article > 正文

node-gdal实践-创建shp文件

nodegdal设置图层属性

一 gdal.open解析

img_a3d30f2e30a08ef53995e2b68360e5d9.png
gdal.open.png

阅读api可知,gdal.open方法用于创建和打开数据集dataset,如果以‘w’模式的话,会将更改从内存提交磁盘,否则,更改将被丢弃无效。
path:创建数据集的路径,如“e:/shp”。
mode:"r","r+","w"三种模式。
drivers:数据集的驱动,字符或数组类型。
那么问题来了,如果我要创建一个shp,path和mode都很容易确定,而drivers是个什么鬼?查询api文档查不到,于是,使用以下代码,用于浏览下到底有哪些驱动:

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

输出结果如下:

  1. VRT
  2. GTiff
  3. NITF
  4. RPFTOC
  5. ECRGTOC
  6. HFA
  7. SAR_CEOS
  8. CEOS
  9. JAXAPALSAR
  10. GFF
  11. ELAS
  12. AIG
  13. AAIGrid
  14. GRASSASCIIGrid
  15. SDTS
  16. DTED
  17. PNG
  18. JPEG
  19. MEM
  20. JDEM
  21. ESAT
  22. XPM
  23. BMP
  24. DIMAP
  25. AirSAR
  26. RS2
  27. PCIDSK
  28. ILWIS
  29. SGI
  30. SRTMHGT
  31. Leveller
  32. Terragen
  33. ISIS3
  34. ISIS2
  35. PDS
  36. VICAR
  37. TIL
  38. ERS
  39. L1B
  40. FIT
  41. RMF
  42. RST
  43. INGR
  44. GSAG
  45. GSBG
  46. GS7BG
  47. COSAR
  48. TSX
  49. COASP
  50. R
  51. MAP
  52. KMLSUPEROVERLAY
  53. PNM
  54. DOQ1
  55. DOQ2
  56. GenBin
  57. PAux
  58. MFF
  59. MFF2
  60. FujiBAS
  61. GSC
  62. FAST
  63. BT
  64. LAN
  65. CPG
  66. IDA
  67. NDF
  68. EIR
  69. DIPEx
  70. LCP
  71. GTX
  72. LOSLAS
  73. NTv2
  74. CTable2
  75. ACE2
  76. SNODAS
  77. KRO
  78. ROI_PAC
  79. ENVI
  80. EHdr
  81. ISCE
  82. USGSDEM
  83. NWT_GRD
  84. NWT_GRC
  85. ADRG
  86. SRP
  87. BLX
  88. SAGA
  89. XYZ
  90. HF2
  91. CTG
  92. E00GRID
  93. ZMap
  94. NGSGEOID
  95. IRIS
  96. ESRI Shapefile
  97. MapInfo File
  98. UK .NTF
  99. OGR_SDTS
  100. S57
  101. DGN
  102. OGR_VRT
  103. REC
  104. Memory
  105. BNA
  106. CSV
  107. GML
  108. GPX
  109. KML
  110. GeoJSON
  111. OGR_GMT
  112. WAsP
  113. OpenFileGDB
  114. XPlane
  115. DXF
  116. Geoconcept
  117. GeoRSS
  118. GPSTrackMaker
  119. PGDUMP
  120. GPSBabel
  121. SUA
  122. OpenAir
  123. OGR_PDS
  124. HTF
  125. AeronavFAA
  126. EDIGEO
  127. SVG
  128. Idrisi
  129. SEGUKOOA
  130. SEGY
  131. SXF
  132. AVCBin
  133. 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如下:

  1. create( name,srs,geomType,creation_options)
  2. 新增图层。
  3. 参数:
  4. name String类型,图层名称。
  5. srs gdal.SpatialReference| Null,图层投影坐标系。
  6. geomType Integer | FunctionGeometry,图层几何类型。
  7. creation_options String[] | Object 特殊选项,可选。
  8. 返回值:
  9. gdal.Layer
  10. 示例:
  11. dataset.layers.create('layername', null, gdal.Point);

创建点图层示例如下:
dataset.layers.create('b',null, gdal.Point);

2.2 图层坐标系

新建的图层,坐标系是null,我们希望建立的shp图层坐标系是4326的wgs84坐标,上文创建点图层如下:

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

2.3 新增字段

  1. var layer = dataset.layers.get(0);
  2. layer.fields.add(new gdal.FieldDefn('name', gdal.OFTString));
  3. var feature = new gdal.Feature(layer);
  4. //给字段赋值
  5. feature.fields.set('name', '测试');
  6. //构造图形并赋值
  7. var pt = new gdal.Point(118.5,32.1)
  8. feature.setGeometry(pt);
  9. layer.features.add(feature);
  10. layer.flush();

运行之后,发现name值“测试”是中文乱码:


img_deb6413f2cb96cdc6bca6cddf83d8f73.png
result.png

理所当然,我们认为是字符集的问题。
2.4 设置shp字符集

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

本来设置属性是gbk,报错。非要设置gbk的codepage代码,涨姿势了。

三 结果

完整代码如下:

  1. var gdal=require('gdal');
  2. //GBK的code page是CP936
  3. gdal.config.set('SHAPE_ENCODING','CP936');
  4. var dataset=gdal.open('b.shp',"w",'ESRI Shapefile');
  5. var ref = gdal.SpatialReference.fromEPSGA(4326);
  6. dataset.layers.create('b',ref, gdal.Point);
  7. var layer = dataset.layers.get(0);
  8. layer.fields.add(new gdal.FieldDefn('name', gdal.OFTString));
  9. var feature = new gdal.Feature(layer);
  10. //给字段赋值
  11. feature.fields.set('name', '测试');
  12. //构造图形并赋值
  13. var pt = new gdal.Point(118.5,32.1)
  14. feature.setGeometry(pt);
  15. layer.features.add(feature);
  16. layer.flush();

可视化结果如下:

img_dbbc37aa6455087dd181a45ed23accdb.png
b.shp.png

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/247850
推荐阅读
相关标签
  

闽ICP备14008679号