Math 计算多边形的空白空间

Math 计算多边形的空白空间,math,geometry,openlayers,Math,Geometry,Openlayers,我目前正在Openlayers中的一个项目中工作,我们允许用户绘制多边形形状。这些形状只允许在另一个多边形内绘制,为了清晰起见,我将其称为可跟踪区域。为了满足客户的一个要求,我需要找到可跟踪区域的空白空间。我已经找到了空空间的面积大小,但我不知道如何将空空间计算为多边形 请参见下图作为示例。“矩形”是可跟踪区域多边形,彩色形状是用户绘制的多边形。我的目标是将空白计算为另一个多边形 一种可能是删除可跟踪区域(T)的de区域,以及用户在可跟踪区域(S)内绘制的所有多边形的总面积 E=T-S,其中E是

我目前正在Openlayers中的一个项目中工作,我们允许用户绘制多边形形状。这些形状只允许在另一个多边形内绘制,为了清晰起见,我将其称为可跟踪区域。为了满足客户的一个要求,我需要找到可跟踪区域的空白空间。我已经找到了空空间的面积大小,但我不知道如何将空空间计算为多边形

请参见下图作为示例。“矩形”是可跟踪区域多边形,彩色形状是用户绘制的多边形。我的目标是将空白计算为另一个多边形


一种可能是删除可跟踪区域(
T
)的de区域,以及用户在可跟踪区域(
S
)内绘制的所有多边形的总面积

E=T-S
,其中
E
是空白区域


在该库的最新版本中,您只需使用函数
getArea
()。

我找到了一个解决方案,创建一个包含所有绘制多边形的多多边形,然后利用JSTS库计算多多边形和可跟踪区域多边形之间的差异:

// map JSTS GeoJSON-readers
const jstsGeoJSONReader = new jsts.io.GeoJSONReader();
const jstsGeoJSONWriter = new jsts.io.GeoJSONWriter();
// ol GeoJSON-format
const geoJSONFormat = new GeoJSON();
let trackableAreaFeature;
let trackableAreaGeomJSTS;

// trackable area geometry parsed to JSTS
const TrackableAreaLayer = this.mapService.getLayerByName(LAYERS.TRACKABLE_AREA);
trackableAreaFeature = TrackableAreaLayer.getSource().getFeatureById('Trackable Area');
trackableAreaGeomJSTS = jstsGeoJSONReader.read(geoJSONFormat.writeFeatureObject(trackableAreaFeature)).geometry;

// create multiPolygon consisting of drawn zones
const multiPolygon = new MultiPolygon([]);
const zoneSource = drawnAreaLayer.getSource();
const zoneFeatures = drawnAreaLayer.getSource().getFeatures();

zoneFeatures.forEach(zone => {
  const zoneGeometry = zone.getGeometry();
  multiPolygon.appendPolygon(zoneGeometry);
});

// parse multipolygon to JSTS
const multiPolygonJSTS = jstsGeoJSONReader.read(geoJSONFormat.writeGeometry(multiPolygon));

// calculate difference between trackable area and multipolygon
const unmappedAreaJSTS = trackableAreaGeomJSTS.difference(multiPolygonJSTS);
const unmappedAreaGeometry = jstsGeoJSONWriter.write(unmappedAreaJSTS);

// parse multipolygon from GeoJSON to ol geometry
const unmappedAreaMultiPolygonGeometry = geoJSONFormat.readGeometry(unmappedAreaGeometry);

// create ol feature based on parsed geometry
const unmappedAreaFeature = new Feature({
  geometry: unmappedAreaMultiPolygonGeometry
});

// add Feature to source of layer
zoneSource.addFeature(unmappedAreaFeature);

谢谢,这也是一个解决办法。我已经使用JSTS库来计算差异,并将其作为一个单独的答案发布。