カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

指定した座標から一番近い場所のストリートビューを表示する

グーグルストリートビューで、指定した座標が建物上だったり、ストリートビューが提供されていない場所だった場合、そこから一番近い場所のストリートビューを表示する方法があります。

GoogleMap APIのバージョンが異なると書き方が違ってくるので、その違いを紹介。

JavaScriptのクラスとして定義しています。

バージョン2の場合、以下のようにしていました。

var stViewClass = {

    panoramaOptions: {
        latlng: new GLatLng({緯度}, {経度}),
        pov: {
            heading: 0,
            pitch: 0,
            zoom: 1
        }
    },

    makeStreetView: function(id)
    {
        stPanorama = new GStreetViewPanorama(document.getElementById(id), this.panoramaOptions);

        stClient = new GStreetviewClient();
        stClient.getNearestPanoramaLatLng(this.panoramaOptions.position, function(latlng) {
            if (latlng != null)
            {
                stPanorama.setLocationAndPOV(latlng);
            }
        });
    }

}

バージョン3の場合、以下のような記述になります。 続きを読む…»

4,957 views

iPhoneアプリのGoogleMapsが復活

iPhoneアプリのGoogleMapsが復活したそうです。
3D表示もできるようになったらしく、パワーアップしているようです。

http://www.google.co.jp/intl/ALL_jp/help/maps/helloworld/

1,312 views

GoogleMaps JavaScript API v3 日本語リファレンス

https://developers.google.com/maps/documentation/javascript/services?hl=ja

2,605 views

ウェブページからナビを起動

単純にナビを起動するなら、以下のようにリンクを貼るだけです。
但し、経路を表示するまでに3タッチ必要です。

※引数に与える座標は世界測地系(WGS84)です。

<a href="http://maps.google.com/maps?daddr=35.65860811863414,139.7455318066551">ナビ起動</a>
2,420 views

GoogleMapのアイコンタップ

GoogleMapにアイコンを表示し、タップすると何らかの処理をしたいとき、通常のonTapメソッドで処理を実行しようとすると、地図の拡大縮小時、アイコンに指が触れているとタップされたことになってしまいます。

これを回避するために、ジェスチャーリスナーを実装し、シングルタップアップにて処理をするようにします。

android.view.GestureDetector.OnGestureListener
public class PinItemizedOverlay extends ItemizedOverlay<OverlayItem> implements OnGestureListener {

    private List<GeoPoint> points = new ArrayList<GeoPoint>();
    private Context context;
    private GestureDetector gestureDetector = null;
    private MapView mMapView;
    private Drawable defaultMarker;

    public PinItemizedOverlay(Drawable defaultMarker, Context context) {
        super( boundCenterBottom(defaultMarker) );
        setLastFocusedIndex(-1);
        populate();
        this.context = context;
        this.defaultMarker = defaultMarker;
        gestureDetector = new GestureDetector(this);
    }

    @Override
    protected OverlayItem createItem(int i) {
        GeoPoint point = points.get(i);
        OverlayItem overlayItem = new OverlayItem(point, null, null);
        overlayItem.setMarker(boundCenterBottom(defaultMarker)); //これをしないとhitTestでNullPointerExceptionが発生します。
        return overlayItem;
    }

    @Override
    public int size() {
        return points.size();
    }

    public void addPin(GeoPoint point, String title, String snippet, int icontype) {
        if (getIndexGeoPoint(point) == -1) {
            this.points.add(point);
            this.icontype.add(icontype);
        }
        setLastFocusedIndex(-1);
        populate();
    }

    // 位置が一致するか(一致しない場合は -1を返す)
    private int getIndexGeoPoint(GeoPoint newPoint) {
       int result = -1;
       int size = this.points.size();
       for (int i = 0; i < size; i++) {
          GeoPoint point = this.points.get(i);
          if (point.equals(newPoint)) {
             result = i;
             break;
          }
       }
       return result;
    }

続きを読む…»

2,835 views