From 8ba0c3937d74df77cbd4cf1bececd1242315f6ba Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Tue, 11 Mar 2025 11:02:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AE=9A=E4=BD=8D=E5=8A=A0?= =?UTF-8?q?=E6=9D=83=E5=B9=B3=E5=9D=87=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- positions/build.properties | 4 +- .../fragments/PositionsFragment.java | 90 ++++++++++++++----- .../positions/utils/LocationFusion.java | 31 +++++++ .../main/res/layout/fragment_positions.xml | 27 ++++-- 4 files changed, 122 insertions(+), 30 deletions(-) create mode 100644 positions/src/main/java/cc/winboll/studio/positions/utils/LocationFusion.java diff --git a/positions/build.properties b/positions/build.properties index 67c3d9e..13fb0af 100644 --- a/positions/build.properties +++ b/positions/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Mon Mar 10 13:10:04 GMT 2025 +#Tue Mar 11 03:01:39 GMT 2025 stageCount=0 libraryProject= baseVersion=1.0 publishVersion=1.0.0 -buildCount=252 +buildCount=254 baseBetaVersion=1.0.1 diff --git a/positions/src/main/java/cc/winboll/studio/positions/fragments/PositionsFragment.java b/positions/src/main/java/cc/winboll/studio/positions/fragments/PositionsFragment.java index 378f2f0..f4f816c 100644 --- a/positions/src/main/java/cc/winboll/studio/positions/fragments/PositionsFragment.java +++ b/positions/src/main/java/cc/winboll/studio/positions/fragments/PositionsFragment.java @@ -17,27 +17,36 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import cc.winboll.studio.positions.R; -import android.widget.Button; +import cc.winboll.studio.positions.utils.LocationFusion; public class PositionsFragment extends Fragment { - + public static final String TAG = "ContactsFragment"; - + private static final String ARG_PAGE = "ARG_PAGE"; private int mPage; private LocationManager locationManager; - private TextView locationTextView; - double latitudeLock; - double longitudeLock; - - + + private TextView tvWifiLocation; + private TextView tvGPSLocation; + private TextView tvFuseLocation; + + double latitudeWifiLock; + double longitudeWifiLock; + double latitudeGPSLock; + double longitudeGPSLock; + double latitudeFuseLock; + double longitudeFuseLock; + + // public static PositionsFragment newInstance(int page) { // Bundle args = new Bundle(); // args.putInt(ARG_PAGE, page); @@ -63,14 +72,16 @@ public class PositionsFragment extends Fragment { // Toolbar toolbar = viewMain.findViewById(R.id.toolbar); // getActivity().getMenuInflater().inflate(R.menu.toolbar_positions, toolbar.getMenu()); // - locationTextView = viewMain.findViewById(R.id.current_position_tv); + tvWifiLocation = viewMain.findViewById(R.id.wifi_position_tv); + tvGPSLocation = viewMain.findViewById(R.id.gps_position_tv); + tvFuseLocation = viewMain.findViewById(R.id.fuse_position_tv); locationManager = (LocationManager) getActivity().getSystemService(getActivity().LOCATION_SERVICE); - + Button btnLockingPosition = viewMain.findViewById(R.id.locking_position_btn); btnLockingPosition.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View p1) { - TXMSFragment.moveToLocation(latitudeLock, longitudeLock); + TXMSFragment.moveToLocation(latitudeFuseLock, longitudeFuseLock); } }); @@ -79,10 +90,10 @@ public class PositionsFragment extends Fragment { // 请求基站(网络)定位 locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, networkLocationListener); - + return viewMain; } - + @Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { inflater.inflate(R.menu.toolbar_positions, menu); @@ -101,8 +112,8 @@ public class PositionsFragment extends Fragment { locationManager.removeUpdates(networkLocationListener); } } - - + + @Override public boolean onOptionsItemSelected(MenuItem item) { @@ -116,12 +127,12 @@ public class PositionsFragment extends Fragment { // } return super.onOptionsItemSelected(item); } - + private LocationListener gpsLocationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { // 处理GPS定位结果 - updateLocation(location); + updateGPSLocation(location); } @Override @@ -138,7 +149,7 @@ public class PositionsFragment extends Fragment { @Override public void onLocationChanged(Location location) { // 处理基站(网络)定位结果 - updateLocation(location); + updateWifiLocation(location); } @Override @@ -151,16 +162,49 @@ public class PositionsFragment extends Fragment { public void onProviderDisabled(String provider) {} }; - private void updateLocation(Location location) { + void updateWifiLocation(Location location) { if (location != null) { double latitude = location.getLatitude(); double longitude = location.getLongitude(); - - latitudeLock = latitude; - longitudeLock = longitude; + + latitudeWifiLock = latitude; + longitudeWifiLock = longitude; // 简单的融合示例:这里只是显示最后获取到的位置,实际应用中需要更复杂的融合算法 - locationTextView.setText("Latitude: " + latitude + "\nLongitude: " + longitude); + tvWifiLocation.setText(String.format("Wifi [ Latitude: %f \nLongitude: %f ]", latitudeWifiLock, longitudeWifiLock)); + fuseLocationData(); } } + + void updateGPSLocation(Location location) { + if (location != null) { + double latitude = location.getLatitude(); + double longitude = location.getLongitude(); + + latitudeGPSLock = latitude; + longitudeGPSLock = longitude; + + // 简单的融合示例:这里只是显示最后获取到的位置,实际应用中需要更复杂的融合算法 + tvGPSLocation.setText(String.format("GPS [ Latitude: %f \nLongitude: %f ]", latitudeGPSLock, longitudeGPSLock)); + fuseLocationData(); + } + } + + void fuseLocationData() { + // 融合数据不充分退出 + if (latitudeWifiLock == 0 || + longitudeWifiLock == 0 || + latitudeGPSLock == 0 || + longitudeGPSLock == 0) { + return; + } + + double[] result = LocationFusion.fuseLocationData(latitudeGPSLock, longitudeGPSLock, + latitudeWifiLock, longitudeWifiLock, + 0.6, 0.4); + latitudeFuseLock = result[0]; + longitudeFuseLock = result[1]; + + tvFuseLocation.setText(String.format("Fuse [ Latitude: %f \nLongitude: %f ]", latitudeFuseLock, longitudeFuseLock)); + } } diff --git a/positions/src/main/java/cc/winboll/studio/positions/utils/LocationFusion.java b/positions/src/main/java/cc/winboll/studio/positions/utils/LocationFusion.java new file mode 100644 index 0000000..b81bc6c --- /dev/null +++ b/positions/src/main/java/cc/winboll/studio/positions/utils/LocationFusion.java @@ -0,0 +1,31 @@ +package cc.winboll.studio.positions.utils; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/11 09:36:52 + * @Describe 定位数据融合类 + */ +public class LocationFusion { + + public static final String TAG = "LocationFusion"; + + // 融合定位数据的方法 + public static double[] fuseLocationData(double latitudeGPSLock, double longitudeGPSLock, + double latitudeWifiLock, double longitudeWifiLock, double gpsWeight, double wifiWeight) { + if (gpsWeight + wifiWeight != 1) { + throw new IllegalArgumentException("GPS权重和Wi-Fi权重之和必须为1"); + } + double lat = latitudeGPSLock * gpsWeight + latitudeWifiLock * wifiWeight; + double lon = longitudeGPSLock * gpsWeight + longitudeWifiLock * wifiWeight; + return new double[]{lat, lon}; + } + +// public static void main(String[] args) { +// double[] gpsLocation = {30.5, 120.5}; +// double[] wifiLocation = {30.6, 120.6}; +// double gpsWeight = 0.6; +// double wifiWeight = 0.4; +// double[] fusedLocation = fuseLocationData(gpsLocation, wifiLocation, gpsWeight, wifiWeight); +// System.out.println("融合后的纬度: " + fusedLocation[0] + ", 经度: " + fusedLocation[1]); +// } +} diff --git a/positions/src/main/res/layout/fragment_positions.xml b/positions/src/main/res/layout/fragment_positions.xml index f559f5c..9fb2121 100644 --- a/positions/src/main/res/layout/fragment_positions.xml +++ b/positions/src/main/res/layout/fragment_positions.xml @@ -10,14 +10,31 @@ android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="center_vertical"> + android:gravity="center_vertical" + android:layout_weight="1.0"> - + android:layout_weight="1.0"> + + + + + + + +