WEBGl之THREEJS导入shp文件,生成三维模型

如果threejs可以导入shp文件,就可以呈现效果那是多么完美的事情啊!当然这是肯定的,那是我在经历的痛苦期,现在来分享我的甜品。

ps.我的其中一篇是关于json格式的,知道我为啥这么了解吗,就是最先的思路是将shp文件转成json 的格式,然后用threejs 读取。然后就没有然后了。

有个偶然,一个QQ群的人,告诉我有个大神写了shp.js,可以读取线坐标,这才是我豁然开朗。(附上:https://www.bram.us/2012/07/30/shp-js-javascript-shapefile-parser/)

这只是一个开始。。。。。。正如大家看到的,这个怎么是圆的,我的内心是崩溃的。。

之后,我就开始潜心,通读代码,已经修改代码之旅了。。。。(大家也可以下载上面的那个网址的示例,附有代码的,可以改着玩)

首先是,shp.js看到这个js,我直接放弃了,这不是真的放弃,指的是根本不用修改其中的代码,目的很明确就是将shp格式的文件读取出来(点、线、面)。

shp_three.js(要说shp.js是核心,那这是核心中的核心)

思路:第一步要做的就是怎么把圆的变成平的

在shp_three.js中有spherize

是不是很开心,没错,就是这个才让整体效果变成圆形的,因此,不多说,直接将这段代码注释。如下

/* if (spherize)
 {
   //判断是球形状吗,是的话,
   var a = -x/180*Math.PI;
   var t = y/180*Math.PI;
   y = Math.sin(t) * 90;
   x = Math.cos(a) * 90 * Math.cos(t);
   var z = Math.sin(a) * 90 * Math.cos(t);
   poly.push(new THREE.Vector3(x, y, z));
 }
 else
 {
   poly.push(new THREE.Vector3(x, y, 0));
 }*/

知道不是只有这么一处

/* if (spherize) {
    var k;
     //方案一、平面
    var verts = [];
    var vs = geo.vertices;
    for (k=0; k<geo.faces.length; k++) {
    var f = geo.faces[k];
    verts.push(vs[f.a], vs[f.b], vs[f.c]);
    }
    geo = new THREE.Geometry();
    geo.vertices = verts;
    for (k=0; k<verts.length; k+=3) {
    geo.faces.push(new THREE.Face3(k, k+1, k+2));
    }
     //方案二、曲面
    /!*for (k=0; k<geo.vertices.length; k++) {
      var v = geo.vertices[k];
      var a = -v.x/180*Math.PI;
      var t = v.y/180*Math.PI;
      v.y = Math.sin(t);
      v.x = Math.cos(a) * Math.cos(t);
      v.z = Math.sin(a) * Math.cos(t);
      }
      for (k=0; k<geo.vertices.length; k++) {
      geo.vertices[k].setLength(90);
      }*!/
 }*/

我自己随便在本地找了一个shp,效果:

这样就差不多能把它变成平的了,但是我们的目的是要显示三维呀,平的没用!

然后,就要进行拉伸处理

原先,它的代码,就是lines.push(geo)。

if (false && r.type == SHP.POLYGON)
{
  console.log(‘new polygon‘, poly.length, points.length/2);
  poly.pop();
  polys.push(new THREE.ExtrudeGeometry(new THREE.Shape(poly), {amount: 0}));
}
else
{
  console.log(‘new polyline‘, poly.length, points.length/2);
  var geo = new THREE.Geometry();
  geo.vertices = poly;
    lines.push(geo);

我们要把它改成

if (false && r.type == SHP.POLYGON)
{
  console.log(‘new polygon‘, poly.length, points.length/2);
  poly.pop();
  polys.push(new THREE.ExtrudeGeometry(new THREE.Shape(poly), {amount: 0}));
}
else
{
  console.log(‘new polyline‘, poly.length, points.length/2);

    var geo=new THREE.ExtrudeGeometry(new THREE.Shape(poly), {
        amount:10,
        bevelThickness: 2,
        bevelSize: 0.5,
        bevelEnabled: false,
        curveSegments: 12});
    lines.push(geo);

到此,差不多效果就出来了,咱们加上光照,材质等

效果

目前只是修改到这里,只是实现了三维的效果,关于材质、光照以及更美好的展现,还有待进一步的研究。

原文地址:https://www.cnblogs.com/lishanyang/p/12418678.html

时间: 2024-10-16 16:17:10

WEBGl之THREEJS导入shp文件,生成三维模型的相关文章

geotools导入shp文件到Oracle数据库时表名带下划线的问题解决

问题: 最近在做利用geotools导入shp文件到Oracle表中,发现一个问题Oracle表名带下划线时导入失败,问题代码行: dsOracle.getFeatureWriterAppend(oracleTable, Transaction.AUTO_COMMIT); dsOracle为org.geotools.data.DataStore类型对象 解决方案: 网上查阅资料发现是Oracle11的java包ojdbc的版本问题,maven中搜索ojdbc发现最新版如下图 pom配置: <!-

geoserver rest 导入shape文件错误

使用rest接口导入shp文件时出错,java.io.ioexception: current fid index is null, next must be called before write(),网上找了一下,找到了一篇文章,地址http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%9A%84/14090.shtml 自己又仔细研究了一下出错的地方的源码,先贴一下在讲原因 org.geotools.data.shapefile.d

PostGIS导入导出SHP文件常用命令

SHP导入POSTGIS数据库 引用 直接导入数据库 shp2pgsql  -I -s 2437 -W GBK shop_point.shp public.ntable | psql -U postgres -w -d jwsz 导出sql再导入数据库 shp2pgsql -s "2437" -W "GBK" -I D:\shop_point.shp newTable > D:\shop_point.sql psql -U postgres -f D:/sho

大容量导入和导出数据 -- 格式化文件生成

大容量导入和导出数据 -- 格式化文件生成 SQL Server 支持两种类型的格式化文件:非 XML 格式和 XML 格式.非 XML 格式是 SQL Server 早期版本支持的原始格式. 通常,XML 与非 XML 格式化文件可以互换. 但是,建议您为新的格式化文件使用 XML 语法,因为与非 XML 格式化文件相比,格式化文件具有多项优点. 格式化文件基于指定的数据类型选项(-n.-c.-w 或 -N)以及表或视图分隔符. 创建非XML格式化文件 若要使用 bcp 命令创建格式化文件,请

奥维ovobj 文件,转化为shp文件,再变sql文件导入到pgsql里

先变 KML 文件. 再用 QGIS的矢量 变成 shp文件. ** 最后 . shp2pgsql -W utf8 -s 4326 /home/manbug/ningbo/NB.shp ningbo_524>/home/manbug/ningbo/NBnew.sqlhttps://www.cnblogs.com/think8848/p/6929351.html 原文地址:http://blog.51cto.com/13000661/2126427

-05 08:57 ARCGIS地统计学计算文件后缀名为.shp文件制作

2011-07-05 08:57 ARCGIS地统计学计算文件后缀名为.shp文件制作 ARCAMP软件要进行地统计计算的文件后格式后缀名必须为.shp的文件,网上介绍的方法复杂难懂,那么制作.shp的文件怎么制作呢? 1.打开ArcMAP软件,点菜单栏“工具”下拉菜单中的“添加XY数据”,出现“添加XY数据”对话框,添加电子表格数据 “.dbf3”格式文件(参考“用ArcGIS9.3中标出地图中GPS点方法”第3点),点确定,GPS采集点出来了. 2.右单击图层栏刚才“添加XY数据”进来的文件

android 导入自己的生成的jar,老是 could not find class

最近开始学习android,开发一个小项目,功能很简单,就是从服务器上获取数据,之后显示在手机上.打算把访问服务器的功能打包成一个jar文件.然后android 引入jar包. 在eclipse 里 新建了一个java项目.之后完成代码测试,打包成jar文件 都很顺利.引用到android项目中,调试总报错,could not find class . 折腾了几天,都没有解决,几乎试遍 了,网上的所有方法都不行.后来突然意识到,是不是java项目的jar 不能引用到android 中.后来新建一

【亲测有效】在Android studio中导入.so文件

1.先在工程的libs文件下导入.so文件 2.在build.gradle中(本工程的gradle文件)中的android{}段内填入 /** 导入so文件 */task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") { destinationDir file("$projectDir/libs") baseName "Native_Li

结合C++和GDAL实现shapefile(shp)文件的创建和写入

工具:vs2012+GDAL 2.0 包含头文件: #include "ogrsf_frmts.h" int main() { const char *pszDriverName = "ESRI Shapefile"; GDALDriver *poDriver; GDALAllRegister(); poDriver = GetGDALDriverManager()->GetDriverByName(pszDriverName ); if( poDriver