You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

292 lines
12 KiB

import React, {useState, useEffect, useRef} from "react";
import { View, Text, StyleSheet, Alert, TouchableOpacity, Image } from "react-native";
import MapLibreGL from '@maplibre/maplibre-react-native';
import { MapView,ShapeSource,Camera,UserLocation,PointAnnotation,FillLayer,LineLayer,VectorSource } from "@maplibre/maplibre-react-native";
import {useNavigation,NavigationContainer,useIsFocused} from '@react-navigation/native';
import Geolocation from "@react-native-community/geolocation";
import turfcenter from '@turf/center';
const {points,polygon,lineString} = require('@turf/helpers');
MapLibreGL.setAccessToken(null);
type MapViewPolygonProps = {route: any,navigation: any}
function MapViewPolygonScreen({route,navigation}:MapViewPolygonProps):React.JSX.Element{
// console.log(route.params.data);
const {data} = route.params
console.log("a",data);
const apiKey = "JoJs2pcDv5o0yQlQLMfI";
const [basemap, setBasemap] = useState("streets-v2");
const styleURL = `https://api.maptiler.com/maps/${basemap}/style.json?key=${apiKey}`;
const [currentPosition, setCurrentPosition] = useState<[number,number] | []>([]);
const [currentPositionCamera, setCurrentPositionCamera] = useState<[number,number] | []>([0,0]);
const [coordinates,setCoordinates] = useState(data.geom);
const [startPoint, setStartPoint] = useState<any>([]);
const [manyPick, setManyPick] = useState(0);
const [drawingComplete,setDrawingComplete] = useState(false);
const morePoint = async () => {
setManyPick(manyPick+1);
setStartPoint([...startPoint,`point${manyPick+1}`])
setCoordinates([...coordinates,currentPosition])
// }
}
const checkArrayCoord = (()=> {
console.log("for Geojeson",coordinates)
console.log('first coordinate',coordinates[0]);
console.log("manyPick",manyPick);
console.log("lenght",coordinates.length);
})
const [reqCount, setReqCount] = useState(0);
const [long,setLong] = useState(0);
const [lat,setLat] = useState(0);
const [accuracy,setAccuracy] = useState(0);
const [timeStamp,setTimeStamp] = useState(0);
const isFocused = useIsFocused();
const [onDrag,setOndrag] = useState(false);
const [centerCoords,setCenterCoords] = useState<number[]>([]);
useEffect(() => {
if(isFocused){
// console.log(data);
coordinates.pop();
let centCord = turfcenter(points(coordinates));
console.log("center kedua",centCord);
setCenterCoords(centCord.geometry.coordinates);
}
}, [isFocused]);
const replacingCoordinate = (index:number,coor:any) => {
const nextCoordinate = coordinates.map((c:any,i:number) => {
if (i === index){
return c = coor
} else {
return c
}
});
setCoordinates(nextCoordinate);
}
const [zoom, setZoom] = useState(17);
const MAX_ZOOM_LEVEL = 20;
const MIN_ZOOM_LEVEL = 5;
const handleZoom = (isZoomIn = false) => {
let currentZoomLevel = zoom;
if (!isZoomIn && currentZoomLevel === MAX_ZOOM_LEVEL) {
currentZoomLevel -= 1;
}
else if (isZoomIn && currentZoomLevel === MIN_ZOOM_LEVEL) {
currentZoomLevel += 1;
}
if (
currentZoomLevel >= MAX_ZOOM_LEVEL ||
currentZoomLevel <= MIN_ZOOM_LEVEL
) {
return;
}
currentZoomLevel = isZoomIn ? currentZoomLevel + 1 : currentZoomLevel - 1;
setZoom(currentZoomLevel);
}
return(
<View style={{flex:1}}>
<MapView
style={{alignSelf:'stretch',flex:1}}
mapStyle={styleURL}
zoomEnabled={true}
onRegionDidChange={(region)=>
setZoom(region.properties.zoomLevel)
}
>
<Camera
key={"camera"}
centerCoordinate={centerCoords}
zoomLevel={zoom}
minZoomLevel={5}
maxZoomLevel={20}
/>
<ShapeSource
id="polygon"
shape={{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Polygon",
"coordinates": [
coordinates
],
}
}
]
}}
>
<LineLayer
id="linelayer1"
style={{lineColor:'red',lineWidth:1}}
/>
<FillLayer
id="some-fill-feature"
style={{
fillColor: ['interpolate', ['linear'], ['zoom'], 0, '#eeddbb', 2, '#0daa00', 3, '#bbbbee'],
fillOpacity:0.5
}}
/>
</ShapeSource>
<UserLocation
key={"userLoc"}
androidRenderMode='compass'
renderMode='native'
animated={true}
showsUserHeadingIndicator={true}
/>
{
coordinates.map((item:any,index:any)=>(
<PointAnnotation
children={<></>}
key={index}
id={String(index)}
coordinate={item}
draggable={true}
onDrag={(e)=> {
setOndrag(true)
replacingCoordinate(index,e.geometry.coordinates)
}}
/>
))
}
</MapView>
{/* Widget Map */}
<View style={styles.gotoLocate}>
<TouchableOpacity onPress={() => handleZoom(true)}>
<Image
source={require('../../assets/icon/plus.png')}
style={styles.buttonImageIconStyle}
/>
</TouchableOpacity>
<TouchableOpacity onPress={() => handleZoom()}>
<Image
source={require('../../assets/icon/minus.png')}
style={styles.buttonImageIconStyle}
/>
</TouchableOpacity>
<TouchableOpacity onPress={checkArrayCoord}>
<Image
source={require('../../assets/icon/MyLoc.png')}
style={styles.buttonImageIconStyle}
/>
</TouchableOpacity>
</View>
{
onDrag ?
<View style={{position:'absolute',width:'100%',bottom:20,justifyContent:'center',alignItems:'center',flexDirection:'row'}}>
<TouchableOpacity style={{margin:10}} onPress={()=> {
setCoordinates([])
setCoordinates(data.geom)
// setStartPoint([])
// setManyPick(0)
}}>
<View style={{backgroundColor:'#a8a59b',flexDirection:'row',width:60,height:60,borderRadius:100,justifyContent:'center'}}>
<Image
source={require('../../assets/icon/reset.png')}
style={{width:40,height:40,justifyContent:'center',alignSelf:'center'}}
/>
</View>
</TouchableOpacity>
<TouchableOpacity style={{margin:10}} onPress={()=> {
// checkArrayCoord()
//
navigation.navigate('Permit Editing',{ screen: 'Edit',data: {
id:data.id,
company_name:data.company_name,
permit_status:data.permit_status,
location:data.location
}, coors:coordinates })
// if(drawingComplete){
// Alert.alert("goto");
// }
}}>
<View style={{backgroundColor:'#43eb34',flexDirection:'row',width:60,height:60,borderRadius:100,justifyContent:'center'}}>
<Image
source={require('../../assets/icon/check.png')}
style={{width:40,height:40,justifyContent:'center',alignSelf:'center'}}
/>
</View>
</TouchableOpacity>
</View>
:
null
// <View style={{position:'absolute',width:'100%',bottom:20,justifyContent:'center',alignItems:'center',flexDirection:'row'}}>
// <TouchableOpacity disabled={true} style={{margin:10}} onPress={()=> {
// setCoordinates([])
// setStartPoint([])
// setManyPick(0)
// }}>
// <View style={{backgroundColor:'#a8a59b',flexDirection:'row',width:60,height:60,borderRadius:100,justifyContent:'center',opacity:0.5}}>
// <Image
// source={require('../../assets/icon/reset.png')}
// style={{width:40,height:40,justifyContent:'center',alignSelf:'center'}}
// />
// </View>
// </TouchableOpacity>
// <TouchableOpacity disabled={true} style={{margin:10}} onPress={()=> {
// // checkArrayCoord()
// navigation.navigate('Permit Collecting', { screen: 'Permit Collecting',coordinates: coordinates})
// // if(drawingComplete){
// // Alert.alert("goto");
// // }
// }}>
// <View style={{backgroundColor:'#43eb34',flexDirection:'row',width:60,height:60,borderRadius:100,justifyContent:'center',opacity:0.5}}>
// <Image
// source={require('../../assets/icon/check.png')}
// style={{width:40,height:40,justifyContent:'center',alignSelf:'center'}}
// />
// </View>
// </TouchableOpacity>
// </View>
}
</View>
)
}
const styles = StyleSheet.create({
buttonImageIconStyle: {
padding: 10,
margin: 5,
height: 25,
width: 25,
resizeMode: 'stretch',
},
gotoLocate: {
opacity: 0.6,
position: 'absolute',
top:120,
right: 5,
borderRadius:8,
paddingHorizontal:7,
width: 50,
// height: 50,
backgroundColor: "white",
flexDirection: 'column',
gap: 10
}
});
export default MapViewPolygonScreen;