Untitled
unknown
plain_text
11 days ago
11 kB
3
Indexable
var distance:Double = 0.0 var area:Double = 0.0 var originalArea: Double = 0.0 var originalDistanceUnit: String = "Meter" var originalAreaUnit: String = "Acre" var distanceText:MutableState<String> = mutableStateOf("0.0") var areaText:MutableState<String> = mutableStateOf("0.0") var cumulativeDistance by remember { mutableStateOf(0.0) } when (selectedGeometryType) { "Area" -> { val pointGraphic = Graphic(mapPoint, pointSymbol) graphicsOverlay.graphics.add(pointGraphic) relatedGraphics.add(pointGraphic) polygonPoints.add(mapPointNotNull) if (polygonPoints.size > 1) { val polyline = Polyline(polygonPoints) val lineGraphic = Graphic(polyline, lineSymbol) graphicsOverlay.graphics.add(lineGraphic) relatedGraphics.add(lineGraphic) // Remove previous text symbols graphicsOverlay.graphics.removeAll { it.symbol is TextSymbol } if (polygonPoints.size > 2) { val polygon = Polygon(polygonPoints) val polygonGraphic = Graphic(polygon, polygonSymbol) graphicsOverlay.graphics.add(polygonGraphic) relatedGraphics.add(polygonGraphic) val areaValue = GeometryEngine.areaGeodetic( polygon, getAreaUnit(selectedUnit), GeodeticCurveType.Geodesic ) // if (originalArea == 0.0){ // originalArea = areaValue // originalAreaUnit = selectedUnit // } area = areaValue // originalArea = areaValue // originalAreaUnit = selectedUnit areaText.value = formatMeasurementValue(areaValue, selectedUnit) // Update area text } else { val distanceValue = GeometryEngine.lengthGeodetic( polyline, getLinearUnit(selectedUnit), GeodeticCurveType.Geodesic ) distance = distanceValue distanceText.value = formatMeasurementValue(distanceValue, selectedUnit) // Update area text // distanceTextState.postValue(distanceValue.toString()) } } } "Distance" -> { val pointGraphic = Graphic(mapPointNotNull, pointSymbol) graphicsOverlay.graphics.add(pointGraphic) relatedGraphics.add(pointGraphic) linePoints.add(mapPointNotNull) if (linePoints.size > 1) { val polyline = Polyline(linePoints) val lineGraphic = Graphic(polyline, lineSymbol) graphicsOverlay.graphics.add(lineGraphic) relatedGraphics.add(lineGraphic) val distanceValue = GeometryEngine.lengthGeodetic( polyline, getLinearUnit(selectedUnit), GeodeticCurveType.Geodesic ) cumulativeDistance += distanceValue } // Remove previous text symbols graphicsOverlay.graphics.removeAll { it.symbol is TextSymbol } // Only add the text symbol at the last point if (linePoints.size > 1) { linePoints.last() distance = cumulativeDistance distanceText.value = formatMeasurementValue(cumulativeDistance, selectedUnit) // distanceTextState.value = distanceText.value TextSymbol().apply { text = distanceText.value color = com.arcgismaps.Color.fromRgba(0, 0, 0, 255) // Black color size = 15f } } } } graphicsStack.add(relatedGraphics) ext(text = "Select Unit", color = Color.Blue) units.forEach { unit -> Row(verticalAlignment = Alignment.CenterVertically) { Checkbox( checked = selectedUnit == unit, onCheckedChange = { if (it) { onUnitChange(unit) if (selectedGeometryType == "Distance") { updateDistanceUnits(unit) } else if (selectedGeometryType == "Area") { updateAreaUnits(unit) } } } ) Text(text = unit, modifier = Modifier.padding(4.dp)) } }private fun updateDistanceUnits(unit: String) { distance = when (unit) { "Meter" -> { if (originalDistanceUnit.equals("Kilometre")){ convertFromKiloMeterToMeter(distance) } else if (originalDistanceUnit.equals("Foot")){ convertFromFootToMeter(distance) } else { convertFromYardToMeter(distance) } } originalDistanceUnit = unit // distanceTextState.value = "%.2f" .format(distance) distanceText.value = "%.2f" .format(distance) }private fun updateAreaUnits( unit: String) { area = when (unit) { "Hectare" -> { if (originalAreaUnit.equals("Acre")){ convertAcreToHectare(area) } else if (originalAreaUnit.equals("Square Meter")){ convertSquareMeterToHectare(area) } else if (originalAreaUnit.equals("Square Kilometer")){ convertSquareKilometerToHectare(area) } else{ convertSquareFootToHectare(area) } }"Square Meter" -> { if (originalAreaUnit.equals("Acre")){ convertAcreToSquareMeter(area) } else if (originalAreaUnit.equals("Square Meter")){ convertHectareToSquareMeter(area) } else if (originalAreaUnit.equals("Square Kilometer")){ convertSquareKilometerToSquareMeter(area) } else{ convertSquareFootToSquareMeter(area) } } else -> { area } } originalAreaUnit = unit // updateAreaText("$area $unit") areaText.value = "%.2f" .format(area) }private fun convertHectareToAcre(area: Double):Double{ return area * 2.471055 // return convertHectareToSquareMeter(area) * 0.000247105 } private fun convertHectareToSquareMeter(area: Double):Double{ return area * 10000.008840 // return area * 10_000 } private fun convertHectareToSquareKilometer(area: Double):Double{ // return area * 0.01 return convertHectareToSquareMeter(area) / 1_000_000 }private fun convertSquareMeterToAcre(area: Double): Double { return area * 0.000247105 } private fun convertSquareMeterToHectare(area: Double): Double { return area * 0.0001 } private fun convertSquareMeterToSquareKilometer(area: Double): Double { return area * 1e-6 } calloutLocation?.let { location -> Callout(location = location, offset = Offset(0f, -50f)) { Text( text = if (selectedGeometryType == "Area") { "${areaText.value} ${originalAreaUnit}" } else { "${distanceText.value} ${originalDistanceUnit}" // distanceText.value } ) } }if (showActionBar.value) { CustomTopBar( selectedGeometryType = selectedGeometryType, onGeometryTypeChange = { selectedGeometryType = it }, selectedUnit = selectedUnit, // onUnitChange = { selectedUnit = it }, onUnitChange = { unit -> selectedUnit = unit // if (selectedGeometryType == "Distance") { // updateDistanceUnits(unit) // } else if (selectedGeometryType == "Area") { // updateAreaUnits(originalArea, unit) // } }, distanceUnits = distanceUnits, areaUnits = areaUnits, onShowActionBarChange = { showActionBar.value = it },
Editor is loading...
Leave a Comment