Javascript 在ES6模块中使用JSTS isValid()

Javascript 在ES6模块中使用JSTS isValid(),javascript,ecmascript-6,openlayers,Javascript,Ecmascript 6,Openlayers,我正在尝试配置JST以使用ES6模块加载,这样就不必包含整个库 关于如何在线执行此操作的示例很少,包括使用扩展函数来拉入功能,但是所有尝试使isValid方法工作的尝试都失败了: import extend from 'jsts/extend'; import Geometry from 'jsts/org/locationtech/jts/geom/Geometry'; import Valid from 'jsts/org/locationtech/jts/operation/valid';

我正在尝试配置JST以使用ES6模块加载,这样就不必包含整个库

关于如何在线执行此操作的示例很少,包括使用扩展函数来拉入功能,但是所有尝试使isValid方法工作的尝试都失败了:

import extend from 'jsts/extend';
import Geometry from 'jsts/org/locationtech/jts/geom/Geometry';
import Valid from 'jsts/org/locationtech/jts/operation/valid';
import WKTReader from 'jsts/org/locationtech/jts/io/WKTReader';    

    extend(Geometry.prototype, {
        buffer: function () {
            return Valid.isValid(this, ...arguments);
        }
    })


    let reader = new WKTReader();
    var geom = reader.read('POLYGON ((80 300, 280 300, 280 80, 80 80, 80 300), (260 280, 180 200, 100 280, 100 100, 260 100, 260 280))');        
    console.log(geom.isValid());
每次我回来的都是: 未捕获类型错误:geom.isValid不是函数

JSTS ES6实现示例:

我通过以下方法在一定程度上实现了这一功能:

    import WKTReader from 'jsts/org/locationtech/jts/io/WKTReader';
    import Valid from 'jsts/org/locationtech/jts/operation/valid/IsValidOp';

    const valid = new Valid();

    let reader = new WKTReader();
    var geom = reader.read('POLYGON ((80 300, 280 300, 280 80, 80 80, 80 300), (260 280, 180 200, 100 280, 100 100, 260 100, 260 280))');      

    console.log('Valid: ', valid.isValid(geom));

对于上面的多边形,现在返回“true”。但是,如果多边形中存在错误,那么JSTS只会抛出一个未捕获的错误,因此从库中捕获错误是我的下一个问题…

您可以这样实现:

此示例与GeoJsonReader一起使用,但与Wktrader的工作方式类似

import*作为jst从'jsts/dist/jsts'导入;
const reader=new jsts.io.GeoJSONReader();
const g=reader.read({
“类型”:“特征”,
“几何学”:{
“类型”:“多边形”,
“坐标”:[
[-4.724834116462489, 48.54429850016129],
[-4.806692014663952, 48.35426654640426],
[-4.54747533707436, 48.36333181438215],
[-4.533832354037941, 48.24535748577782],
[-4.724834116462489, 48.54429850016129]
]
}
});
如果(!g.geometry.isValid()){
//发生错误时,执行您想要的操作
}

除了Alex的答案之外-可能会帮助某人

打字:

declare namespace jsts {
  namespace operation {
    namespace valid {
      export class IsValidOp {
        constructor(geom: geom.Geometry);

        static isValid(coord?: geom.Coordinate): boolean;
      }
    }
  }
}

declare module 'jsts' {
  export = jsts;
}
用法:

import { IsValidOp as JstsIsValidOp } from 'jsts/org/locationtech/jts/operation/valid';

if (new JstsIsValidOp(jstsHole).isValid()) {
  ...
}
当正确地以小部分而不是全局导入JST时,请查看operation namespace/-folder。尤其是关联、覆盖和有效目录可能会有所帮助


导入完整的ES5/6构建还将全局包含monkey.js,这将为几何体添加方便的函数,但会抛出循环依赖项警告并增加构建大小。

我建议不要全局导入JST/full lib,而是逐个模块导入,如“导入{Geometry as JstsGeometry}来自“jsts/org/locationtech/jts/geom”;从'jsts/org/locationtech/jts/operation/valid'导入{IsValidOp as JstsIsValidOp};从“jsts/org/locationtech/jts/operation/overlay”导入{OverlayOp as JstsOverlayOp}`