开发者

How to display a MapView and a StreetView simultaneously?

I want to display a MapView that may be used to select a point to be displayed by StreetView in a开发者_高级运维 separate area. I know that the API disallows multiple MapViews in a single process.

How can I cause StreetView to display in a different area than that which displays MapView?

I have been able to grab a static streetview without any problems, but I want to have dynamic StreetView and MapView.

aTdHvAaNnKcSe (THANKS in ADVANCE)


You can load 360 degree panoramic Google street-view in your WebView.

Try following activity in which both google-street-view and google-map can be navigated simultaneously in single Activity :

public class StreetViewActivity extends Activity {

    private WebView webView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mappingWidgets();
    }

    private void mappingWidgets() {

        webView = (WebView) findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);

        webView.getSettings().setLoadWithOverviewMode(true);
        webView.getSettings().setUseWideViewPort(true);
        webView.getSettings().setSupportZoom(false);  


        // If you want to load it from assets (you can customize it if you want)
        //Uri uri = Uri.parse("file:///android_asset/streetviewscript.html");

        // If you want to load it directly
        Uri uri = Uri.parse("https://google-developers.appspot.com/maps/documentation/javascript/examples/full/streetview-simple");
        webView.loadUrl(uri.toString());
    }
}

You can place this as static HTML page in assets folder of your application and then you can modify it's java-script according to your needs using Google street-view API.

Here I am posting sample streetviewscript.html that you can put in assets folder of your application and customize it according to your needs :

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Google Maps JavaScript API v3 Example: Street View Layer</title>
    <link href="/maps/documentation/javascript/examples/default.css" rel="stylesheet">
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=true"></script>
    <script>

      function initialize() {
        var fenway = new google.maps.LatLng(42.345573,-71.098326);
        var mapOptions = {
          center: fenway,
          zoom: 14,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(
            document.getElementById('map_canvas'), mapOptions);
        var panoramaOptions = {
          position: fenway,
          pov: {
            heading: 34,
            pitch: 10,
            zoom: 1
          }
        };
        var panorama = new  google.maps.StreetViewPanorama(document.getElementById('pano'),panoramaOptions);
        map.setStreetView(panorama);
      }
    </script>
  </head>
  <body onload="initialize()">
    <div id="map_canvas" style="width: 800px; height: 800px"></div>
    <div id="pano" style="position:absolute; left:810px; top: 8px; width: 800px; height: 800px;"></div>
  </body>
</html>

Edit : For simultaneously navigating two street views, load following HTML from assets :

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Google Maps JavaScript API v3 Example: Street View Events</title>

    <STYLE type="text/css"> 
        body, html { height:100%; padding:0; margin:0;} 
        #pano { float:left }
        #pano1 { float:right }
    </STYLE>
    <link href="/maps/documentation/javascript/examples/default.css" rel="stylesheet">
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
    <script>

      var cafe = new google.maps.LatLng(37.869085,-122.254775);

      var heading_value = 270;
      var pitch_value = 0;
      var zoom_value = 1;

      function initialize() {

        var panoramaOptions = {
          position: cafe,
          pov: {
            heading: heading_value,
            pitch: pitch_value,
            zoom: zoom_value
          },
          visible: true
        };

        var panorama = new google.maps.StreetViewPanorama(document.getElementById('pano'), panoramaOptions);
        var panorama2 = new google.maps.StreetViewPanorama(document.getElementById('pano1'), panoramaOptions);  

        google.maps.event.addListener(panorama, 'pano_changed', function() {
            var panoCell = document.getElementById('pano_cell');
            panoCell.innerHTML = panorama.getPano();
            panorama2.setPano(panorama.getPano());
        });

        google.maps.event.addListener(panorama, 'links_changed', function() {
            var linksTable = document.getElementById('links_table');
            while(linksTable.hasChildNodes()) {
              linksTable.removeChild(linksTable.lastChild);
            };
            var links =  panorama.getLinks();
            panorama2.setLinks(panorama.getLinks());
            for (var i in links) {
              var row = document.createElement('tr');
              linksTable.appendChild(row);
              var labelCell = document.createElement('td');
              labelCell.innerHTML = '<b>Link: ' + i + '</b>';
              var valueCell = document.createElement('td');
              valueCell.innerHTML = links[i].description;
              linksTable.appendChild(labelCell);
              linksTable.appendChild(valueCell);
            }
        });

        google.maps.event.addListener(panorama, 'position_changed', function() {
            var positionCell = document.getElementById('position_cell');
            positionCell.firstChild.nodeValue = panorama.getPosition();
            panorama2.setPosition(panorama.getPosition());
        });

        google.maps.event.addListener(panorama, 'pov_changed', function() {
            var headingCell = document.getElementById('heading_cell');
            var pitchCell = document.getElementById('pitch_cell');
            headingCell.firstChild.nodeValue = panorama.getPov().heading;
            panorama2.setPov(panorama.getPov());
            pitchCell.firstChild.nodeValue = panorama.getPov().pitch;
        });
    }
    </script>
  </head>
  <body onload="initialize()">

    <div style="width:100%; height :100%;  background-color:Lime;">
        <div id="pano" style="width:50%; height:100%; background-color:Blue;">
        </div>
        <div id="pano1" style="width:50%; height:100%; background-color:Gray;">
        </div>
    </div>
      <div id="panoInfo" style="width: 425px; height: 240 px;float:left; display: none;">
        <table>
            <tr>
                <td><b>Position</b></td><td id="position_cell">&nbsp;</td>
            </tr>
            <tr>

                    <td><b>POV Heading</b></td><td id="heading_cell">270</td>
                </tr>
                <tr>
                    <td><b>POV Pitch</b></td><td id="pitch_cell">0.0</td>
                </tr>
                <tr>
                    <td><b>Pano ID</b></td><td id="pano_cell">&nbsp;</td>
                </tr>
                <table id="links_table"></table>
            </table>
        </div>
      </body>
    </html>


How can I cause StreetView to display in a different area than that which displays MapView?

Street View is only available on the device as its own activity (from its own application) and therefore cannot be displayed alongside any of your own widgets.


On Android have a look at the sample Street View Panorama and Map available at https://developers.google.com/maps/documentation/android/code-samples. But i am not sure if it will also do for custom street views.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜