12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- // Fill out your copyright notice in the Description page of Project Settings.
- #include "BFL_Coordinate.h"
- #include "Math/UnrealMathUtility.h"
- FVector2D UBFL_Coordinate::GCJ02ToWGS84(double Longitude, double Latitude)
- {
- const FVector2D Coord(Longitude, Latitude);
- if (IsOutOfChina(Coord))
- {
- return Coord; // 中国境外直接返回原坐标
- }
- // 计算偏移量
- const double dLng = TransformLongitude(Longitude - 105.0, Latitude - 35.0);
- const double dLat = TransformLatitude(Longitude - 105.0, Latitude - 35.0);
- const double radLat = FMath::DegreesToRadians(Latitude);
- const double magic = FMath::Sin(radLat);
- const double sqrtMagic = FMath::Sqrt(1 - ee * magic * magic);
- // 计算精确偏移
- const double finalDLat = (dLat * 180.0) / ((a * (1 - ee)) / (sqrtMagic * (1 - ee * magic * magic)) * PI);
- const double finalDLng = (dLng * 180.0) / (a / sqrtMagic * FMath::Cos(radLat) * PI);
- // 计算墨卡托投影坐标
- const double mgLat = Latitude + finalDLat;
- const double mgLng = Longitude + finalDLng;
- // 返回WGS84坐标
- return FVector2D(
- Longitude * 2 - mgLng,
- Latitude * 2 - mgLat
- );
- }
- bool UBFL_Coordinate::IsOutOfChina(const FVector2D& Coord)
- {
- return !(Coord.X >= 72.004 && Coord.X <= 137.8347 &&
- Coord.Y >= 0.8293 && Coord.Y <= 55.8271);
- }
- double UBFL_Coordinate::TransformLatitude(double lng, double lat)
- {
- double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat +
- 0.1 * lng * lat + 0.2 * FMath::Sqrt(FMath::Abs(lng));
- ret += (20.0 * FMath::Sin(6.0 * lng * PI) +
- 20.0 * FMath::Sin(2.0 * lng * PI)) * 2.0 / 3.0;
- ret += (20.0 * FMath::Sin(lat * PI) +
- 40.0 * FMath::Sin(lat / 3.0 * PI)) * 2.0 / 3.0;
- ret += (160.0 * FMath::Sin(lat / 12.0 * PI) +
- 320.0 * FMath::Sin(lat * PI / 30.0)) * 2.0 / 3.0;
- return ret;
- }
- double UBFL_Coordinate::TransformLongitude(double lng, double lat)
- {
- double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng +
- 0.1 * lng * lat + 0.1 * FMath::Sqrt(FMath::Abs(lng));
- ret += (20.0 * FMath::Sin(6.0 * lng * PI) +
- 20.0 * FMath::Sin(lng * PI)) * 2.0 / 3.0;
- ret += (20.0 * FMath::Sin(lng * PI) +
- 40.0 * FMath::Sin(lng / 3.0 * PI)) * 2.0 / 3.0;
- ret += (150.0 * FMath::Sin(lng / 12.0 * PI) +
- 300.0 * FMath::Sin(lng / 30.0 * PI)) * 2.0 / 3.0;
- return ret;
- }
- FColor UBFL_Coordinate::HexToColor(FString HexString)
- {
- return FColor::FromHex(HexString);
- }
- FString UBFL_Coordinate::ColorToHex(FColor Color)
- {
- return Color.ToHex();
- }
|