generate_tiles.pyを使用してタイルを作成しようとしていますが、スクリプトを実行するたびに、次のエラーが発生します。
スレッドThread-2の例外:トレースバック(最後の最後の呼び出し):ファイル "/usr/lib/python2.7/threading.py"、行552、__ bootstrap_inner self.run()ファイル "/ usr / lib/python2。 7 / threading.py "、行505、実行中self .__ target(* self .__ args、** self .__ kwargs)ファイル" render_tiles.py "、行114、ループ内self.render_tile(tile_uri、x、y、z )ファイル "render_tiles.py"、96行目、render_tile mapnik.render(self.m、im)MemoryError
これが私のスクリプトです。
#!/ usr / bin / python
数学からインポートpi、cos、sin、log、exp、atan
サブプロセスインポート呼び出しから
sys、osをインポートします
キューからインポートキュー
mapnikをインポートする
スレッドのインポート
ランダムにインポート
argparseをインポートします
custom_fonts_dir ='/ usr / share / fonts /'
mapnik.register_fonts(custom_fonts_dir)
DEG_TO_RAD = pi / 180
RAD_TO_DEG = 180 / pi
#生成するレンダリングスレッドのデフォルト数。使用可能なCPUコアの数とほぼ同じである必要があります。
NUM_THREADS = 4
def minmax(a、b、c):
a = max(a、b)
a = min(a、c)
を返す
クラスGoogleProjection:
def __init __(self、levels = 18):
self.Bc = []
self.Cc = []
self.zc = []
self.Ac = []
c = 256
range(0、levels)のdの場合:
e = c / 2;
self.Bc.append(c / 360.0)
self.Cc.append(c /(2 * pi))
self.zc.append((e、e))
self.Ac.append(c)
c * = 2
def fromLLtoPixel(self、ll、zoom):
d = self.zc [int(zoom)]
e = round(d [0] + float(ll [0])* self.Bc [zoom])
f = minmax(sin(DEG_TO_RAD * float(ll [1]))、-0.9999,0.9999)
g = round(d [1] + 0.5 * log((1 + f)/(1-f))*-self.Cc [zoom])
戻る(例)
def fromPixelToLL(self、px、zoom):
e = self.zc [zoom]
f =(px [0]-e [0])/ self.Bc [zoom]
g =(px [1] --e [1])/-self.Cc [zoom]
h = RAD_TO_DEG *(2 * atan(exp(g))-0.5 * pi)
return(f、h)
クラスRenderThread:
def __init __(self、tile_dir、mapfile、q、printLock、maxZoom):
self.tile_dir = tile_dir
self.q = q
self.m = mapnik.Map(256、256)
self.printLock = printLock
#スタイルXMLをロード
mapnik.load_map(self.m、mapfile)
#投影を取得する
self.prj = mapnik.Projection(self.m.srs)
#タイルピクセル座標とLatLongの間のプロジェクト(EPSG:4326)
self.tileproj = GoogleProjection(maxZoom + 1)
def render_tile(self、tile_uri、x、y、z):
#左下と右上のピクセル位置を計算します
p0 =(x * 256、(y + 1)* 256)
p1 =((x + 1)* 256、y * 256)
#LatLongに変換(EPSG:4326)
l0 = self.tileproj.fromPixelToLL(p0、z);
l1 = self.tileproj.fromPixelToLL(p1、z);
#地図投影法に変換する(例:メルカトルコーディネイトEPSG:900913)
c0 = self.prj.forward(mapnik.Coord(l0 [0]、l0 [1]))
c1 = self.prj.forward(mapnik.Coord(l1 [0]、l1 [1]))
#タイルのバウンディングボックス
hasattr(mapnik、'mapnik_version')およびmapnik.mapnik_version()> = 800の場合:
bbox = mapnik.Box2d(c0.x、c0.y、c1.x、c1.y)
そうしないと:
bbox = mapnik.Envelope(c0.x、c0.y、c1.x、c1.y)
render_size = 256
self.m.resize(render_size、render_size)
self.m.zoom_to_box(bbox)
self.m.buffer_size = 128
#デフォルトのAggレンダラーで画像をレンダリングする
im = mapnik.Image(render_size、render_size)
mapnik.render(self.m、im)
im.save(tile_uri、'png256')
def loop(self):
Trueの場合:
#キューからタイルを取得してレンダリングします
r = self.q.get()
if(r == None):
self.q.task_done()
壊す
そうしないと:
(名前、tile_uri、x、y、z)= r
存在する=""
os.path.isfile(tile_uri)の場合:
存在する="存在する"
そうしないと:
self.render_tile(tile_uri、x、y、z)
bytes = os.stat(tile_uri)[6]
empty =''
バイト==103の場合:
empty="空のタイル"
self.printLock.acquire()
印刷名、 ":"、z、x、y、存在、空
self.printLock.release()
self.q.task_done()
def render_tiles(bbox、mapfile、tile_dir、minZoom = 1、maxZoom = 18、name = "unknown"、num_threads = NUM_THREADS):
print "render_tiles("、bbox、mapfile、tile_dir、minZoom、maxZoom、name、 ")"
#レンダリングスレッドを起動する
queue = Queue(32)
printLock = threading.Lock()
レンダラー={}
範囲内のiの場合(num_threads):
レンダラー=RenderThread(tile_dir、mapfile、queue、printLock、maxZoom)
render_thread = threading.Thread(target = renderer.loop)
render_thread.start()
#print "開始されたレンダリングスレッド%s"%render_thread.getName()
renderers [i] = render_thread
os.path.isdir(tile_dir)でない場合:
os.mkdir(tile_dir)
gprj = GoogleProjection(maxZoom + 1)
ll0 =(bbox [0]、bbox [3])
ll1 =(bbox [2]、bbox [1])
範囲内のzの場合(minZoom、maxZoom + 1):
px0 = gprj.fromLLtoPixel(ll0、z)
px1 = gprj.fromLLtoPixel(ll1、z)
「fromlattolon」を印刷
#ディレクトリが配置されているかどうかを確認します
ズーム="%s"%z
os.path.isdir(tile_dir +ズーム)でない場合:
os.mkdir(tile_dir +ズーム)
範囲内のxの場合(int(px0 [0] /256.0),int(px1[0]/256.0)+1):
#x座標を検証する
if(x = 2 ** z):
継続する
#ディレクトリが配置されているかどうかを確認します
str_x = "%s"%x
そうでない場合os.path.isdir(tile_dir + Zoom +'/' + str_x):
os.mkdir(tile_dir+ズーム+'/' + str_x)
範囲内のyの場合(int(px0 [1] /256.0),int(px1[1]/256.0)+1):
#x座標を検証する
if(y = 2 ** z):
継続する
str_y = "%s"%y
tile_uri = tile_dir + Zoom +'/' + str_x +'/' + str_y +'.png'
#キューにレンダリングするタイルを送信する
t =(name、tile_uri、x、y、z)
queue.put(t)
#空のリクエストをキューに送信して、レンダリングスレッドに終了するように通知します
範囲内のiの場合(num_threads):
queue.put(なし)
#保留中のレンダリングジョブが完了するのを待つ
queue.join()
範囲内のiの場合(num_threads):
レンダラー[i].join()
__name__ == "__main__"の場合:
MIN_LON = '29.5732';
MAX_LON = '35.0360';
MIN_LAT ='-1.4840';
MAX_LAT = '4.2144';
bbox =(MIN_LON、MIN_LAT、MAX_LON、MAX_LAT)
style_file = "/ home / mossplix / projects / Dev / mapit / map / static / tilemill / uganda_districts.xml"
tile_dir = "/ home / mossplix / projects / UnicefDev / mapit / map / static / tiles /"
min_zoom = 7
max_zoom = 14
render_tiles(bbox、style_file、tile_dir、min_zoom、max_zoom)
これがmapnik設定ファイル mapnikconfig で、これが シェープファイルです。私はソースからmapnikをコンパイルしたので、それは良いはずです。何が問題なのか?