2

次の形式の座標を含むテキスト ファイルがあります。

[-1.38795678, 54.90352965]
[-3.2115, 55.95530556] 
[0.00315428, 51.50285246]

各座標を繰り返し処理して、それがどのポリゴン(シェープファイル内の英国の郡)にあるかを確認できるようにしたいのですが、数字をトークン化して、次の行に沿ってコードを作成できるようにする方法がわかりません...

for line in coordinates:
    for poly in polygons:
        if points in polygons:
            print(polygons)
            break

        if points not in polygons:
            continue

現時点では文字列ですが、各線を 2 つの点で構成して、プログラムがそれらを多角形に配置できるようにしたいと考えています。

4

2 に答える 2

3

を使用して、文字列をタプルに変換できますliteral_eval

>>> from ast import literal_eval
>>> s = "[-1.38795678, 54.90352965], [-3.2115, 55.95530556], [0.00315428, 51.50285246]"
>>> seq = literal_eval(s)
>>> print seq[0][1]
54.90352965

編集:座標がコンマなしの別々の行にある場合、

from ast import literal_eval

s = """[-1.38795678, 54.90352965]
[-3.2115, 55.95530556]
[0.00315428, 51.50285246]"""

seq = [literal_eval(line) for line in s.split("\n")]
#or
seq = literal_eval(s.replace("\n", ","))
print seq[0][1]
于 2015-12-01T14:13:42.457 に答える
1

ast よりもかなり高速な正規表現を使用することもできます。

import re
with open("in.txt") as f:
    r = re.compile("[-]?\d+\.\d+")
    data = [list(map(float, r.findall(line))) for line in f]

いくつかのタイミング:

In [14]: %%timeit
with open("test.txt") as f:
    data = [literal_eval(line) for line in f]
   ....: 
100 loops, best of 3: 2.01 ms per loop

In [15]: %%timeit
with open("test.txt") as f:
    r = re.compile("[-]\d+\.\d+")
    data = [list(map(float, r.findall(line))) for line in f]
   ....: 
1000 loops, best of 3: 403 µs per loop

 with open("test.txt") as f:
    r = re.compile("[-]?\d+\.\d+")
    data = [list(map(float, r.findall(line))) for line in f]
   ....:     

In [38]: with open("test.txt") as f:
           data2 = [literal_eval(line) for line in f]
   ....:     

In [39]: data == data2
Out[39]: True

剥ぎ取って分割するだけで、再び高速になります。

In [40]: %%timeit
   ....: with open("test.txt") as f:
   ....:     data = [list(map(float, line.strip("[]\n").split(","))) for line in f]
   ....: 
1000 loops, best of 3: 249 µs per loop
于 2015-12-01T14:52:33.227 に答える