2017-03-06 10 views
2

isoline用のHERE Map APIからJSONレスポンスをフォーマットする際に問題が発生しました。完全なHERE API JSONレスポンスは以下に示され、下に示すように、行の緯度/経度座標を含んでいます。フォーマットはこちらAPI API JSONレスポンス

{ 
    "response": { 
     "metaInfo": { 
      "timestamp": "2017-03-03T23:40:34Z", 
      "mapVersion": "8.30.68.151", 
      "moduleVersion": "7.2.201709-111134", 
      "interfaceVersion": "2.6.29" 
     }, 
     "center": { 
      "latitude": 34.603565, 
      "longitude": -98.3959 
     }, 
     "isoline": [ 
      { 
       "range": 300, 
       "component": [ 
        { 
         "id": 0, 
         "shape": [ 
          "34.6096802,-98.4147549", 
          "34.6096802,-98.4141541", 
          "34.6098518,-98.4136391", 
          "34.6101952,-98.4132957", 
          "34.6103668,-98.4127808", 
          "34.6101952,-98.4122658", 
          "34.6098518,-98.4119225", 
          "34.6098518,-98.4115791", 
          "34.6101952,-98.4112358", 
          "34.5998955,-98.4115791", 
          "34.6002388,-98.4126091", 
          "34.6005821,-98.4129524", 
          "34.6009254,-98.4139824", 
          "34.6019554,-98.4143257", 
          "34.6022987,-98.4153557", 
.... 
          "34.6081352,-98.4129524", 
          "34.6083069,-98.4134674", 
          "34.6083069,-98.4148407", 
          "34.6084785,-98.4153557", 
          "34.6089935,-98.4155273", 
          "34.6095085,-98.4154415", 
          "34.6096802,-98.415184", 
          "34.6096802,-98.4147549" 
         ] 
        } 
       ] 
      } 
     ], 
     "start": { 
      "linkId": "+888249498", 
      "mappedPosition": { 
       "latitude": 34.6034836, 
       "longitude": -98.3959009 
      }, 
      "originalPosition": { 
       "latitude": 34.603565, 
       "longitude": -98.3959 
      } 
     } 
    } 
} 

リーフレットのアイソラインデータをポリゴンとしてマッピングしています。私は手動でこれを行うことができ、すべて正常に動作します。

var polygon = L.polygon([ 
[34.6343994, -98.7664032], 
[34.6357727, -98.76297], 
[34.6385193, -98.7602234], 
[34.6398926, -98.7561035], 
[34.6385193, -98.7519836], 
[34.6357727, -98.7492371], 
[34.6357727, -98.7464905], 
..... 
[34.6302795, -98.7712097], 
[34.6330261, -98.7718964], 
[34.6343994, -98.7698364], 
[34.6343994, -98.7664032] 

] 
      ).addTo(map); 

これを自動化しようとしていますが、jsonの出力をリーフレットの互換フォーマットにすることはできません。私は、API呼び出しを作るJSON応答をキャプチャし、次のコードを使用して、緯度/経度の座標の配列を抽出することができる:変数孤立線この(長い座標対/ LATの配列)のように見える

function getJson(url) { 
     return JSON.parse($.ajax({ 
      type: 'GET', 
      data: '', 
      url: url, 
      dataType: 'json', 
      global: false, 
      async: false, 
      success: function (data) { 
       return data; 
      } 
     }).responseText); 
    } 

    var myJsonObj = getJson('https://isoline.route.cit.api.here.com/routing/7.2/calculateisoline.json?mode=fastest;car;traffic:disabled&jsonAttributes=1&rangetype=time&start=34.603565,-98.3959&app_id=id&app_code=codeg&range=1800'); 

var isoline = myJsonObj.response.isoline[0].component[0].shape; 

をけれどもリーフレットの必要に応じて配列の配列に入れることはできません。

[ 
           "34.6096802,-98.4147549", 
           "34.6096802,-98.4141541", 
           "34.6098518,-98.4136391", 
           "34.6101952,-98.4132957", 
           "34.6103668,-98.4127808", 
           "34.6101952,-98.4122658", 
           "34.6098518,-98.4119225", 
           "34.6098518,-98.4115791", 
           "34.6101952,-98.4112358", 
           "34.5998955,-98.4115791", 
           "34.6002388,-98.4126091", 
           "34.6005821,-98.4129524", 
           "34.6009254,-98.4139824", 
           "34.6019554,-98.4143257", 
           "34.6022987,-98.4153557", 
    .... 
           "34.6081352,-98.4129524", 
           "34.6083069,-98.4134674", 
           "34.6083069,-98.4148407", 
           "34.6084785,-98.4153557", 
           "34.6089935,-98.4155273", 
           "34.6095085,-98.4154415", 
           "34.6096802,-98.415184", 
           "34.6096802,-98.4147549" 
          ] 

この

[ 
    [34.6343994, -98.7664032], 
    [34.6357727, -98.76297], 
    [34.6385193, -98.7602234], 
    [34.6398926, -98.7561035], 
    [34.6385193, -98.7519836], 
    [34.6357727, -98.7492371], 
    [34.6357727, -98.7464905], 
    ..... 
    [34.6302795, -98.7712097], 
    [34.6330261, -98.7718964], 
    [34.6343994, -98.7698364], 
    [34.6343994, -98.7664032] 

    ] 

に見えるように座標を再フォーマットで任意のヘルプをお願い申し上げそれだけでなく、リーフレットにデータを置くことのより良い方法があることかもしれないが、ポリゴンとポリラインは、私は見つけることができるメソッドと配列の配列の座標が必要です。

答えて

2

によって許容されます。このよう

、(ES6道)

const newArray = array.map(a => a.split(',').map(Number)); 

または(非ES6の道)

var newArray = []; 
array.forEach(function (a){ newArray.push(a.split(',').map(Number)); }); 

は、だからあなたの最終的なコードは次のようになります、

function getJson(url) { 
    return JSON.parse($.ajax({ 
    type: 'GET', 
    data: '', 
    url: url, 
    dataType: 'json', 
    global: false, 
    async: false, 
    success: function (data) { 
     return data; 
    } 
    }).responseText); 
} 

function parseJSONForPolygon(rawJsonArray) { 
    var newArray = []; 
    rawJsonArray.forEach(function (a) { newArray.push(a.split(',').map(Number)); }); 
    return newArray; 
}; 

var myJsonObj = getJson('https://isoline.route.cit.api.here.com/routing/7.2/calculateisoline.json?mode=fastest;car;traffic:disabled&jsonAttributes=1&rangetype=time&start=34.603565,-98.3959&app_id=id&app_code=codeg&range=1800'); 

var isoline = parseJSONForPolygon(myJsonObj.response.isoline[0].component[0].shape); 

クレジットはになりますhttps://stackoverflow.com/a/15677905/923426

+0

+1ありがとうございました!私は緯度/経度座標から二重引用符を削除する必要があることを発見しました。リーフレットに追加する前に、isoline = JSON.stringify(isoline).replace(/ ['"] +/g、' ')、次にJSON.parseを使用する場合の問題? – mcsnead

+0

@mcsnead updated answer! –

2
let polygonArray = []; 

data.response.isoline.component.shape.forEach((elm) => { 
    polygonArray.push(elm.split(',')); 
}) 

今、あなたのpolygonArrayはあなたが反復以上の要素を必要と配列を形成し、を分割リーフレット

関連する問題