let features = shapes[i].getSource().getFeatures();
if (!features || features.length == 0) continue;
for (let j = 0; j < features.length; j++) {
var geometry = features[j].getGeometry();
isInsidePolygon = geometry.intersectsCoordinate(coordinate);
if (isInsidePolygon) break;
}
можно заменить на
isInsidePolygon = (shapes[i].getSource().getFeaturesAtCoordinate(coordinate).length > 0);
что меньше кода, но, вероятно, не намного эффективнее
Чтобы проверить фигуры на более многочисленных местах, вам нужно создать векторный источник для ваших мест. Используйте экстент формы, чтобы получить короткий список мест, и проверяйте только те, которые соответствуют геометрии формы
let placesFeatures = [];
places.forEach((p) => {
placesFeatures.push(new Feature({
geometry: new Point(fromLonLat[p.longitude, p.latitude]))
id: [p.latitude, p.longitude].toString,
isInsidePolygon: false
}))
})
let placesSource = new VectorSource({features: placesFeatures});
for (let i = 0; i < shapes.length; i++) {
let features = shapes[i].getSource().getFeatures();
if (!features || features.length == 0) continue;
for (let j = 0; j < features.length; j++) {
var geometry = features[j].getGeometry();
let extent = features[j].getGeometry().getExtent();
let candidates = placesSource.getFeaturesInExtent(geometry.getExtent());
if (!candidates || candidates.length == 0) continue;
for (let k = 0; k < candidates.length; k++) {
isInsidePolygon = geometry.intersectsCoordinate(candidates[k].getGeometry().getCoordinates());
if (isInsidePolygon) {
candidates[k].set('isInsidePolygon', true);
}
})
}
}
Тогда вы можете получить результаты от объектов мест в источнике
isInsidePolygons(latitude: number, longitude: number): boolean {
return placesSource.getFeatureById([latitude, longitude].toString()).get('isInsidePolygon');
}