Вычислить пустое пространство многоугольника - PullRequest
0 голосов
/ 10 февраля 2020

В настоящее время я работаю над проектом в Openlayers, где мы позволяем пользователям рисовать многоугольники. Эти фигуры разрешено рисовать только внутри другого многоугольника, который для ясности я назову «Отслеживаемая область». Чтобы удовлетворить одно из требований заказчика, мне нужно найти свободное место в Trackable-Area. Я уже достиг определения размера области пустого пространства, но я теряюсь в том, как рассчитать пустое пространство как многоугольник.

Пожалуйста, посмотрите на следующую картинку в качестве примера. «Прямоугольник» - это многоугольник «Отслеживаемая область», а цветные фигуры - это нарисованные пользователем многоугольники. Пробел - это то, что я хочу вычислить как еще один многоугольник.

enter image description here

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Я нашел решение этой проблемы, создав мультиполигон, содержащий все нарисованные полигоны, а затем используя библиотеку 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);
1 голос
/ 10 февраля 2020

Одной из возможностей может быть удаление области de отслеживаемой области (T) с суммированной областью всех многоугольников, нарисованных пользователем внутри отслеживаемой области (S).

E = T - S, где E - пустая область.

В самой новой версии библиотеки вам просто нужно использовать функцию getArea ( OL API Docs - Polygon getArea ).

...