/ / Uzyskaj punkt pośredni między 4 LonLat Android - Android, lokalizacja, średnia

Uzyskaj punkt środkowy między 4 LonLat Android - Android, lokalizacja, średnia

Mam 4 punkty LonLat i chciałbym je znaleźćpunkt środkowy 4. Aby to zrobić, wziąłem pierwsze 2 znalezione środkowe miejsce, następnie drugie 2 znalazłem punkt, a następnie znajdowałem punkt środkowy pomiędzy 2 pierwszymi wynikami.

Aby znaleźć punkt środkowy między moimi punktami, użyłem kodu znalezionego w tym poście: https://stackoverflow.com/a/4656937/4489629

Unforuntaly to nie działa, z jakiegoś powodu otrzymuję wartość, która jest na równiku, podczas gdy lokalizacje, w których próbuję znaleźć punkt środkowy, znajdują się w Wielkiej Brytanii.

Oto mój kod:

private void treatForDispaly(double averageSpeed, double averageElevation, RecordObject[] records) {
String currentDateTimeString = String.valueOf(new java.util.Date());

LatLng firstTwo = midPoint(records[0].getLatitude(), records[0].getLongitude(), records[1].getLatitude(), records[1].getLongitude());
//        LatLng seconTwo = midPoint(records[2].getLatitude(), records[2].getLongitude(), records[3].getLatitude(), records[3].getLongitude());
//        LatLng averageLatLng = midPoint(firstTwo.latitude, firstTwo.longitude, seconTwo.latitude, seconTwo.longitude);

ContentValues newValues = new ContentValues();
newValues.put(ContentProviderContract.DAILY_RECORDS_TREATED_DATETIME,currentDateTimeString);
newValues.put(ContentProviderContract.DAILY_RECORDS_TREATED_ALTITUDE, averageElevation);
newValues.put(ContentProviderContract.DAILY_RECORDS_TREATED_SPEED, averageSpeed);
newValues.put(ContentProviderContract.DAILY_RECORDS_TREATED_LATITUDE, records[0].getLatitude()); // firstTwo.latitude
newValues.put(ContentProviderContract.DAILY_RECORDS_TREATED_LONGITUDE, records[0].getLongitude()); //firstTwo.longitude

getApplicationContext().getContentResolver().insert(ContentProviderContract.DAILY_RECORDS_TREATED_URI, newValues);

RecordTreatedObject tempRecord = new RecordTreatedObject();
tempRecord.setDateTime(new Date(currentDateTimeString));
tempRecord.setElevation(averageElevation);
tempRecord.setLatitude(firstTwo.latitude);
tempRecord.setLongitude(firstTwo.longitude);
tempRecord.setSpeed(averageSpeed);
dailyRecordsTreated.add(tempRecord);
}

public static LatLng midPoint(double lat1,double lon1,double lat2,double lon2){
double dLon = Math.toRadians(lon2 - lon1);

lat1 = Math.toRadians(lat1);
lat2 = Math.toRadians(lat2);
lon1 = Math.toRadians(lon1);

double Bx = Math.cos(lat2) * Math.cos(dLon);
double By = Math.cos(lat2) * Math.sin(dLon);
double lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By));
double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx);

//return out in degrees
LatLng midpoint = new LatLng(lat3, lon3);
return  midpoint;
}

Oto wartości, które wprowadzam:

D/DEBUG: first locatoin lat: 52.954037691647834 long: 52.954037691647834
D/DEBUG: second locatoin lat: 52.95385240191483 long: 52.95385240191483

i oto co otrzymuję w rezultacie:

D/DEBUG: midpoint lat 0.9242206929866051 midpoint long: 0.9242206929866051

Dzięki

Odpowiedzi:

1 dla odpowiedzi № 1

To tylko dzikie domysły, ale wydaje się, że dostajesz wyniki w radianach. Konwertuj wynik z powrotem na stopnie, a otrzymasz 52.9539448, co jest prawidłowe, jak sądzę.