Что мне нужно сделать, чтобы получить доступ к координатам?
Короткий ответ
Убедитесь, что geometry
является Point
, прежде чем пытаться получить доступ к свойству coordinates
.
if (staticBreadcrumbs.features[0].geometry.type === 'Point') {
var marker = new Marker(el)
.setLngLat([
this.staticBreadcrumbs.features[0].geometry.coordinates[0],
this.staticBreadcrumbs.features[0].geometry.coordinates[1]
])
.addTo(this.map);
}
Объяснение
Проблема, с которой вы столкнулись, возникает из-за того, что Geometry
является типом объединения .
Тип объединения описывает значение, которое может быть одним из нескольких типов. Мы используем вертикальную черту (|
) для разделения каждого типа ...
Это определение типа объединения Geometry
:
export type Geometry =
Point |
MultiPoint |
LineString |
MultiLineString |
Polygon |
MultiPolygon |
GeometryCollection;
Как видите, тип Geometry
представляет собой объединение семи типов. К сожалению, не все эти типы включают свойство coordinates
.
Если у нас есть значение, имеющее тип объединения, мы можем получить доступ только к тем элементам, которые являются общими для всех типов в объединении.
Именно поэтому мы можем получить доступ к свойству coordinates
только после того, как сузили тип.
Некоторые другие параметры
Если вы используете только Point
типы в вашем FeatureCollection
, то используйте тип Point
в качестве универсального параметра:
let staticBreadcrumbs: FeatureCollection<Point>;
Если вы используете в своем FeatureCollection
различные типы, то используйте приведение, чтобы сказать контролеру типов, что вы уверены, что у вас есть Point
:
(staticBreadcrumbs.features[0].geometry as Point).coordinates[0]
Как показано в Short Answer , вместо использования приведения можно использовать условный оператор для сужения типа:
const geometry = staticBreadcrumbs.features[0].geometry;
if (geometry.type === 'Point') {
const coordinates00 = geometry.coordinates[0];
const coordinates01 = geometry.coordinates[1];
}
Вот краткое демо этого последнего примера здесь .