【问题标题】:Using a GeoPoint location and meters X/Y, how can a Longitude/Latitude be calculated?使用 GeoPoint 位置和米 X/Y,如何计算经度/纬度?
【发布时间】:2013-12-18 17:26:31
【问题描述】:

我有一个我一直在玩的小项目(Android、GPS、地图 API),我需要弄清楚如何在只知道米的情况下从给定的经度/纬度/GeoPoint 中找到经度/纬度/GeoPoint /km 经度和纬度。例如我想知道一个点在哪里,我知道沿经度 +1000 米,沿纬度 +1000 米。

这与您将看到的通常的地理点/距离问题略有不同,并且与地理围栏半径不完全相关,因为距离是 X、Y 米/公里,而且我没有方位。 (我可以算出方位,但我没有合适的直接距离)

基本上,如果我可以反转 GeoPoint.distanceTo() 它将为我完成这项工作。

更新

只是多一点背景。我基本上是在应用我的节点三角测量想法,但是该算法要求我的输入采用与经度和纬度不同的地图标准化形式。我创建了一个地图/网格,其中 0,0(底部/左侧)是我正在使用的节点的左侧/西部和底部/最南端的经度/纬度值。地图上的所有其他节点 X/Y 都是通过使用 GeoPoint.distanceTo() 从 0,0 节点的经度/纬度找到它们的米来确定的。 (请注意,我通过对每个节点执行 distanceTo 两次来找到它们的 X/Y,因此我有从 0,0 开始的 X 和 Y 米,而不是到节点的直线)以米为单位的距离被输入算法和新的 X/生成 Y 地图点。

所以我需要弄清楚如何将距离从经度/纬度转换为另一个以前未知的经度/纬度。

double startPointLongitude = 23.459821;
double startPointLatitude = 76.998200;
double distanceLongitude = 100; // 100 meters along the longitude
double distanceLatitude = 75; // 75 meters along the latitude

【问题讨论】:

  • 请注意顺序很重要,如果您先向北然后向东,然后向东然后向北,您将到达不同的地点。
  • 问题是我什至不确定使用北和东轴承是否能正常工作。我相信指南针与经度和纬度所在的线并不完全对齐。这意味着纬度将与地球的曲线一起运行,而北方将是一条直线到一个点。我可能是错的。但即使我进行了一次测试,我也不知道我的结果是否正确。
  • 对于数百米,您可以将笛卡尔坐标转换为polar ones。误差可以忽略不计。对于更远的距离,你会遇到麻烦,因为地球不是一个完美的球体,而是一个椭球体。 GMaps 使用WGS84 作为参考。
  • @Mister Smith:错了,你不能那样做,因为 lat 和 lon 有不同的比例(sclae factor = cos(latitude)

标签: android google-maps gps


【解决方案1】:

两个纬度之间的距离永远不会改变,它总是aprox。 111 公里 (您应该使用 WGS84 地球半径计算出的确切值:

 EarthCircumFence = 2* WGS84_RADIUS * Math.Pi;

metersPerDegree = (地球圆周/360)

有了这些信息,您可以轻松计算纬度偏移量, 只需反转因素并拥有:

degreesPerMeterForLat = EarthCircumfenceMeter / 360.0

与经度有点不同,两个经度之间的距离缩小 离赤道越远。

shrinkFactor = cos(toRadians(locationLatitude));

立即补偿:

degreesPerMeterForLon = degreesPerMeterForLat / shrinkFactor;

终于

newLatPos = latOld + numMeters * degreesPerMeterForLat;
newLonPos = lonOld + numMeters * degreesPerMeterForLon;

这适用于距离偏移

【讨论】:

  • 感谢您的帮助。它基本上是我正在寻找的,但我在今天早些时候的回答中设法得出了类似的结论。由于某种原因,我的答案没有发布,直到现在我才注意到。顺便说一句,维基百科和其他参考资料 (UCSB ncgia.ucsb.edu/giscc/units/u014/u014.html) 表明赤道的 1 度纬度是 111.329 公里。
  • 该值取决于使用的地球圆周,您应该使用WGS84地球半径,然后计算圆周。 111.111 是 40.000 公里 / 360;不准确(但实际上不会影响距离计算)
【解决方案2】:

唉,我在 6 小时前发布了这个,但它似乎没有通过。

好的,尽管大多数地理公式和事实偶尔会在我脑海中浮现,但还是算出来了。使用地理就像使用公历一样,如果您一直为它编程是有意义的,但否则很容易被错误的假设弄糊涂。

我的应用程序中的以下内容将采用起始 GeoPoint 的经度/纬度

   /**
    * the length of one degree of latitude (and one degree of longitude at equator) in meters.
    */
   private static final double DEGREE_DISTANCE_AT_EQUATOR = 111329;


   /**
    * calculates the x,y in meters from a given starting point's long0, lat0 to a target destination point's long1, lat1.
    * @param long0 start point longitude
    * @param lat0 start point latitude
    * @param long1 end point longitude
    * @param lat1 end point latitude
    * @return
    */
   public static Pair<Double, Double> xyFromLongLat(int long0, int lat0, int long1, int lat1) {
    double x = (long1 / 1E6 - long0 / 1E6) * longitudeDistanceAtLatitude(lat0 / 1E6);
    double y = (lat1 / 1E6 - lat0 / 1E6) * DEGREE_DISTANCE_AT_EQUATOR;
    return new Pair<Double, Double>(x, y);
   }

   /**
    * calculates longitude and latitude from a given starting point, with only the X/Y meters 
    * @param long0
    * @param lat0
    * @param x
    * @param y
    * @return
    */
   public static Pair<Double, Double> longLatFromXY(int long0, int lat0, double x, double y) {
        double lat1 = (y / DEGREE_DISTANCE_AT_EQUATOR) + (lat0 / 1E6);
        double long1 = x / longitudeDistanceAtLatitude(lat0) + (long0 / 1E6);
        return new Pair<Double, Double>(lat1, long1);
   }

【讨论】:

  • 这篇文章缺少最重要的一点:longitudeDistanceAtLatitude。您的帖子显示您的代码,但不是答案,因为它更令人困惑;在 javadoc 中,您使用 microDegrees 表示经度而不注释它。此外,它没有任何解释。
【解决方案3】:

基本上我从 AlexWien 那里得到了答案,纠正了两件事并将其变成了一个 java 方法

private static final double WGS84_RADIUS = 6370997.0;
private static double EarthCircumFence = 2* WGS84_RADIUS * Math.PI;

private static Position getPosition(Position sourcePosition, double mEastWest, double mNorthSouth){
    double degreesPerMeterForLat = EarthCircumFence/360.0;
    double shrinkFactor = Math.cos((sourcePosition.getLat()*Math.PI/180));
    double degreesPerMeterForLon = degreesPerMeterForLat * shrinkFactor;
    double newLat = sourcePosition.getLat() + mNorthSouth * (1/degreesPerMeterForLat);
    double newLng = sourcePosition.getLng() + mEastWest * (1/degreesPerMeterForLon);
    return new Position(newLat, newLng);
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 2011-07-06
    • 2011-10-14
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多