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

nor*_*aul 4 java delphi math openstreetmap

我正在尝试将Open Street Maps纬度/经度转换为像素位置.我在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);
Run Code Online (Sandbox Code Playgroud)

德尔福代码:

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;
Run Code Online (Sandbox Code Playgroud)

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

JAVA:

tileX = 16.162124444444444

tileY = 26.273150713795616

德尔福:

tileX = 16.1621244444444

tileY = 29.5128609563099 <---错误的结果

我有一种感觉,问题可能是math.log调用.JAVA使用日志,但Delphi使用log10.我试过log2,但结果更糟.

fab*_*ian 10

您使用不同基数的对数:

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

德尔福:显然基础10

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

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

AFAIK Ln在delphi中有一个函数,它计算自然对数,至少它在这里列出.

  • @iamjoosy:[log10](http://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#log10-double-) (2认同)