计算多边形的空 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);
我目前正在 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);