如何使用 React-Native 为 Mapbox 使用 ShapeSource 和 Circle 层显示动态检索的 GeoJSON
How to show dynamically retrieved GeoJSON using a ShapeSource and Circle layer for Mapbox using React-Native
当我将它们输出到例如对于控制台,它会是这样的:
{type: "feature" geometry: {type: point, coordinates: array(2)}
properties: {extra properties}}
从我的 API 中检索了多个这些功能并存储在状态中。目前,检索到的最大特征量介于 0 到 50 个特征之间。所以我猜这不是需要渲染太多功能的问题。
在下面链接的项目 GitHub 页面上找到了一个示例,它做了类似的事情,但他们使用的是 url 而不是像我正在使用的形状 属性 .根据文档,哪个应该能够执行我正在尝试的操作。
Link 举个例子:
https://github.com/react-native-mapbox-gl/maps/blob/master/example/src/examples/EarthQuakes.js
Link 到文档:
https://github.com/react-native-mapbox-gl/maps/blob/master/docs/ShapeSource.md
我还尝试了在此 SO post 上找到的几种解决方案:
How do you convert normal geographic json coming from server into geoJson?
目前我的渲染方法如下所示:
render() {
return (
<View style={styles.container}>
<MapboxGL.MapView
showUserLocation={true}
rotateEnabled={false}
style={styles.map}
ref={map => { this.map = map; }}
styleURL={MapboxGL.StyleURL.Street}
onRegionDidChange={this.onRegionDidChange}
onDidFinishLoadingMap={this.onDidFinishLoadingMap}>
<MapboxGL.UserLocation
visible={true}/>
<MapboxGL.ShapeSource
id='routeSource'
shape={{type: "FeatureCollection", features:
this.state.routes}}
type='geojson'>
<MapboxGL.CircleLayer
id="singlePoint"
style={layerStyle.singlePoint}
/>
</MapboxGL.ShapeSource>
<MapboxGL.Camera
ref={camera => {this.camera = camera;}}
zoomLevel={8}/>
</MapboxGL.MapView>
</View>
);
所有代码在 android 和 iOS 上都可以正常编译,控制台或模拟器上都没有错误。预期结果是使用添加到状态的特征在地图上呈现圆圈
所以在另一个需要我注意的项目之后,我昨天才弄清楚了这个。在我上面的例子中,我做了类似下面的代码。
<MapboxGL.ShapeSource shape={{type: "FeatureCollection", features: this.state.routes}}/>
过了一会儿我发现shape对象实际上需要你提供一个完整的geojson对象。这是我认为我已经提供的东西,但看起来我没有。首先,我为 Javascript 安装了一个包,使我能够将某些内容解析为 geojson。 NPM Package I used.
然后我开始通过执行以下操作将我的数据对象映射到一个空数组:
let data = [];
outsideMarkerlist.map((element) => {
data.push(element);
})
实际上我不确定是否需要执行上述步骤,但这似乎对我有用。结果数组是我能够像这样解析为实际的 geojson 的东西:
const geojson = GeoJSON.parse(data, {Point: ['latitude', 'longitude']});
第二个参数表示几何体的类型,请查看支持类型的文档。还要确保将 'latitude' 和 'longitude' 变量更改为数据集中表示这些值的属性的名称,然后您应该能够解决问题。
this.setState({json: geojson})
所以现在唯一要显示的部分是渲染函数中的形状源。这看起来像下面的代码。
<MapboxGL.ShapeSource id="routeSource" shape={this.state.json}>
<MapboxGL.LineLayer
id="routeFill"
style={layerStyles.route}
/>
</MapboxGL.ShapeSource>
当我将它们输出到例如对于控制台,它会是这样的:
{type: "feature" geometry: {type: point, coordinates: array(2)}
properties: {extra properties}}
从我的 API 中检索了多个这些功能并存储在状态中。目前,检索到的最大特征量介于 0 到 50 个特征之间。所以我猜这不是需要渲染太多功能的问题。
在下面链接的项目 GitHub 页面上找到了一个示例,它做了类似的事情,但他们使用的是 url 而不是像我正在使用的形状 属性 .根据文档,哪个应该能够执行我正在尝试的操作。
Link 举个例子: https://github.com/react-native-mapbox-gl/maps/blob/master/example/src/examples/EarthQuakes.js
Link 到文档: https://github.com/react-native-mapbox-gl/maps/blob/master/docs/ShapeSource.md
我还尝试了在此 SO post 上找到的几种解决方案: How do you convert normal geographic json coming from server into geoJson?
目前我的渲染方法如下所示:
render() {
return (
<View style={styles.container}>
<MapboxGL.MapView
showUserLocation={true}
rotateEnabled={false}
style={styles.map}
ref={map => { this.map = map; }}
styleURL={MapboxGL.StyleURL.Street}
onRegionDidChange={this.onRegionDidChange}
onDidFinishLoadingMap={this.onDidFinishLoadingMap}>
<MapboxGL.UserLocation
visible={true}/>
<MapboxGL.ShapeSource
id='routeSource'
shape={{type: "FeatureCollection", features:
this.state.routes}}
type='geojson'>
<MapboxGL.CircleLayer
id="singlePoint"
style={layerStyle.singlePoint}
/>
</MapboxGL.ShapeSource>
<MapboxGL.Camera
ref={camera => {this.camera = camera;}}
zoomLevel={8}/>
</MapboxGL.MapView>
</View>
);
所有代码在 android 和 iOS 上都可以正常编译,控制台或模拟器上都没有错误。预期结果是使用添加到状态的特征在地图上呈现圆圈
所以在另一个需要我注意的项目之后,我昨天才弄清楚了这个。在我上面的例子中,我做了类似下面的代码。
<MapboxGL.ShapeSource shape={{type: "FeatureCollection", features: this.state.routes}}/>
过了一会儿我发现shape对象实际上需要你提供一个完整的geojson对象。这是我认为我已经提供的东西,但看起来我没有。首先,我为 Javascript 安装了一个包,使我能够将某些内容解析为 geojson。 NPM Package I used.
然后我开始通过执行以下操作将我的数据对象映射到一个空数组:
let data = [];
outsideMarkerlist.map((element) => {
data.push(element);
})
实际上我不确定是否需要执行上述步骤,但这似乎对我有用。结果数组是我能够像这样解析为实际的 geojson 的东西:
const geojson = GeoJSON.parse(data, {Point: ['latitude', 'longitude']});
第二个参数表示几何体的类型,请查看支持类型的文档。还要确保将 'latitude' 和 'longitude' 变量更改为数据集中表示这些值的属性的名称,然后您应该能够解决问题。
this.setState({json: geojson})
所以现在唯一要显示的部分是渲染函数中的形状源。这看起来像下面的代码。
<MapboxGL.ShapeSource id="routeSource" shape={this.state.json}>
<MapboxGL.LineLayer
id="routeFill"
style={layerStyles.route}
/>
</MapboxGL.ShapeSource>