2

5.5MBの経度緯度データを含むJavaScriptオブジェクトファイルがあり、Perlで開きたいので、大まかな詳細削減アルゴリズムを適用して、削減されたデータセットで新しいオブジェクトファイルを保存できます。詳細を減らすために、20番目のlong/latペアごとにのみ取るforループを使用します。

これはjavascriptで実行できますが、これには、各座標セットをコピーして貼り付け、JavasSriptを一度に1つずつ実行する必要があります。

次に、座標の各セットを取得してSQLデータベースに入れることができると思いましたが、それは大雑把な方法のようです。そして、多くのデータを移動します。

私は、すべてをサーバー上で実行するために、Perlがより優れたオプションの1つであることに決めました。

次のコマンドでファイルを開くことができます。

#!/usr/bin/perl

# open file
 open(FILE, "reduced_object_latlng.js") or die("Unable to open file");

# read file into an array
@data = <FILE>;

# close file 
close(FILE);

# print file contents
foreach $line (@data)
{
    print $line;
}

オブジェクトは次の設計に従います。

var paths = {
    mayo: {
        name: 'Mayo',
        colour: 'green',
        coordinates: '-9.854892,53.76898 -9.853634,53.769338 -9.85282,53.769387 -9.851981,53.769561 -9.850952,53.769508 -9.850129,53.769371 -9.849136,53.769171 **data**' 
    },
    galway: {
        name: 'Galway',
        colour: 'purple',
        coordinates: '**data**;
    }
}; //etc.

上記のデータをどのように減らすかを説明するために、JavaScriptバージョンが1つのファイルからロードしますvar coords = "*data*"

coords = coords.split(" ");
var path = [];
    var output="";
    document.getElementById("map_canvas").innerHTML = "";
for (var i = 0; i < coords.length; i++) {
        if (i%20==0)
        {
            var coord = coords[i].split(",");
            output += coord[0]+","+coord[1]+" ";
        }
}
document.getElementById("map_canvas").innerHTML = output;

JSONに変換することを提案しているものをいくつか読んだことがありますが、それを行う必要があるかどうかはわかりません。そして、純粋なテキストハンドラーを作成する代わりに、ファイルをオブジェクトとしてロードする方法はありますか?


私は時間のために立ち往生していたので、私はこのようにそれをしました:

var outputobject = 'var paths = {';
    for (property in copypaths) {
        outputobject += property + ': { ';
        outputobject += "name: '" + copypaths[property].name+"',";
        outputobject += "colour: '"+ copypaths[property].colour+"',";

        var reducedoutput="";
        var coord = copypaths[property].coordinates.split(" ");
        for (var i = 0; i < coord.length; i++) {
            if (i%20==0)
            {
                var coords = coord[i].split(",");
                reducedoutput += coords[0]+","+coords[1]+" ";
            }
        }   
        outputobject += "coordinates: '"+ reducedoutput+"'},";
    }
    outputobject += "};";
    document.getElementById("reduced").innerHTML = outputobject;

それでも、最後のをコピー/貼り付けして削除する必要があります,。@Oleg V. Volkovに感謝します。週の後半にもっと時間があれば、あなたがレイアウトした方法を見ていきます。

4

2 に答える 2

3

主要なJavaScriptを削除するだけで、ベアキーを使用してほぼ適切なJSONを取得し、true値に設定されたJSON/JSON::PP instanceを使用して結果の文字列をデコードします。allow_barekey

于 2012-08-06T13:49:54.213 に答える
1

使用JSONすることが最善の策です。それほど厳しくないJSON構文をデコードできるオプションがあり、必要になります

  • allow_singlequoteシングルクォートとダブルクォートの文字列を許可する

  • allow_barekeyすべて英数字のハッシュキーに引用符をまったく含まないようにする

  • decode_prefixデータ終了後のジャンクを無視する

  • relaxed幸運のために

以下のプログラムは、JSONをPerl構造にデコードし、mayoエントリの座標文字列を抽出して、値をペアで出力します。

coordinates: '**data**;これは実際のJavaScriptデータではなく間違いであると想定しているため、セミコロンを削除し、最後に引用符を追加したことに注意してください。

use strict;
use warnings;

use JSON -support_by_pp;

my $json = JSON->new->relaxed->allow_singlequote->allow_barekey;

my $data = do {
  local $/;
  <DATA>;
};

my ($hash) = $json->decode_prefix($data =~ /(\{.*)/s);

my @coords = $hash->{mayo}{coordinates} =~ /[-0-9.]+/g;

printf "%f %f\n", splice @coords, 0, 2 while @coords;

__DATA__
var paths = {
    mayo: {
        name: 'Mayo',
        colour: 'green',
        coordinates: '-9.854892,53.76898 -9.853634,53.769338 -9.85282,53.769387 -9.851981,53.769561 -9.850952,53.769508 -9.850129,53.769371 -9.849136,53.769171 **data**' 
    },
    galway: {
        name: 'Galway',
        colour: 'purple',
        coordinates: '**data**'
    }
}; //etc.

出力

-9.854892 53.768980
-9.853634 53.769338
-9.852820 53.769387
-9.851981 53.769561
-9.850952 53.769508
-9.850129 53.769371
-9.849136 53.769171
于 2012-08-06T15:55:58.247 に答える