0

マップ座標 (EPSG:900913) のバウンディング ボックスと画像の幅/高さを指定して縮尺を計算する必要があります。

これは非常に基本的な WMS サーバーを実装しているためですが、特定の瞬間に画像のスケールを知る必要があります。

簡単なリクエストは次のとおりです。

  wms.exe?LAYERS=all&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fjpeg&SRS=EPSG%3A900913&BBOX=-7810029.800979,-2298920.0623849,-7809724.0528659,-2298614.3142718&WIDTH=256&HEIGHT=256

そのリクエストは、次のパラメータで構成された Web ページの openlayer コンポーネントから発信されます。

var optionsGmap = {
projection: new OpenLayers.Projection("EPSG:900913"),
units: "m",
sphericalMercator: true,
numZoomLevels: 16,
maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34),
scales : [110936068.185464,55468034.0927321,27734017.0463661,13867008.523183,6933504.26159152,
    3466752.13079576,1733376.06539788,866688.03269894,433344.01634947,216672.008174735,108336.004087367,54168.0020436837,27084.0010218419,
    13542.0005109209,6771.00025546046,3385.50012773023],
maxResolution: "auto" };

これを計算する式はありますか?バックエンドでpostgres + posgisにアクセスできますが、Cコードで自分で計算することを好みます。

4

1 に答える 1

2

直交する地理的領域の各辺の長さは次のとおりです。

lengthEastWestNorth = (east - west) * ((equatorial_circumference * cos(north)) / (2*pi) ) ;
lengthEastWestSouth = (east - west) * ((equatorial_circumference* cos(south)) / (2*pi)) ;
lengthNorthSouth = (north - south) * (polar_circumference/(2*pi)) ;

東、西、北、南は、ラジアン単位の経度/緯度の角度であることに注意してください。これは、C の三角関数が<math.h>必要とするためです。度からラジアンへの変換は単純に r = pi/180.0 です。結果の単位は、円周に使用する単位です。南北の長さは等しく、東西の寸法は緯度によって異なり、南北の長さは異なるため、2 つまたは 4 つではなく 3 つの値になります。

スケールを計算するには、おそらくこれらの値の 1 つだけが必要です。lengthNorthSouth三角関数が必要ないため、ラジアンへの変換が必要ないため、この値をお勧めします (この場合は 2*pi ではなく 360 で割ります)。

1辺の長さを画像の対応する辺の長さで割ると、スケールが得られます。

地理的な計算は必然的に近似値であり、たとえば地図投影では異なる円周値が使用される場合があるため、目的の縮尺を決定するには、最も近い優先縮尺を決定する必要があります。優先スケールのそれぞれから計算されたスケールを順番に減算して、最小の絶対差 (符号を削除) を持つスケールを決定します。

于 2012-02-13T07:49:31.513 に答える