java - JAVA 和 Delphi 中的数学函数给出不同的结果

标签 java delphi math openstreetmap

我正在尝试将 Open Street Maps 纬度/经度转换为像素位置。我找到了这个 example在 java 。当我将代码转换为 Delphi 时,X 结果是正确的,但 Y 结果略有偏差。

Java 代码:

double lon = -89.08805;
double lat = 30.6393;
double zoom = 6; // 6.5156731549786215 would be possible too

double lon_rad = Math.toRadians(lon);
double lat_rad = Math.toRadians(lat);
double n = Math.pow(2.0, zoom);

double tileX = ((lon + 180) / 360) * n;
double tileY = (1 - (Math.log(Math.tan(lat_rad) + 1.0/Math.cos(lat_rad)) / Math.PI)) * n / 2.0;

System.out.println("tileX = "+tileX+" tileY = "+tileY);

德尔福代码:

function LatLngToTilePixels(Lat, Lng: Double; ZoomLevel: Integer): TPointF;
var
  lon_rad, lat_rad, n: Double;
  TileX, TileY: Double;
begin
  lon_rad := DegToRad(Lng);
  lat_rad := DegToRad(Lat);

  n := Power(2.0, ZoomLevel);

  Result.X := ((Lng + 180) / 360) * n;
  Result.Y := (1 - (Math.Log10(Math.tan(lat_rad) + 1.0/cos(lat_rad)) / PI)) * n / 2.0;
end;

使用示例中给出的输入(lat=30.6393,lng=-89.08805,zoom=6)的结果是:

Java:

tileX = 16.162124444444444

瓷砖 Y = 26.273150713795616

德尔福:

tileX=16.1621244444444

tileY = 29.5128609563099 <--- 错误结果

我感觉问题可能出在 math.log 调用上。 JAVA用的是log,而Delphi用的是log10。我试过log2,但结果更糟。

最佳答案

您使用不同底数的对数:

Java:e为底,即自然对数,见Math.log(double)

Delphi:显然是以 10 为底

您可以使用以下公式计算不支持的底数的对数:

log_a(b) = log_x(b)/log_x(a)

据我所知,delphi 中有一个Ln 函数,可以计算自然对数,至少列出了here。 .

关于java - JAVA 和 Delphi 中的数学函数给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25365733/

相关文章:

java - 在参数化查询中使用加号连接字符串

delphi - 从 ListView 切换到 VirtualStringTree

delphi - 解析文件和文件夹的备忘录

delphi - 如何在 Free Pascal 中使用匿名方法?

java - 流排序问题

java - 如何在 spring boot standalone app 中激活 JMX 监控

java - com.fasterxml.jackson.databind.JsonMappingException : Can not deserialize out of START_ARRAY token

javascript - 如何计算 z 轴上的位置

JavaScript - 生成一个介于 1 和 5 之间的随机数,但绝不会连续两次生成相同的数字

arrays - 我怎样才能最好地压缩部分排序的 50000 字节