浏览代码

fix: shape坐标暂时处理

xzw 7 月之前
父节点
当前提交
259f9ab38d
共有 2 个文件被更改,包括 58 次插入18 次删除
  1. 57 17
      public/lib/potree/potree.js
  2. 1 1
      public/lib/potree/potree.js.map

+ 57 - 17
public/lib/potree/potree.js

@@ -38915,7 +38915,7 @@
 
 	class ShapefileLoader {
 	  constructor() {
-	    this.transform = null;
+	    //this.transform = null;
 	  }
 	  async load(path, color) {
 	    var matLine = new LineMaterial({
@@ -38931,11 +38931,12 @@
 	      console.error('no features');
 	      return;
 	    }
+	    var transform = this.analyseTransform(features, path);
 	    var jump = 0;
 	    for (var feature of features) {
 	      //5是碎的
 	      //if(feature.geometry.type!= 'MultiLineString' || ++jump != 5) continue
-	      var fnode = this.featureToSceneNode(feature, matLine);
+	      var fnode = this.featureToSceneNode(feature, matLine, transform);
 	      fnode && node.add(fnode);
 	    }
 	    var setResolution = (x, y) => {
@@ -38948,16 +38949,56 @@
 	    };
 	    return result;
 	  }
-	  featureToSceneNode(feature, matLine) {
+	  analyseTransform(features, path) {
+	    //xzw只能自己暂时判断下 ,最好能根据.prj判断
+
+	    if (viewer.transform) {
+	      var count = 0,
+	        maxCount = 100;
+	      var notLonLat, transform;
+	      var judge = coord => {
+	        if (!(coord[0] >= -180 && coord[0] <= 180 && coord[1] >= -90 && coord[1] <= 90)) {
+	          //如果超出经纬度范围,那就不是经纬度
+	          notLonLat = true;
+	        }
+	        count++;
+	      };
+	      for (var feature of features) {
+	        if (count > maxCount) break;
+	        for (var arr of feature.geometry.coordinates) {
+	          if (arr[0] instanceof Array) {
+	            for (var coord of arr) {
+	              judge(coord);
+	              if (count > maxCount || notLonLat) break;
+	            }
+	          } else {
+	            judge(arr);
+	            if (count > maxCount || notLonLat) break;
+	          }
+	        }
+	      }
+	      if (notLonLat) {
+	        transform = v => {
+	          var a = viewer.transform.lonlatTo4550.inverse(v); //这种类型和不使用transform很接近
+	          return viewer.transform.lonlatToLocal.forward(a);
+	        };
+	        console.log('该shape使用大地坐标', path.split('/').pop());
+	      } else {
+	        transform = viewer.transform.lonlatToLocal.forward;
+	        console.log('该shape使用经纬度', path.split('/').pop());
+	      }
+	      return transform;
+
+	      //loaders.shapeLoader.transform = viewer.transform.lonlatToLocal.forward;
+	    }
+	  }
+	  featureToSceneNode(feature, matLine, transform) {
 	    //console.log(feature)
 
 	    var geometry = feature.geometry;
 	    var color = new Color(1, 1, 1);
-	    var transform = this.transform;
-	    if (transform === null) {
-	      transform = v => {
-	        v;
-	      }; //{forward: (v) => v};
+	    if (!transform) {
+	      transform = v => v; //{forward: (v) => v};
 	    }
 	    if (geometry.type === "Point") {
 	      var sg = new SphereGeometry(1, 18, 18);
@@ -39004,7 +39045,7 @@
 	        var coordinateSlice = [];
 	        points.forEach(point => {
 	          var [long, lat] = point;
-	          var pos = transform.forward([long, lat]);
+	          var pos = transform /* .forward */([long, lat]);
 	          _min.x = Math.min(_min.x, pos[0]);
 	          _min.y = Math.min(_min.y, pos[1]);
 	          _min.z = Math.min(_min.z, 20);
@@ -85978,14 +86019,13 @@
 	        loadDone(object);
 	      }, fileInfo);
 	    } else if (fileInfo.fileType == 'shp') {
-	      if (viewer.transform) {
-	        loaders.shapeLoader.transform = v => {
-	          var a = viewer.transform.lonlatTo4550.inverse(v);
-	          return viewer.transform.lonlatToLocal.forward(a);
-	        };
-
-	        //viewer.transform.lonlatToLocal;
-	      }
+	      /* if(viewer.transform){
+	          loaders.shapeLoader.transform = (v)=>{ 
+	              let a = viewer.transform.lonlatTo4550.inverse(v)
+	              return viewer.transform.lonlatToLocal.forward(a)
+	          }  
+	            //loaders.shapeLoader.transform = viewer.transform.lonlatToLocal.forward;
+	      } */
 	      var shp = await loaders.shapeLoader.load(fileInfo.url, fileInfo.color);
 	      var shpModel = shp.node;
 	      loadDone(shpModel);

文件差异内容过多而无法显示
+ 1 - 1
public/lib/potree/potree.js.map