/**
* @content 空间分析功能组件
* @author 2019-09-25
*/
import { NativeModules } from "react-native";
let SPA = NativeModules.JSSpaAnalysis;
import GeoPolygons from "./GeoPolygons.js"
import Geometry from "./Geometry.js"
import GeoPolygon from "./GeoPolygon.js"
/**
* @class SpaAnalysis
* @description 空间分析
*/
export default class SpaAnalysis{
/**
* 构造一个新的 SpaAnalysis 对象。
* @memberOf SpaAnalysis
* @returns {Promise.<SpaAnalysis>}
*/
async createObj() {
try{
var {SpaAnalysisId} = await SPA.createObj();
var spaAnalysis = new SpaAnalysis();
spaAnalysis._MGSpaAnalysisId = SpaAnalysisId;
return spaAnalysis;
}catch(e){
console.error(e);
}
}
/**
* 获取容差
* @memberOf SpaAnalysis
* @return {Promise.<double>}容差
*/
async getTolerance()
{
try {
return await SPA.getTolerance(this._MGSpaAnalysisId);
} catch (e) {
console.error(e);
}
}
/**
* 设置容差
* @memberOf SpaAnalysis
* @param {double} tolerance 容差
* @return {Promise.<void>}计算得出的缓冲区
*/
async setTolerance(tolerance)
{
try {
await SPA.setTolerance(this._MGSpaAnalysisId, tolerance);
} catch (e) {
console.error(e);
}
}
/**
* 计算左右缓冲区
* <p>
* 详细说明:<br>
* 特别说明:<br>
* 参数geom几何与左右缓冲半径的单位不一致的情况(sRefSrc必须赋值),如:缓冲半径是米,geom几何单位不是米,源投影坐标系sRefSrc是geom几何数据的空间参考系;
* 缓冲分析返回的结果坐标单位与参数geom几何单位一致<br>
* 参数geom几何与左右缓冲半径的单位一致的情况(sRefSrc赋值null)<br>
* 示例代码:<br>
* 无<br>
* </p>
* @memberOf SpaAnalysis
* @param {Geometry} geom
* @param {double} leftDis 左半径
* @param {double} rightDis 右半径
* @param {int} endCapStyle 缓冲区边界类型 0/1/2-圆角/垂直/平角
* @param {SRefData} sRefSrc 数据的源投影坐标系
* @return {Promise.<GeoPolygons>}计算得出的缓冲区
*/
async bufferWithEndCapStyle(geom, leftDis, rightDis, endCapStyle, sRefSrc)
{
try {
var geoPolygons = null
if(geom != null){
let {GeoPolygonsId} = await SPA.buffer(this._MGSpaAnalysisId, geom._MGGeometryId, leftDis, rightDis, endCapStyle, sRefSrc != null?sRefSrc._MGSRefDataId:null);
var geoPolygons = new GeoPolygons();
geoPolygons._MGGeoPolygonsId = GeoPolygonsId;
}
return geoPolygons;
} catch (e) {
console.error(e);
}
}
/**
* * <p>
* 详细说明:<br>
* 特别说明:<br>
* 参数geom几何与左右缓冲半径的单位不一致的情况(sRefSrc必须赋值),如:缓冲半径是米,geom几何单位不是米,源投影坐标系sRefSrc是geom几何数据的投影坐标系;
* 缓冲分析返回的结果坐标单位与参数geom几何单位一致<br>
* 参数geom几何与左右缓冲半径的单位一致的情况(sRefSrc赋值null)<br>
* 示例代码:<br>
* 无<br>
* </p>
*
* 计算左右缓冲区(圆角边界)
* @memberOf SpaAnalysis
* @param {Geometry} geom
* @param {double} leftDis 左半径
* @param {double} rightDis 右半径
* @param {SRefData} sRefSrc 数据的源投影坐标系
* @return {Promise.<GeoPolygons>}计算得出的缓冲区
*/
async buffer(geom, leftDis, rightDis, sRefSrc)
{
try {
let {GeoPolygonsId} = await SPA.buffer(this._MGSpaAnalysisId, geom._MGGeometryId, leftDis, rightDis, sRefSrc != null?sRefSrc._MGSRefDataId:null);
var geoPolygons = new GeoPolygons();
geoPolygons._MGGeoPolygonsId = GeoPolygonsId;
return geoPolygons;
} catch (e) {
console.error(e);
}
}
/**
* 裁剪
* @memberOf SpaAnalysis
* @param {Geometry} geom 被裁剪几何
* @param {GeoPolygon} clipPoly 裁剪区
* @param {int} flag 裁剪类型 0/1-内裁/外裁
* @return {Promise.<Geometry>}计算得出的缓冲区
* @see 裁剪设置的容差默认值为0.0001,
* 对于经纬度数据,需要传入合适的容差值,对于经纬度数据建议先调用setTolerance()接口使用0.000000001作为容差值
*/
async clipWithType(geom, clipPoly, flag)
{
try {
let {GeometryId} = await SPA.clipWithType(this._MGSpaAnalysisId, geom._MGGeometryId, clipPoly._MGGeoPolygonId, flag);
var geometry = new Geometry();
geometry._MGGeometryId = GeometryId;
return geometry;
} catch (e) {
console.error(e);
}
}
/**
* 裁剪(内裁)
* @memberOf SpaAnalysis
* @param {Geometry} geom 被裁剪几何
* @param {GeoPolygon} clipPoly 裁剪区
* @return {Promise.<Geometry>}计算得出的缓冲区
* @see 裁剪设置的容差默认值为0.0001,
* 对于经纬度数据,需要传入合适的容差值,对于经纬度数据建议先调用setTolerance()接口使用0.000000001作为容差值
*/
async clip(geom, clipPoly)
{
try {
let {GeometryId} = await SPA.clip(this._MGSpaAnalysisId, geom._MGGeometryId, clipPoly._MGGeoPolygonId);
var geometry = new Geometry();
geometry._MGGeometryId = GeometryId;
return geometry;
} catch (e) {
console.error(e);
}
}
/**
* 计算几何对象的凸闭包
* @memberOf SpaAnalysis
* @param {Geometry} geom 几何对象
* @return {Promise.<GeoPolygon>}计算得出的凸闭包区
*/
async convexHull(geom)
{
try {
let {GeoPolygonId} = await SPA.convexHull(this._MGSpaAnalysisId, geom._MGGeometryId);
var geoPolygon = new GeoPolygon();
geoPolygon._MGGeoPolygonId = GeoPolygonId;
return geoPolygon;
} catch (e) {
console.error(e);
}
}
/**
* 计算两个几何对象的差集
* @memberOf SpaAnalysis
* @param {Geometry} inputGeom 输入几何对象
* @param {Geometry} differenceGeom 求差几何对象
* @return {Promise.<Geometry>}得出的两个几何对象的差集
* @see 裁剪设置的容差默认值为0.0001,
* 对于经纬度数据,需要传入合适的容差值,对于经纬度数据建议先调用setTolerance()接口使用0.000000001作为容差值
*/
async difference(inputGeom, differenceGeom)
{
try {
let {GeometryId} = await SPA.difference(this._MGSpaAnalysisId, inputGeom._MGGeometryId, differenceGeom._MGGeometryId);
var geometry = new Geometry();
geometry._MGGeometryId = GeometryId;
return geometry;
} catch (e) {
console.error(e);
}
}
/**
* 计算两个几何对象的交集
* @memberOf SpaAnalysis
* @param {Geometry} inputGeom 输入几何对象
* @param {Geometry} intersectGeom 求交几何对象
* @return {Promise.<Geometry>}得出的两个几何对象的交集
* @see 裁剪设置的容差默认值为0.0001,
* 对于经纬度数据,需要传入合适的容差值,对于经纬度数据建议先调用setTolerance()接口使用0.000000001作为容差值
*/
async intersection(inputGeom, intersectGeom)
{
try {
let {GeometryId} = await SPA.intersection(this._MGSpaAnalysisId, inputGeom._MGGeometryId, intersectGeom._MGGeometryId);
var geometry = new Geometry();
geometry._MGGeometryId = GeometryId;
return geometry;
} catch (e) {
console.error(e);
}
}
/**
* 计算两个几何对象的对称差
* @memberOf SpaAnalysis
* @param {Geometry} inputGeom 输入几何对象
* @param {Geometry} intersectGeom 求对称差几何对象
* @return {Promise.<Geometry>}得出的两个几何对象的对称差
* @see 裁剪设置的容差默认值为0.0001,
* 对于经纬度数据,需要传入合适的容差值,对于经纬度数据建议先调用setTolerance()接口使用0.000000001作为容差值
*/
async symmetricDifference(inputGeom, intersectGeom)
{
try {
let {GeometryId} = await SPA.symmetricDifference(this._MGSpaAnalysisId, inputGeom._MGGeometryId, intersectGeom._MGGeometryId);
var geometry = new Geometry();
geometry._MGGeometryId = GeometryId;
return geometry;
} catch (e) {
console.error(e);
}
}
/**
* 合并两个几何对象
* @memberOf SpaAnalysis
* @param {Array<GeoPolygon>} GeoPolygonArry 需要合并的几何对象
* @return {Promise.<Geometry>}返回合并后的几何对象
* @see 裁剪设置的容差默认值为0.0001,
* 对于经纬度数据,需要传入合适的容差值,对于经纬度数据建议先调用setTolerance()接口使用0.000000001作为容差值
*/
async mergeGeoPolygons(GeoPolygonArry)
{
try {
let {GeometryId} = await SPA.merge(this._MGSpaAnalysisId, GeoPolygonArry);
var geometry = new Geometry();
geometry._MGGeometryId = GeometryId;
return geometry;
} catch (e) {
console.error(e);
}
}
/**
* 合并两个几何对象
* @memberOf SpaAnalysis
* @param {Geometry} inputGeom 输入几何对象
* @param {Geometry} mergeGeom 合并的几何对象
* @return {Promise.<Geometry>}返回合并后的几何对象
* @see 裁剪设置的容差默认值为0.0001,
* 对于经纬度数据,需要传入合适的容差值,对于经纬度数据建议先调用setTolerance()接口使用0.000000001作为容差值
*/
async merge(inputGeom, mergeGeom)
{
try {
let {GeometryId} = await SPA.merge(this._MGSpaAnalysisId, inputGeom._MGGeometryId, mergeGeom._MGGeometryId);
var geometry = new Geometry();
geometry._MGGeometryId = GeometryId;
return geometry;
} catch (e) {
console.error(e);
}
}
/**
* 计算两个几何对象的并集
* @memberOf SpaAnalysis
* @param {Geometry} inputGeom 输入几何对象
* @param {Geometry} unionGeom 求并几何对象
* @return {Promise.<Geometry>}得出的两个几何对象的并集
* @see 裁剪设置的容差默认值为0.0001,
* 对于经纬度数据,需要传入合适的容差值,对于经纬度数据建议先调用setTolerance()接口使用0.000000001作为容差值
*/
async union(inputGeom, unionGeom)
{
try {
let {GeometryId} = await SPA.union(this._MGSpaAnalysisId, inputGeom._MGGeometryId, unionGeom._MGGeometryId);
var geometry = new Geometry();
geometry._MGGeometryId = GeometryId;
return geometry;
} catch (e) {
console.error(e);
}
}
/**
* 指定线分割折线或多边形
* @memberOf SpaAnalysis
* @param {Geometry} geom 输入几何对象
* @param {GeoLine} line 分割线
* @return {Promise.<Geometry>} 返回分割后的结果。分割失败返回null,分割成功返回多线或多区。
* @see 裁剪设置的容差默认值为0.0001,
* 对于经纬度数据,需要传入合适的容差值,对于经纬度数据建议先调用setTolerance()接口使用0.000000001作为容差值
*/
async split(geom, line)
{
try {
let {GeometryId} = await SPA.split(this._MGSpaAnalysisId, geom._MGGeometryId, line._MGGeoLineId);
var geometry = new Geometry();
geometry._MGGeometryId = GeometryId;
return geometry;
} catch (e) {
console.error(e);
}
}
/**
* 提取几何的边界
* @memberOf SpaAnalysis
* @param {Geometry} geom 几何对象
* @return {Promise.<Geometry>}提取的几何边界对象
*/
async boundary(geom)
{
try {
let {GeometryId} = await SPA.boundary(this._MGSpaAnalysisId, geom._MGGeometryId);
var geometry = new Geometry();
geometry._MGGeometryId = GeometryId;
return geometry;
} catch (e) {
console.error(e);
}
}
}