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