2017-11-29 11 views
2

私の政府提供のマッピングデータは、投影EPSG4326でデータベースに保存されています。すべてのデータは経度および緯度として保存されるため、リーフレット自体がデフォルトの投影EPSG3857になっていても、このデータをリーフレットに正常に読み込んで正しく表示できます。 EPSG4326に投影されたマップタイルを提供するマッププロバイダは存在せず、私自身は生成したくないため、EPSG4326にチラシを切り替える必要はありません。リーフレットで、EPSG3857のリーフレットビューポート境界ボックスを変換する方法を教えてください。EPSG4326に保存されているデータを取得できます。

多くのデータがあるため、表示可能なビューポート内のデータのみを取得したいだけです。リーフレットは私にgetBounds()メソッドを提供して、可視のビューポートの経度と緯度を取得します。残念ながら、私が提供する座標はEPSG3857座標です。つまり、取り出されたデータが境界線の周囲で歪んでいることを意味します.4326と3857の違いは、曲線が間違っていることを意味します。

下の画像では、境界ボックスの経度と緯度をデータベースに渡し、データと交差させました。私はリーフレットが私に提供したEPSG3857の座標を使用して問題を示す緑色の線を引いた。座標がEPSG4326の場合、緑色の線の上とビューポート内のデータを取得したより広い座標が与えられます。

私は現在、境界ボックスの経度と緯度に2度の角度を付け加えていますが、より良い解決策が存在することを期待していました。これを達成するより良い方法はありますか? EPSG4326にすべてのものを切り替えることなく、どういうわけかバウンディングボックスをEPSG4326に変換して、マップタイルを失うことはできますか?

Distortion Image

アップデート:ここで

は、私は、バックエンドにSQL Serverで使用していたコードです:フロントエンドには

CREATE PROC [core].[GetGeoData] 
    @Zoom int, 
    @BoundingBox_N decimal(18,14), 
    @BoundingBox_S decimal(18,14), 
    @BoundingBox_E decimal(18,14), 
    @BoundingBox_W decimal(18,14) 
AS 
BEGIN 

    DECLARE @BoundingBox varchar(200) 
    DECLARE @BoundingBoxGeo geography 
    SET @BoundingBox = 'POLYGON((' + CAST(@BoundingBox_E as varchar(20)) + ' ' + CAST(@BoundingBox_S as varchar(20)) + ',' + CAST(@BoundingBox_E as varchar(20)) + ' ' + CAST(@BoundingBox_N as varchar(20)) + ',' + CAST(@BoundingBox_W as varchar(20)) + ' ' + CAST(@BoundingBox_N as varchar(20)) + ',' + CAST(@BoundingBox_W as varchar(20)) + ' ' + CAST(@BoundingBox_S as varchar(20)) + ',' + CAST(@BoundingBox_E as varchar(20)) + ' ' + CAST(@BoundingBox_S as varchar(20)) + '))' 
    SET @BoundingBoxGeo = geography::STGeomFromText(@BoundingBox, 4326) 

    SELECT PostalCode, geo.STIntersection(@BoundingBoxGeo) AS geo 
    FROM [geo].[AustralianGeoData] 
    WHERE [email protected] AND geo.STIntersects(@BoundingBoxGeo)=1 

END 

、私のコード内で私が呼び出しています:

const mapBounds = map.getBounds(); 
const zoom = this.map.getZoom(); 
const boundingBoxN = mapBounds.getNorth(); 
const boundingBoxS = mapBounds.getSouth(); 
const boundingBoxE = mapBounds.getEast(); 
const boundingBoxW = mapBounds.getWest(); 
this.mapService.getGeoData(zoom, boundingBoxN, boundingBoxS, boundingBoxE, boundingBoxW) 
      .subscribe(
      response => { 
    const geoJson = JSON.parse(row.geoJson); 
    this.layers.push(geoJson); 
}); 

whi chはバウンディングボックスを直接バックエンドに渡します。 mapはL.mapインスタンスです。

+0

あなたはあなたの問題を再現するコードを提供する必要があります。 – ghybs

+2

OPが間違っています - 表示投影がEPSG:3857であっても、 'map.getBounds()'のCRSはEPSG:4326です。さらに、平行線は4326と3857の間で歪まない。私は、バックエンドが4326を取り込んで、平行線を歪ませるUTMバンドのようなものに再投影した疑いがある。 bboxのコーナー。 – IvanSanchez

+0

上記の追加情報。私は、中間点の線とビューポートの頂点との間の距離を計算すると幸いです。それから、私はその距離を緯度に加え、それで終わることができます! – tone

答えて

0

私は、交差を実行するときに地理タイプの代わりにジオメトリタイプを使用するようにクエリを変更しました。これは正確なデータを正確に取得します。マップを移動すると、アンロードされた領域が取得され、新しいレイヤーがレンダリングされる間にわずかな遅延が発生するため、ビューポートにのみデータがロードされます。

私のストアドプロシージャは、次のようになります。

ALTER PROC [core].[GetGeoData] 
    @Zoom int, 
    @BoundingBox_N decimal(18,14), 
    @BoundingBox_S decimal(18,14), 
    @BoundingBox_E decimal(18,14), 
    @BoundingBox_W decimal(18,14) 
AS 
BEGIN 

    DECLARE @BoundingBox varchar(200) 
    DECLARE @BoundingBoxGeo geometry 
    SET @BoundingBox = 'POLYGON((' + CAST(@BoundingBox_E as varchar(20)) + ' ' + CAST(@BoundingBox_S as varchar(20)) + ',' + CAST(@BoundingBox_E as varchar(20)) + ' ' + CAST(@BoundingBox_N as varchar(20)) + ',' + CAST(@BoundingBox_W as varchar(20)) + ' ' + CAST(@BoundingBox_N as varchar(20)) + ',' + CAST(@BoundingBox_W as varchar(20)) + ' ' + CAST(@BoundingBox_S as varchar(20)) + ',' + CAST(@BoundingBox_E as varchar(20)) + ' ' + CAST(@BoundingBox_S as varchar(20)) + '))' 
    SET @BoundingBoxGeo = geometry::STGeomFromText(@BoundingBox, 4326) 
    SELECT PostalCode, geography::STGeomFromText(geometry::STGeomFromText(geo.AsTextZM(),4326).STIntersection(@BoundingBoxGeo).AsTextZM(),4326) AS geo 
    FROM [geo].[AustralianGeoData] 
    WHERE [email protected] AND geometry::STGeomFromText(geo.AsTextZM(),4326).STIntersects(@BoundingBoxGeo)=1 
    AND geo.STGeometryType() IN ('Polygon','MultiPolygon','GeometryCollection') 
END 
関連する問題