Untitled

 avatar
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