0

(これは、私が作成した他の投稿、PhoneGapのGoogle Maps API v3からの分割です:移動後にマーカーが正しく描画されません)。PhoneGapを使用してAndroidでGoogleMapsAPI3アプリケーションに取り組んでいます。ユーザーの場所を追跡し、その場所をマーカーとその周りの円でマークする必要があります。私はこれをAndroid2.3で開発していましたが、正常に機能していました。その後、Android 4.xを搭載した携帯電話にアップグレードしましたが、それでも問題なく動作していると思いました。

それから先週、マーカーとサークルを動かしたときに、Googleマップが奇妙なことをしていることに気づき始めました。単に移動するのではなく、重複したマーカーと円を作成するように見えます。他の投稿では、マーカーの問題については回答がありましたが、サークルについては回答がありませんでした。ズームを変更すると、重複した円が消えてしまうことがあります。しかしまた、それは時々上から奇妙な接線を描きます。下の画像を参照してください。

私は自分の携帯電話でバージョン4.1.1へのAndroidアップデートを受け取った直後にこれに気づき始めました。それが関連しているかどうかはわかりませんが、問題に関する情報が見つかりません。

マップとphonegapコードを非常に最小限のサンプルに減らしましたが、それでも実行しています。私はそれがphonegapとは関係がないと確信しています。確かに、とにかく電話ギャップを2.2にアップグレードしましたが、予想どおり、それは役に立ちませんでした。サークルを動かすときに何か間違ったことをしているのか誰かわかりますか?

私が試した解決策の1つは、円を移動する前に非表示にし、移動後にもう一度表示することでした。これで重複と接線の問題は解決したように見えましたが、マップがフラッシュされ、3秒ごとに移動すると非常に煩わしくなりました。したがって、それは許容できる解決策のようには思えません。テストコードは以下のとおりです。テストコードでGoogleMapsAPIキーを削除したことに注意してください。

また、正しく再描画する1つの方法は、円の一部が表示されないようにマップをドラッグすることであることも学びました。次に、円が表示されるようにドラッグして戻すと、1つの正しい円として再描画されます。

ありがとう、エリック

<!DOCTYPE HTML>
<html>
<head>
<title>Marker Test</title>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
    html {height: 100%}
    body {height: 100%; margin:0; padding:0}
    #map_canvas {height: 100%}
</style>
<script type="text/javascript" charset="utf-8" src="js/phonegap.js"></script>
<script type="text/javascript" charset="utf-8" src="http://maps.googleapis.com/maps/api/js?key=YOUR_KEY_HERE&sensor=true"></script>
<script type="text/javascript" charset="utf-8">
    // Wait for PhoneGap to load
    //
    document.addEventListener("deviceready", onDeviceReady, false);

    // globals
    var watchID = null;
    var map = null;
    var myLocationMarker = null;
    var searchCircle = null;

    // PhoneGap is ready
    //
    function onDeviceReady() {
        startGPS();
    }

    function onUnLoad() {
        console.log("clearing watch " + watchID);
        navigator.geolocation.clearWatch(watchID);
    }

function startGPS() {
    console.log("In startGPS");

    var refreshMilliseconds = 5000;
    var options = { frequency: refreshMilliseconds, enableHighAccuracy: true};

    watchID = navigator.geolocation.watchPosition(onGPSSuccess, onGPSError, options);

    // create Google map
    var mapOptions = {
        zoom: 14,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

    myLocationMarker = new google.maps.Marker({
        title: 'This is me!',
        zIndex: 90,
        optimized: false,
        map:map
    });     

    searchCircle = new google.maps.Circle({
        fillColor: '#c0e4dd',
        strokeColor: '#f15f22',
        fillOpacity: 0.5,
        radius: 1500,
        map:map
    });     
}

var onGPSSuccess = function(p) {
    // get the new coordinates
    var lat = p.coords.latitude;
    var lng = p.coords.longitude;

    console.log("watch ID " + watchID);

    // now that we have the coordinates, we can move the marker and circle on the Google Map
    MoveMarkerAndCircle(lat, lng);
};

var MoveMarkerAndCircle = function(lat, lng) {
    var myLocation = new google.maps.LatLng(lat, lng);
    myLocationMarker.setPosition(myLocation);

//  searchCircle.setVisible(false);
    searchCircle.setCenter(myLocation);
//  searchCircle.setVisible(true);

    map.setCenter(myLocation);  
}

var onGPSError = function() {
    console.log("GPS Error");
};

var GenerateFakeMovement = function() {
    var currentPosition = myLocationMarker.getPosition();
    var newLat = currentPosition.lat() + 0.01;
    var newLng = currentPosition.lng() + 0.01;
    MoveMarkerAndCircle(newLat, newLng);
}
</script>
</head>
<body  style="height:100%;text-align:center" onunload="onUnLoad()">
    <div id="map_canvas" style="width: 100%;height:80%"></div>
    <a href='#' onclick="GenerateFakeMovement();" style="padding-top:5px">MAKE FAKE MOVEMENT</a>
</body>
</html>

2サークル 接線 壊れた円

4

3 に答える 3

1
<!DOCTYPE HTML>
<html>
<head>
<title>Marker Test</title>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
    html {height: 100%}
    body {height: 100%; margin:0; padding:0}
    #map_canvas {height: 100%}
</style>
<script type="text/javascript" charset="utf-8" src="http://maps.googleapis.com/maps/api/js?v=3&sensor=true"></script>
<script type="text/javascript" charset="utf-8">
    var watchID = null;
    var map = null;
    var myLocationMarker = null;
    var searchCircle = null;
    function onDeviceReady() {
        startGPS();
    }

    function onUnLoad() {
        console.log("clearing watch " + watchID);
        navigator.geolocation.clearWatch(watchID);
    }

function startGPS() {
    console.log("In startGPS");

    var refreshMilliseconds = 5000;
    var options = { frequency: refreshMilliseconds, enableHighAccuracy: true};

    if(watchID ==null)
    watchID = navigator.geolocation.watchPosition(onGPSSuccess, onGPSError, options);

    // create Google map
    var mapOptions = {
        zoom: 14,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

    myLocationMarker = new google.maps.Marker({
        title: 'This is me!',
        zIndex: 90,
        optimized: false,
        map:map
    });     

    searchCircle = new google.maps.Circle({
        fillColor: '#c0e4dd',
        strokeColor: '#f15f22',
        fillOpacity: 0.5,
        radius: 1500,
        map:map
    });     
}

var onGPSSuccess = function(p) {
    // get the new coordinates
    var lat = p.coords.latitude;
    var lng = p.coords.longitude;

    console.log("watch ID " + watchID);

    // now that we have the coordinates, we can move the marker and circle on the Google Map
    MoveMarkerAndCircle(lat, lng);
};

var MoveMarkerAndCircle = function(lat, lng) {
 var myLocation = new google.maps.LatLng(lat, lng);
    myLocationMarker.setPosition(myLocation);

//  searchCircle.setVisible(false);
    searchCircle.setCenter(myLocation);
//  searchCircle.setVisible(true);

    map.setCenter(myLocation);  
}

var onGPSError = function() {
    console.log("GPS Error");
};

function GenerateFakeMovement() {
 var currentPosition = myLocationMarker.getPosition();
    var newLat = currentPosition.lat() + 0.01;
    var newLng = currentPosition.lng() + 0.01;
    MoveMarkerAndCircle(newLat, newLng);
}
</script>
</head>
<body  style="height:100%;text-align:center" onload="onDeviceReady()" onunload="onUnLoad()">
    <div id="map_canvas" style="width: 100%;height:80%"></div>
    <a href='#' onclick="GenerateFakeMovement();" style="padding-top:5px">MAKE FAKE MOVEMENT</a>
</body>
</html>​
于 2012-11-23T04:29:23.550 に答える
0

問題に完全に関連しているわけではありませんが、円をマーカーにバインドする場合は、円の位置を手動で設定する必要はありません。

 if (myMarker == undefined) {
      myMarker = new google.maps.Marker({
          position: mouseEvent.latLng,
          title: 'My Position',
          map: map,
          draggable: true
      });

      var circle = new google.maps.Circle({
          map: map,
          radius: 100000, // 100 km
          fillOpacity: 0.1,
          strokeOpacity: 0.5,
          strokeWeight: 1
      });

      circle.bindTo('center', myMarker, 'position'); //This will set the circle bound to the marker at center
}

したがって、マーカーの位置を更新するだけで済みます。お役に立てれば。

于 2012-11-23T08:24:50.370 に答える
0

これを「答え」として投稿することで、私が正しいことをしていることを願っています。私はまだ問題を抱えていますが、Android4.1.1のみのGoogleMapsAPIv3の問題であることが明らかであるという点まで自分の例を絞り込みました。絞り込んだテストケースのコードは以下のとおりであり、PhoneGapは含まれていません。

ここにテストページをオンラインで投稿しました:http: //kcwebprogrammers.com/MarkerTest-NoGps.html

Windows(ChromeまたはIE)またはAndroid 2.3のインターネットブラウザで閲覧する場合、円の移動は問題なく機能します。Android 4.1.1のインターネットブラウザで同じページを参照すると、円を移動した後も元の円が表示されたままになり、2つの円が発生することがわかります。そこで、この問題をGoogleマップの問題リストに投稿しました。

上記の提案をありがとう。この投稿で何か違うことをすべきだと誰かが思ったら教えてください。

<!DOCTYPE HTML>
<html>
<head>
<title>Marker Test</title>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
    html {height: 100%}
    body {height: 100%; margin:0; padding:0}
    #map_canvas {height: 100%}
</style>
<script type="text/javascript" charset="utf-8" src="http://maps.googleapis.com/maps/api/js?key=AIzaSyDTGR9VjM2t5ixumkk_jHg155s0C1S5g3Y&sensor=true"></script>
<script type="text/javascript" charset="utf-8">

// globals
var watchID = null;
var map = null;
var myLocationMarker = null;
var searchCircle = null;
var myLocation = null;

function onLoad() {
    startGPS();
}

function onUnLoad() {
    console.log("clearing watch " + watchID);
}

function startGPS() {
    // simulate getting position from GPS
    myLocation = new google.maps.LatLng(39, -90);

    // create Google map
    var mapOptions = {
        zoom: 14,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        center:myLocation
    };
    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
    google.maps.event.trigger(map, 'resize');

    myLocationMarker = new google.maps.Marker({
        title: 'This is me!',
        zIndex: 90,
        optimized: false,
        map:map,
        position: myLocation
    });     

    searchCircle = new google.maps.Circle({
        fillColor: '#c0e4dd',
        strokeColor: '#f15f22',
        fillOpacity: 0.5,
        radius: 1500,
        map:map,
        center:myLocation
    });
    // using bindTo instead does not fix the problem
//  searchCircle.bindTo('center', myLocationMarker, 'position'); //This will set the circle bound to the marker at center
}

var MoveMarkerAndCircle = function(lat, lng) {
    myLocation = new google.maps.LatLng(lat, lng);
    myLocationMarker.setPosition(myLocation);

    // set circle invisible before moving and visible after does fix redraw for 4.1.1
    // but causes some annoying flashing of the circle for 4.1.1 and everything else
//  searchCircle.setVisible(false);
    searchCircle.setCenter(myLocation);
//  searchCircle.setVisible(true);
}

var GenerateFakeMovement = function() {
    var currentPosition = myLocationMarker.getPosition();
    var newLat = currentPosition.lat() + 0.001;
    var newLng = currentPosition.lng() + 0.001;
    MoveMarkerAndCircle(newLat, newLng);
}
</script>
</head>
<body  style="height:100%;text-align:center" onunload="onUnLoad()" onload="startGPS()">
    <div id="map_canvas" style="width: 100%;height:90%"></div>
    <a href='#' onclick="GenerateFakeMovement();" style="padding-top:5px">MOVE MARKER AND CIRCLE</a>
</body>
</html>
于 2012-11-24T19:29:02.820 に答える