2013-05-03 10 views
15

私は誰かが私を正しい方向に向けることを望んでいます。イメージオーバーレイを正確に配置するためのGoogleマップツールですか?

XMLファイルのマーカーを読み込むGoogleマップと他のさまざまなマップ要素がうまくいきます。しかし、私は今マップにPNG画像をオーバーレイする必要があります。

PNGをサイトの上部に正しく配置するために何時間も努力しましたが、私が必要とする正確な2つの座標(南西と北東)は見つかりませんでした。これを行うためのツールはありますか?理想的には、画像をアップロードし、コーナーをフィットさせるようにドラッグすると、必要な2つの座標(緯度/経度)が出力されます。

私はこのツールを試してみました:http://overlay-tiler.googlecode.com/svn/trunk/upload.html - しかし3つの接点があります。

私はこのツールを使ってみました:http://www.birdtheme.org/useful/customoverlay.html - マップにアップロードした画像のサイズを変更することはできません。南西のマーカーをクリックすることでチャンスが得られます!

Google Earthを使ってPNGを完全に整列させることもできますが、緯度/経度の出力方法はわかりません。

アドバイスをいただければ幸いです。

+0

それは、アップロード/ドラッグ能力は開発目的のためまたはエンドユーザー機能としてであるかどうかは明らかではないのか? –

+0

@ Beetroot-Beetroot私は、一度画像を整列させてから必要なデータを保存し、毎回画像を表示するか、毎回スケールするなど、一度オフラインのユーザー機能と考えるとよいでしょう。 –

+0

"Google Earthを使ってPNG完璧だけど、緯度/経度を出力する方法は見当たりません」私はあなたがKMLとして出力し、それから数を抽出すると信じています。 Keyhole Markup Languageチュートリアルのグラウンドオーバーレイを参照してください:https://developers.google.com/kml/documentation/kml_tut?hl=it – ToolmakerSteve

答えて

7

私はずっと前にクライアントのこの厳密な問題を解決しなければなりませんでした。私の解決策は単純に2つのマーカーを作成することでした。オーバーレイのについては、LatLngのそれぞれに1つずつ、オーバーレイを更新してLatLndBoundsconsoleに記録して参照してください。また、マーカーをドラッグしたときに表示される網目(縦線と横線)を追加して、オーバーレイを視覚的に配置しやすくしました。

解決策のコードを共有することはできませんが、MapCanvasProjectionを経由してLatLngの座標をピクセルとの間で変換するには、OverlayViewで作業する必要があります。

私たちはエンドユーザー向けにこの機能を必要としませんでしたので、ソリューションのクエリ文字列にdebugパラメータを指定することによってトグルされる「オーサリングモード」を追加しました。

+0

また、ユーザーが実行するのに十分な権限を持っている場合にのみ、1回だけトリガーされるモードもありますアクション あなたの脳に小さなビットを拾う あなたは左下のマーカを作成します 次にユーザは右上のマーカを追加します ユーザは画像が3/10/20度のように見えるので、左下のマーカそのあとでイメージを再描画するだけです –

+1

NEマーカーまたはSWマーカーのいずれかを動かすと、イメージオーバーレイが斜めになります。前提条件として、オーバーレイに使用される画像がマップと同じ向​​きにある必要があることを忘れていました(つまり、画像の上端が北です)。 –

+0

あなたはappSpot上の[nmap](http://thannmap.appspot.com/)を構築したのと同じ人ですか? また、このソリューションでTrigを大量に行う必要がありましたか? このソリューションを構築するのがこの[google/overlays#CustomOverlays](https://developers.google.com/maps/documentation/javascript/overlays#CustomOverlays)ソリューションと似ているかどうかも疑問です。左/右上のボトルのハードコーディングされたコーディネートを、あなたの指定したマーカのコーディネートと置き換えるだけですか? –

2

このツールをお試しください。最初の地点の地図をダブルクリックしてください。サイズ変更可能な直方体のボックスが表示されます。エンドポイントまで広げ、必要なLatLngBoundsを取得します。

jsfiddle.net/yV6xv/16/embedded/result/ 

http://jsfiddle.net/yV6xv/16/embedded/result/

+0

そうですオーバーレイを視覚化するための本当にクールな小さなツールですが、回転を提供しません。オーバーレイが3/4度オフになることがあります。 –

15

アンドレ・ディオンの説明の実例。

http://jsfiddle.net/4cWCW/3/

var overlay; 

DebugOverlay.prototype = new google.maps.OverlayView(); 

function initialize() { 
    var mapOptions = { 
    zoom: 15, 
    center: new google.maps.LatLng(40.743388,-74.007592) 
    }; 

    var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); 
    var swBound = new google.maps.LatLng(40.73660837340877, -74.01852328); 
    var neBound = new google.maps.LatLng(40.75214181, -73.99661518216243); 
    var bounds = new google.maps.LatLngBounds(swBound, neBound); 

    console.log(map); 
    var srcImage = 'http://robincwillis.com/top/splash/04.jpg'; 

    overlay = new DebugOverlay(bounds, srcImage, map); 

    var markerA = new google.maps.Marker({ 
      position: swBound, 
      map: map, 
      draggable:true 
     }); 

    var markerB = new google.maps.Marker({ 
     position: neBound, 
     map: map, 
     draggable:true 
    }); 

    google.maps.event.addListener(markerA,'drag',function(){ 

     var newPointA = markerA.getPosition(); 
     var newPointB = markerB.getPosition(); 
     var newBounds = new google.maps.LatLngBounds(newPointA, newPointB); 
     overlay.updateBounds(newBounds); 
    }); 

    google.maps.event.addListener(markerB,'drag',function(){ 

     var newPointA = markerA.getPosition(); 
     var newPointB = markerB.getPosition(); 
     var newBounds = new google.maps.LatLngBounds(newPointA, newPointB); 
     overlay.updateBounds(newBounds); 
    }); 

    google.maps.event.addListener(markerA, 'dragend', function() { 

     var newPointA = markerA.getPosition(); 
     var newPointB = markerB.getPosition(); 
     console.log("point1"+ newPointA); 
     console.log("point2"+ newPointB); 
    }); 

    google.maps.event.addListener(markerB, 'dragend', function() { 
     var newPointA = markerA.getPosition(); 
     var newPointB = markerB.getPosition(); 
     console.log("point1"+ newPointA); 
     console.log("point2"+ newPointB); 
    }); 

} 

function DebugOverlay(bounds, image, map) { 

    this.bounds_ = bounds; 
    this.image_ = image; 
    this.map_ = map; 
    this.div_ = null; 
    this.setMap(map); 
} 

DebugOverlay.prototype.onAdd = function() { 

    var div = document.createElement('div'); 
    div.style.borderStyle = 'none'; 
    div.style.borderWidth = '0px'; 
    div.style.position = 'absolute'; 
    var img = document.createElement('img'); 
    img.src = this.image_; 
    img.style.width = '100%'; 
    img.style.height = '100%'; 
    img.style.opacity = '0.5'; 
    img.style.position = 'absolute'; 
    div.appendChild(img); 
    this.div_ = div; 
    var panes = this.getPanes(); 
    panes.overlayLayer.appendChild(div); 
}; 

DebugOverlay.prototype.draw = function() { 
    var overlayProjection = this.getProjection(); 
    var sw = overlayProjection.fromLatLngToDivPixel(this.bounds_.getSouthWest()); 
    var ne = overlayProjection.fromLatLngToDivPixel(this.bounds_.getNorthEast()); 
    var div = this.div_; 
    div.style.left = sw.x + 'px'; 
    div.style.top = ne.y + 'px'; 
    div.style.width = (ne.x - sw.x) + 'px'; 
    div.style.height = (sw.y - ne.y) + 'px'; 
}; 


DebugOverlay.prototype.updateBounds = function(bounds){ 
    this.bounds_ = bounds; 
    this.draw(); 
}; 

DebugOverlay.prototype.onRemove = function() { 
    this.div_.parentNode.removeChild(this.div_); 
    this.div_ = null; 
}; 

initialize(); 
+0

Finnalyは何を探していましたか?しかし、OSMとGoogleマップの座標の違いがあります...私はOSMと同じが必要です.. – Weedoze

関連する問題