react-native-mapbox-gl
Version:
A Mapbox GL react native module for creating custom maps
315 lines (301 loc) • 10.6 kB
JavaScript
'use strict';
/* eslint no-console: 0 */
import React, { Component } from 'react';
import Mapbox, { MapView } from 'react-native-mapbox-gl';
import {
AppRegistry,
StyleSheet,
Text,
StatusBar,
View,
ScrollView
} from 'react-native';
const accessToken = 'your-mapbox.com-access-token';
Mapbox.setAccessToken(accessToken);
class MapExample extends Component {
state = {
center: {
latitude: 40.72052634,
longitude: -73.97686958312988
},
zoom: 11,
userTrackingMode: Mapbox.userTrackingMode.none,
annotations: [{
coordinates: [40.72052634, -73.97686958312988],
type: 'point',
title: 'This is marker 1',
subtitle: 'It has a rightCalloutAccessory too',
rightCalloutAccessory: {
source: { uri: 'https://cldup.com/9Lp0EaBw5s.png' },
height: 25,
width: 25
},
annotationImage: {
source: { uri: 'https://cldup.com/CnRLZem9k9.png' },
height: 25,
width: 25
},
id: 'marker1'
}, {
coordinates: [40.714541341726175,-74.00579452514648],
type: 'point',
title: 'Important!',
subtitle: 'Neat, this is a custom annotation image',
annotationImage: {
source: { uri: 'https://cldup.com/7NLZklp8zS.png' },
height: 25,
width: 25
},
id: 'marker2'
}, {
coordinates: [[40.76572150042782,-73.99429321289062],[40.743485405490695, -74.00218963623047],[40.728266950429735,-74.00218963623047],[40.728266950429735,-73.99154663085938],[40.73633186448861,-73.98983001708984],[40.74465591168391,-73.98914337158203],[40.749337730454826,-73.9870834350586]],
type: 'polyline',
strokeColor: '#00FB00',
strokeWidth: 4,
strokeAlpha: .5,
id: 'foobar'
}, {
coordinates: [[40.749857912194386, -73.96820068359375], [40.741924698522055,-73.9735221862793], [40.735681504432264,-73.97523880004883], [40.7315190495212,-73.97438049316406], [40.729177554196376,-73.97180557250975], [40.72345355209305,-73.97438049316406], [40.719290332250544,-73.97455215454102], [40.71369559554873,-73.97729873657227], [40.71200407096382,-73.97850036621094], [40.71031250340588,-73.98691177368163], [40.71031250340588,-73.99154663085938]],
type: 'polygon',
fillAlpha: 1,
strokeColor: '#ffffff',
fillColor: '#0000ff',
id: 'zap'
}]
};
onRegionDidChange = (location) => {
this.setState({ currentZoom: location.zoomLevel });
console.log('onRegionDidChange', location);
};
onRegionWillChange = (location) => {
console.log('onRegionWillChange', location);
};
onUpdateUserLocation = (location) => {
console.log('onUpdateUserLocation', location);
};
onOpenAnnotation = (annotation) => {
console.log('onOpenAnnotation', annotation);
};
onRightAnnotationTapped = (e) => {
console.log('onRightAnnotationTapped', e);
};
onLongPress = (location) => {
console.log('onLongPress', location);
};
onTap = (location) => {
console.log('onTap', location);
};
onChangeUserTrackingMode = (userTrackingMode) => {
this.setState({ userTrackingMode });
console.log('onChangeUserTrackingMode', userTrackingMode);
};
componentWillMount() {
this._offlineProgressSubscription = Mapbox.addOfflinePackProgressListener(progress => {
console.log('offline pack progress', progress);
});
this._offlineMaxTilesSubscription = Mapbox.addOfflineMaxAllowedTilesListener(tiles => {
console.log('offline max allowed tiles', tiles);
});
this._offlineErrorSubscription = Mapbox.addOfflineErrorListener(error => {
console.log('offline error', error);
});
}
componentWillUnmount() {
this._offlineProgressSubscription.remove();
this._offlineMaxTilesSubscription.remove();
this._offlineErrorSubscription.remove();
}
addNewMarkers = () => {
// Treat annotations as immutable and create a new one instead of using .push()
this.setState({
annotations: [ ...this.state.annotations, {
coordinates: [40.73312,-73.989],
type: 'point',
title: 'This is a new marker',
id: 'foo'
}, {
'coordinates': [[40.749857912194386, -73.96820068359375], [40.741924698522055,-73.9735221862793], [40.735681504432264,-73.97523880004883], [40.7315190495212,-73.97438049316406], [40.729177554196376,-73.97180557250975], [40.72345355209305,-73.97438049316406], [40.719290332250544,-73.97455215454102], [40.71369559554873,-73.97729873657227], [40.71200407096382,-73.97850036621094], [40.71031250340588,-73.98691177368163], [40.71031250340588,-73.99154663085938]],
'type': 'polygon',
'fillAlpha': 1,
'fillColor': '#000000',
'strokeAlpha': 1,
'id': 'new-black-polygon'
}]
});
};
updateMarker2 = () => {
// Treat annotations as immutable and use .map() instead of changing the array
this.setState({
annotations: this.state.annotations.map(annotation => {
if (annotation.id !== 'marker2') { return annotation; }
return {
coordinates: [40.714541341726175,-74.00579452514648],
'type': 'point',
title: 'New Title!',
subtitle: 'New Subtitle',
annotationImage: {
source: { uri: 'https://cldup.com/7NLZklp8zS.png' },
height: 25,
width: 25
},
id: 'marker2'
};
})
});
};
removeMarker2 = () => {
this.setState({
annotations: this.state.annotations.filter(a => a.id !== 'marker2')
});
};
render() {
StatusBar.setHidden(true);
return (
<View style={styles.container}>
<MapView
ref={map => { this._map = map; }}
style={styles.map}
initialCenterCoordinate={this.state.center}
initialZoomLevel={this.state.zoom}
initialDirection={0}
rotateEnabled={true}
scrollEnabled={true}
zoomEnabled={true}
showsUserLocation={false}
styleURL={Mapbox.mapStyles.dark}
userTrackingMode={this.state.userTrackingMode}
annotations={this.state.annotations}
annotationsAreImmutable
onChangeUserTrackingMode={this.onChangeUserTrackingMode}
onRegionDidChange={this.onRegionDidChange}
onRegionWillChange={this.onRegionWillChange}
onOpenAnnotation={this.onOpenAnnotation}
onRightAnnotationTapped={this.onRightAnnotationTapped}
onUpdateUserLocation={this.onUpdateUserLocation}
onLongPress={this.onLongPress}
onTap={this.onTap}
/>
<ScrollView style={styles.scrollView}>
{this._renderButtons()}
</ScrollView>
</View>
);
}
_renderButtons() {
return (
<View>
<Text onPress={() => this._map && this._map.setDirection(0)}>
Set direction to 0
</Text>
<Text onPress={() => this._map && this._map.setZoomLevel(6)}>
Zoom out to zoom level 6
</Text>
<Text onPress={() => this._map && this._map.setCenterCoordinate(48.8589, 2.3447)}>
Go to Paris at current zoom level {parseInt(this.state.currentZoom)}
</Text>
<Text onPress={() => this._map && this._map.setCenterCoordinateZoomLevel(35.68829, 139.77492, 14)}>
Go to Tokyo at fixed zoom level 14
</Text>
<Text onPress={() => this._map && this._map.easeTo({ pitch: 30 })}>
Set pitch to 30 degrees
</Text>
<Text onPress={this.addNewMarkers}>
Add new marker
</Text>
<Text onPress={this.updateMarker2}>
Update marker2
</Text>
<Text onPress={() => this._map && this._map.selectAnnotation('marker1')}>
Open marker1 popup
</Text>
<Text onPress={() => this._map && this._map.deselectAnnotation()}>
Deselect annotation
</Text>
<Text onPress={this.removeMarker2}>
Remove marker2 annotation
</Text>
<Text onPress={() => this.setState({ annotations: [] })}>
Remove all annotations
</Text>
<Text onPress={() => this._map && this._map.setVisibleCoordinateBounds(40.712, -74.227, 40.774, -74.125, 100, 0, 0, 0)}>
Set visible bounds to 40.7, -74.2, 40.7, -74.1
</Text>
<Text onPress={() => this.setState({ userTrackingMode: Mapbox.userTrackingMode.followWithHeading })}>
Set userTrackingMode to followWithHeading
</Text>
<Text onPress={() => this._map && this._map.getCenterCoordinateZoomLevel((location)=> {
console.log(location);
})}>
Get location
</Text>
<Text onPress={() => this._map && this._map.getDirection((direction)=> {
console.log(direction);
})}>
Get direction
</Text>
<Text onPress={() => this._map && this._map.getBounds((bounds)=> {
console.log(bounds);
})}>
Get bounds
</Text>
<Text onPress={() => {
Mapbox.addOfflinePack({
name: 'test',
type: 'bbox',
bounds: [0, 0, 0, 0],
minZoomLevel: 0,
maxZoomLevel: 0,
metadata: { anyValue: 'you wish' },
styleURL: Mapbox.mapStyles.dark
}).then(() => {
console.log('Offline pack added');
}).catch(err => {
console.log(err);
});
}}>
Create offline pack
</Text>
<Text onPress={() => {
Mapbox.getOfflinePacks()
.then(packs => {
console.log(packs);
})
.catch(err => {
console.log(err);
});
}}>
Get offline packs
</Text>
<Text onPress={() => {
Mapbox.removeOfflinePack('test')
.then(info => {
if (info.deleted) {
console.log('Deleted', info.deleted);
} else {
console.log('No packs to delete');
}
})
.catch(err => {
console.log(err);
});
}}>
Remove pack with name 'test'
</Text>
<Text>User tracking mode is {this.state.userTrackingMode}</Text>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'stretch'
},
map: {
flex: 1
},
scrollView: {
flex: 1
}
});
AppRegistry.registerComponent('YourAppName', () => MapExample);