0

ネストされたリストで編成された多くの JSON データがあります。各リストは他のリストで構成され、それらのリストには他のリストなどを含めることができます。最も深いリストは、経度と緯度のペアで構成されています。

[[[.....[16.353542354,48.2354242424],[16.46353535,48.2546754646]....].....].

次のようなグラフになります。

コーディネート一覧

基本的に、これらのリストがどのようにネストされているかはわかりません。それらは常に異なります。次の難しい部分は、そこから「座標ポリゴン」を取得する必要があることです。つまり、座標のペアのみで構成されるリストは同じポリゴンに属します。例えば:

[......[[16.23542424,48.2342424242],[16.2423242352354,48.12342534634],[16.35353453535,48.345635353]]......

これは、3 組の座標 (つまり 3 つの角) で構成される多角形があることを意味します。これは、ある種の文字列解析で解決できると確信しています。これが基本的な JSON.simple (または他の API) の可能性で可能かどうか疑問に思います。問題は、JSON が解析しているデータについて何も知らないことです。オブジェクトが何であるかを JSON に伝える必要があり、型変換を使用して正しいデータを取得する必要があります。ここでこれらの例を参照してください。今は逆の方法が必要ですが、データがどのタイプなのかわかりません(「それはまだ別のリストですか、それとも座標のペアのデータですか」)、これらのリストは非常に動的であるためです。これを便利な方法で行うにはどうすればよいでしょうか。JSON文字列を文字ごとに比較するために、「プッシュアンドポップ動作」を備えた文字列解析アルゴリズムを作成できますが、これを行うためのより良い方法はないのでしょうか?

[更新]
これは、GeoJSON と呼ばれる標準化された JSON 形式であることがわかりました。データの読み方を知っていれば、それはかなり明確です。Multipolygon は Polygon で構成され、Polygon オブジェクトの 2 番目の配列で表される Polygon に穴を設けることができます。仕様を参照してください: ポリゴンマルチポリゴン

4

4 に答える 4

2

基本的に、これらのリストがどのようにネストされているかわかりません

これらのリストがどれほど深くネストされているかを正確に知っています。json の上部には、次のものがあります。

"type": "Multipolygon"

私にとって、それはList<Polygon>. さて、何Polygonですか?まあ、それは明らかにList<Coordinate>. Coordinate最後に、aは 2 つの要素を持つリストであることがわかります。

結論として、 がありList<List<List<double>>>ます。配列の深さは既知です。

class Location {
    private double _lat;
    private double _long;

    public Location(double lat, double long) { _lat = lat; _long = long }

    public static Location fromJSONArray(JSONArray json) {
        int n = json.length();
        if(n != 2) throw new IllegalArgumentException('json');

        return new Location(json.getDouble(0), json.getDouble(1));
    }
}
class Polygon : List<Location> {
    public static Polygon fromJSONArray(JSONArray json) {
        int n = json.length();
        Polygon p = new Polygon();
        for(int i = 0; i < n; i++) {
            p.add(Location.fromJSONArray(json.getJSONArray(i)));
        }
        return polygon;
    }
}

private List<Polygon> parseLists(JSONArray nestedList) throws JSONException
{
    List<Polygon> polygons = new ArrayList<Polygon>();
    int n = json.length();
    for(int i = 0; i < n; i++) {
        polygons.add(Polygon.fromJSONArray(json.getJSONArray(i)));
    }
    return polygons;
}
于 2012-09-01T14:22:50.033 に答える
0

次のコードは、 JSON Java ライブラリ(jar はここからダウンロードできます)resultantArrayを使用して、任意の深度の緯度と経度の値を に再帰的に抽出します。

public void run() throws JSONException
{
    JSONArray nestedList =
        new JSONArray("[" + "[ 1, 2 ]," + "[ [ 1, 2 ], [ 1, 2 ], [ 1, 2 ] ]," + "[ 3, 4 ],"
            + "[ [ [ [ 1, 2 ], [ 2, 3 ], [ 3, 4 ] ], [ 1, 2 ], [ 1, 2 ], [ 1, 2 ] ] ] ]");
    parseLists(nestedList);
}

private void parseLists(JSONArray nestedList) throws JSONException
{
    List<Location> resultantArray = new ArrayList<Location>();
    parseNestedList(nestedList, resultantArray);
    System.out.println(resultantArray.size());
}

private void parseNestedList(JSONArray json, List<Location> resultantArray) throws JSONException
{
    int elementCount = json.length();
    if (elementCount <= 0)
    {
        return;
    }
    if (json.get(0) instanceof JSONArray)
    {
        for (int i = 0; i < elementCount; i++)
        {
            parseNestedList((JSONArray) json.get(i), resultantArray);
        }
    }
    else
    {
        resultantArray.add(new Location(Double.parseDouble(json.get(0).toString()), Double.parseDouble(json
            .get(1)
            .toString())));
    }
}

それが完了したら、アルゴリズムを実行して、 のエントリresultantArrayをポイントとして考慮してポリゴンを識別する必要があります。

于 2012-09-01T13:16:24.507 に答える
0

JSON を解析しようとしている言語。理論的には、この考え方はほとんどの言語に適用できます。そのjavascriptが使用できる場合

  for(var key in myJSONObjectVariable){
       var current = myJSONObjectVariable[key];
       //Have some logic or inner loops taking place on current
  }

ただし、JSON データがどれほど予測不可能かによっては、あなたが正しいかもしれないと思います。ただし、文字列の解析が有効な場合があります

于 2012-09-01T13:04:25.360 に答える
0

ここには複数の問題があるため、まず問題をいくつかのステップに分解することをお勧めします。

ステップ 1、ネストのどこかにある個別のリストに何らかの方法でアクセスする必要があります。

使用しているプログラミング言語については言及していないため、その問題に対する答えはさまざまです。これを JavaScript で直接実行している場合、個別のリストへのアクセスは単純なデータ アクセスです。

geometry.coordinates[0][1]

またはリストの Java マップとして (null の戻り値や無効な配列インデックスのエラー チェックはありません。例にすぎません)

geometry.get("coordinates").get(0).get(1)      

Java や C++ などを使用している場合は、JSON ライブラリを使用して、データを言語に適した構造 (ベクトルのマップなど) に変換する方が簡単な場合があります。JSON 文字列を直接操作しようとはしません。

次に、言語に適した方法でデータ コンテンツを取得できるようになったら、手順 2 で、取得した内容をルールに照らして評価し、取得したデータの種類を判断します。

于 2012-09-01T13:12:28.970 に答える