1

データを表示しているjqueryデータテーブルがあります(以下を参照)。最後の列はアドレスで、行データは単純にロード中と表示されていることがわかります。

テーブル

データの経度と緯度を使用して、Google Maps API から住所を取得したいと考えています。

住所の取得に時間がかかることはわかっていますが、3000 件の結果が返された場合は時間がかかるため、事前にジオコーディングされた住所をデータに渡さなかったのです。

テーブル データが表示されたら、各行の緯度/経度のジオコーディングを開始し、各行が完了するたびに住所列を更新できますか?

Google マップ用の GMAP3 jQuery プラグインも使用しているため、次のようにアドレスを取得できます。

        // get address
        $("#map").gmap3({
          action: 'getAddress',
          latLng: [lati, longi],
          callback: function (results) {
            content = results && results[1] ? results && results[1].formatted_address : 'No Address';
          } // end callback

        });

アップデート

ほぼ完了しました:)クラスが緯度、経度、住所に追加され、ジオコーディングされた住所がコンソールに表示されます。私がする必要があるのは、テーブルの正しい行にアドレスを取得することだけです。どうすればいいですか?

私のコード var historyArray = window.opener.historyArray;

 $(document).ready(function() {
            //$('#dynamic').html( '<table cellpadding="0" cellspacing="0" border="0" class="display" id="report"></table>' );
            $('#report').dataTable( {
                "aaData": historyArray,
                "aoColumns": [
                    { "mDataProp": "User" },
                    { "mDataProp": "Timestamp" },
                    { "mDataProp": "Latitude" },
                    { "mDataProp": "Longitude" },
                    { "mDataProp": "Address" }
                ],
                "iDisplayLength": 25,
                "bJQueryUI": true,
                "sPaginationType": "full_numbers",
                "sDom": '<"H"Tfr>t<"F"ip>',
                "oTableTools": {
                            "sSwfPath": "swf/copy_csv_xls_pdf.swf",
                            "aButtons": ["copy", "csv", "xls", "pdf"]
                                      },
                "fnInitComplete": function () {
                    getAdresses();
                }
            } );    

$("#report td:nth-child(3)").addClass("lat");
$("#report td:nth-child(4)").addClass("lng");
$("#report td:nth-child(5)").addClass("addi");
} );

 function getAdresses() {
   $.each(historyArray, function (index,data) {
    // get address
    var map = window.opener.document.getElementById('dispatcher');
    $(map).gmap3({
      action: 'getAddress',
      latLng: [data.Latitude, data.Longitude],
      callback: function (results) {
        content = results && results[1] ? results && results[1].formatted_address : 'No Address';
        console.log(content);
      } // end callback

    });
   });
 }

更新 2

こんにちは、更新されたコード。$(this).html(content); を追加したためです。gmap3 のコールバックで「addi」セルが更新されません。どうすれば修正できますか?

 function getAdresses() {
   $(".addi").each(function () {
     var lat = $(this).siblings(".lat").html().toString();
     var lng = $(this).siblings(".lng").html().toString();
      // get address
      $(map).gmap3({
        action: 'getAddress',
        latLng: [lat, lng],
        callback: function (results) {
          content = results && results[1] ? results && results[1].formatted_address : 'No Address';
          $(this).html(content);
        } // end callback

      });
   });
 }

最終更新 親切に与えられたソリューションに追加します。データを CSV や Excel などにエクスポートすると、住所データが更新されないことがわかりました。

コードをこれに変更しました。

       myTable = $('#report').dataTable({
     "aaData": historyArray,
     "aoColumns": [{
       "mDataProp": "User"
     }, {
       "mDataProp": "Timestamp"
     }, {
       "mDataProp": "Latitude"
     }, {
       "mDataProp": "Longitude"
     }, {
       "mDataProp": "Address"
     }],
     "bPaginate": false,
     "bJQueryUI": true,
     "sPaginationType": "full_numbers",
     "sDom": '<"H"Tfr>t<"F"ip>',
     "oTableTools": {
       "sSwfPath": "swf/copy_csv_xls_pdf.swf",
       "aButtons": ["copy", "csv", "xls", "pdf"]
     },
     "fnInitComplete": function () {
       addClasses();
     }
   });
   window.setTimeout(function () {
     getAdresses();
   }, 1000);
 });

 function addClasses() {
   $("#report td:nth-child(3)").addClass("lat");
   $("#report td:nth-child(4)").addClass("lng");
   $("#report td:nth-child(5)").addClass("addi");
 }

 function getAdresses() {
   $(".addi").each(function () {
     var lat = $(this).siblings(".lat").html().toString();
     var lng = $(this).siblings(".lng").html().toString();
     var addi = $(this);
     $(addi).html("Reverse geocoding..");
     var aPos = myTable.fnGetPosition(this);

     // get address
     $('#hidden').gmap3({
       action: 'getAddress',
       latLng: [lat, lng],
       callback: function (results) {
         content = results && results[1] ? results && results[1].formatted_address : 'No Address';
         myTable.fnUpdate(content, aPos[0], 4);
       } // end callback

     });
   });
 }

これで、データは本当に更新されました。

4

1 に答える 1

1

私が正しく理解している場合:

次のように、jQueryを使用して最後の列にクラスを追加できます。

$("#table td:nth-child(5)").addClass("someClass");

次に、テーブルが初期化されたに実行される関数を作成できます。

//Part of the datatable initialization
"fnInitComplete": function () {
    myAwesomeFunction();
}

その関数では.each()、クラスに基づいて実行し、兄弟(latおよびlong)を取得してそれらをAPIに渡し.html()、結果を使用して読み込み中のテキストを置き換えることができます。これが理にかなっていることを願っています。私に知らせない場合:)

//編集//

兄弟をつかむには:最初に彼らにクラスを与えます

$("#table td:nth-child(3)").addClass("lat");

$("#table td:nth-child(4)").addClass("long");

datatableが初期化された後、これらすべてのスタイルを適用する必要があることを覚えておいてください。

次に、次のことができます。

var lat = $(this).siblings(".lat").html().toString();
var long = $(this).siblings(".long").html().toString();

///////////// /// EDIT 2 /// /////////////

最初にこのコードを移動します:

$("#report td:nth-child(3)").addClass("lat");
$("#report td:nth-child(4)").addClass("lng");
$("#report td:nth-child(5)").addClass("addi");

このような関数に:

$("#report").on("draw", function() {
   addClasses();
});

function addClasses() {
    $("#report td:nth-child(3)").addClass("lat");
    $("#report td:nth-child(4)").addClass("lng");
    $("#report td:nth-child(5)").addClass("addi");
}

そして、前にaddClasses()関数を追加しますfnInitcomplete getAddresses()

このようにして、ページを変更したり、並べ替えたり、テーブルに他の変更を加えたりした場合に、クラスが適用/再適用されます。

地理的なもののAPIがどのように機能するかはわかりませんが、長いラットを取得するには、次のようにします。

    $(".addi").each(function () {
        var lat = $(this).siblings(".lat").html().toString();
        var lng = $(this).siblings(".lng").html().toString();
        // Now pass these parameters to the geocode function and store the result in some var
        //In this case lets call it result
        //Now just replace the loading with the result:
        $(this).html(result);
    });

上記のコードをgetAddresses()関数に入れると、結果が得られるはずです。

これで十分かどうか、正常に機能するかどうかを教えてください;)

于 2012-07-10T17:26:04.813 に答える