React+Amapは緯度と経度をリアルタイムで取得し、住所を特定します

React+Amapは緯度と経度をリアルタイムで取得し、住所を特定します

1. Amap の公式チュートリアルに従って予備設定を実行します。
2. 公式サンプルセンターを参考にマップ作成を完了します。

次に、まずレンダリングを見てみましょう。

1. マップを初期化する

マップ コンテナーを作成した後、初期化中にいくつかのデフォルト パラメーターを構成する必要があります。ここでは、よく使用されるパラメーターをいくつか示します。他の効果を追加するには、API を参照できます。

DOM: <div id='map_container'>
        //マップコンテナ</div>
    
//マップクラスを定義する class GeoMap {
    コンストラクタ() {
        this.el = 'マップコンテナ'
        this.defaultConfig = { //デフォルト設定 zoom: 16, //デフォルトのズームレベル touchZoomCenter: 1, //ズームレベルが1の場合、マップの中心がズームに使用されます resizeEnable: true, //マップコンテナのサイズ変更を監視します doubleClickZoom: true, //ダブルクリックするとマップが拡大します}
        this.map = null // マップインスタンス this.mapMove = false // マップは移動していますか this.centerPixel = { y: '-999', x: '-999' } // ポイントのデフォルトの位置 }
    // マップを初期化する initFn() {
        この.createMap()
        // ...
    }
    // インスタンスを作成する createMap() {
        this.map = 新しい AMap.Map(this.el、this.defaultConfig)
        // お気に入りのスタイル(背景色)をマップに追加します
        this.map.setMapStyle('amap://styles/28d5c5df182464d14316bfa41383096c')
    }
    // ...
 }
 デフォルトの新しい GeoMap() をエクスポートします

2. マップポイント

まず、地図上に中心点を描きます。達成される効果は次のようになります。

  1. 地図をドラッグしても移動できません
  2. マップコンテナの中央

マップ ボックスは親要素として使用され、最初のポイントに到達するように絶対配置されます。

    Dom: <div id='map_container'> //マップ コンテナー<div id='center_icon' style={{left: `${instance.centerPixel.x}px`, top: `${instance.centerPixel.y}px` }}>
            <img src='扎点圖片' /> // 記事の最後に扎点アニメーションの紹介があります</div>
       </div>
    css: #map_container {
            フレックス: 1;
            位置: 相対的;
            #センターアイコン {
                位置: 絶対;
                zインデックス: 101;
                >画像{  
                    幅: 52px;
                    高さ: 64px;
                    // --------以下のコードについては以下で詳しく説明します---------
                    位置: 相対的;
                    上: -64px;
                    左: -26px;
                }
            }
         }

次に、ポイントの左と上の値を設定する必要があります。ポイントのピクセル値を動的に設定するにはどうすればよいでしょうか? ここでは、Gaode API、getCenter() を使用してマップの中心の経度と緯度の座標を取得し、lngLatToContainer() を使用してマップの経度と緯度の座標をマップ コンテナーのピクセル座標に変換します。

    setCenterIcon() {
        lnglat = this.map.getCenter() とします。
        ピクセルを this.map.lngLatToContainer(lnglat) とします。
        this.centerPixel = ピクセル
    }

点線の画像は、自身の高さ(上:自身の高さ、左:自身の幅/2)で相対的に配置する必要があります。その理由は、配置ポイントがボックスの左上隅から中央(点線のボックス)に配置されているため、点の位置が正確になるように、(点線のボックス)を(実線のボックス)の位置に移動する必要があるためです。次の図をご覧ください。

3. 位置決めを有効にする

実装する必要があるもの:

  • 地図ページに入ると、自動的に測位機能がオンになります
  • 測位に成功した後の位置は地図の中心点として使用されます

これらは両方とも比較的単純なAPIを通じて実装されており、位置決めが失敗した後に中国語のプロンプトが返されます。

    位置情報を取得する() {
        const mapError = 新しいマップ([
            ['ipLocation の取得に失敗しました。', 'IP の正確な位置特定に失敗しました'],
            ['ブラウザは HTML5 ジオロケーションをサポートしていません。', 'ブラウザはネイティブのポジショニング インターフェースをサポートしていません'],
            ['位置情報の許可が拒否されました。'、'ブラウザは安全でないドメインでの位置情報のリクエストを禁止しています']、
            ['位置情報の取得がタイムアウトしました。'、'ブラウザの位置情報のタイムアウト']、
            ['位置情報の取得に失敗しました。'、'位置特定に失敗しました']
        ])
        this.map.plugin('AMap.Geolocation', () => {
            const geolocation = 新しい AMap.Geolocation({
                enableHighAccuracy: true, //高精度測位を使用するかどうか timeout: 30000, //n秒後に測位を停止する showButton: false, //測位ボタンを表示する showMarker: true, //測位に成功した後、測位した位置にポイントマークを表示する showCircle: false, //測位に成功した後、円を使用して測位精度の範囲を示す panToLocation: true, //測位に成功した後、測位した位置を地図の中心点として使用する ---
                zoomToAccuracy: true, // 測位位置と精度範囲が見えるようにマップの視野を調整します})
            this.map.setZoom(16) // ズーム比の変更後に再配置する際の初期ズーム比を設定します this.map.addControl(geolocation) // コントロールを追加します geolocation.getCurrentPosition() // ページに入るときに自動的に配置します AMap.event.addListener(geolocation, 'complete', (result) => {
                // 返される緯度、経度、詳細な住所には大きな偏差があるため、ここではデータを取得しないでください --- 正確な住所を取得する方法については以下で説明します})
            AMap.event.addListener(geolocation, 'error', (err) => { // 位置決め失敗のエラーメッセージ let msg = mapError.get(err.message) || err.message
                コンソールログ(メッセージ);
            })
        })
    }

4. マップの変更を監視する

移動、移動終了、ズーム、ドラッグなど、API 呼び出しを通じてマップの変更を監視します。

    マップ移動() {
        // * マップの移動 this.map.on('mapmove', () => {
           this.mapMove = false
        })
        // * マップの移動が終了します this.map.on('moveend', () => {
            this.mapMove = true
            this.getCenterAddress() // アドレスを取得します --- 詳細は以下に記載されています})
    }

5. 詳細な住所を取得する

地図が移動した後、API を通じて詳細な住所が取得されます。まず、次の 2 つの API について説明します。

  1. AMap.PlaceSearch().searchNearBy() は、中心点の緯度と経度、半径、キーワードに基づいて周囲の検索を実行します。
  2. AMap.Geocoder().getAddress() 住所の説明と座標間の変換に使用されるジオコーディングおよび逆ジオコーディング サービス

🤔2 番目の方法の方が 1 番目の方法よりも正確であるのは当然ですが、多くのテストを行った結果、1 番目の方法の方が正確であることがわかりました。2 つの方法は互換性を持たせることができます。ここでは、1 番目の方法のみを例として取り上げます。

    取得センターアドレス() {
        lnglat = this.map.getCenter() とします。
        AMap.service('AMap.PlaceSearch', () => {
            placeSearch = new AMap.PlaceSearch({
                    ページサイズ: 10,
                    ページインデックス: 1,
                    子供: 1,
                    拡張子: 'すべて'、
                    タイプ:「アクセス施設|地名住所情報|政府機関および社会団体|建物|工業団地|景勝地|空港出発/到着|鉄道駅|港湾ターミナル|長距離バス停|地下鉄駅|ライトレール駅|バス停」,
                })
            center = [lnglat.lng, lnglat.lat] とします。
            placeSearch.searchNearBy('', center, 50, (sta, 結果) => {
                if (sta === 'complete' && result.info === 'OK') {
                    // result.poiList.pois 配列の最初の項目は、取得された正確なアドレスです})
            })
    }

6. ドットアニメーション 😄

マップが移動した後のポイントに上下ジャンプアニメーションを追加し、移動時にアニメーションをキャンセルします

    Dom: <img src='点点図形' className={Instance.mapMove ? 'pinAnima' : ''}/>
    
    css: 
        .pinAnima{
            アニメーション: バウンス 0.75 秒;
        }
        
    @keyframes バウンス {
    0% {
        変換: translateY(0)
    }
    50% {
        変換: translateY(-20px);
    }
    100% {
        変換: translateY(0)
    }
}

7. 終了

考え方はそれほど複雑ではありません。地図を箱の入れ物と考え、地図の中心点を箱の中心点と考えます。[地図の中心点]にくっついていれば、地図は動きません。地図を動かすときは、[地図の中心点]の経度と緯度を取得します。特定の場所を設定するときは、[地図の中心点]に経度と緯度を設定します。

他にも、おすすめの場所の設定、ルートの描画、経路計画、車の運転、レーダーアニメーションなどの機能もあります。興味のある方は、一緒に勉強してみてください。携帯電話の測位には、測位失敗や測位タイムアウトなどの問題がある可能性があり、これらも一緒に研究することができます。

上記は、React + Gaode Mapを使用して経度と緯度、位置アドレスをリアルタイムで取得する方法の詳細です。React位置アドレスの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Amap を使用した React 実装例 (react-amap)
  • Java環境でAmap APIを使用する方法
  • Android Gaode マップマーカーカスタムポップアップウィンドウ
  • WeChatアプレットAmapマルチポイントルート計画プロセス例の詳細な説明
  • SpringBoot と Mybatis を統合して Amap ポジショニングを実現し、データベースにデータを保存する詳細な手順
  • フロントエンドVueでAmapを使用する方法
  • WeChatアプレットはAmap APIに基づいて天気コンポーネント(動的効果)を実装します
  • vue+Amapは地図検索とクリック位置決め操作を実現します

<<:  Centos7 ベースの Nginx Web サイト サーバーの構築の詳細説明 (仮想 Web ホストの構成を含む)

>>:  CentOS8.0 で FTP サーバーをインストールして設定する方法

推薦する

HTMLページをクリックしてダウンロードファイルを実装する2つの方法

1. <a>タグを使用して完了します <a href="/user/te...

Linuxはlsofコマンドを使用してファイルのオープンステータスを確認します

序文Linux では「すべてがファイル」であることは誰もが知っているので、ファイルのオープン状態を確...

Spark SQL の 4 つの一般的なデータ ソースの詳細な説明

汎用ロード/書き込みメソッドオプションを手動で指定するSpark SQL の DataFrame イ...

CSS変数を使用して、クールで素晴らしいフローティング効果を実現します。

最近、Grover の Web サイトで楽しいホバー アニメーションを見つけ、自分自身のインスピレー...

Vue が Bibibili のホームページを模倣する際の問題

エンジニアリング構造プロジェクトは2つの部分に分かれています。bilibili-apiはAPIインタ...

JavaScript が Jingdong の虫眼鏡の特殊効果を模倣

この記事では、Jingdong虫眼鏡を模倣したJavaScriptの具体的なコードを参考までに共有し...

Node.jsをゼロから学ぶ

目次URL モジュール1. 解析メソッド2. フォーマット方法3. 解決方法イベントモジュール(イベ...

Dockerfileを使用して独自のイメージを作成する方法

1. 空のディレクトリを作成する $ cd /home/xm6f/dev $ mkdir myapp...

MySQL 条件付きクエリと使用法および優先順位の例の分析

この記事では、例を使用して、MySQL 条件クエリ and or の使用方法と優先順位を説明します。...

MySQLに挿入する前にデータが存在するかどうかを確認する方法

ビジネスシナリオ: 訪問者の訪問状況を記録する必要があるが、繰り返し記録することはできない挿入する前...

安全な構成のためにDockerでTLSを有効にする手順

序文以前、Docker の 2375 Remote API を有効にしていました。会社のセキュリティ...

Docker コマンドラインの完全ガイド (知っておくべき 18 のこと)

序文Docker イメージは Dockerfile といくつかの必要な依存関係で構成され、Docke...

読み取り専用と無効の微妙な違いの詳細な説明

「読み取り専用」と「無効」はどちらも、ユーザーがフォーム フィールドの内容を変更できないようにします...

MySQL の重複データの処理方法 (防止と削除)

一部の MySQL テーブルには重複レコードが含まれている場合があります。重複データが存在することを...

Vue で SVG アイコンを導入する 2 つの方法

Vue で SVG アイコンを導入する方法Vue で svg アイコンを導入する方法 1インストール...