计算多边形的空 space

Calculate empty space of a polygon

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

请看下图为例。 "rectangle"是Trackable-Area多边形,彩色的形状是用户绘制的多边形。白色 space 是我要计算的另一个多边形。

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

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

En 最新版本的库,你只需要使用函数 getArea (OL API Docs - Polygon 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);