0

私はGISのようなアプリに取り組んでおり、Gtkウィンドウに(2d)地図作成マップを描画する必要があります。PROJ.4から座標(すでに標準のx、y形式に変換されています)を取得します。

すべての点は座標として非常に大きな数を持っています。たとえば、一般的なポイントは次のように説明できます。

x =820787.12345..。

y = 3937564.12345 .. ..

この領域はまだ大きすぎてGTKウィンドウに描画できません(最大解像度:1366 * 768)!

それで、私は単純で愚かな質問があります:地図を描く前に地図作成地図のサイズを首尾一貫して拡大縮小して、地図がデフォルトの描画領域に完全に表示されるようにする(精度を失うことなく)標準的な方法はありますか?

はい、ポイントを結合する前に、まず各座標を定数で割ることができることを私は知っています。しかし、この「生の」方法は(もちろん私には)ずさんで不正確に見えます。

問題を解決できれば、他のユーザーと共有するためのデモを作成することを約束します。

ありがとう

それ

4

2 に答える 2

1

私が正しいかどうかはわかりませんが、gtk_windowsでの描画にはcairoを使用しています。カイロを使用している場合、これは役立つ場合があります。

// save cairo to simply restore old scale_map
cairo_save(cr);

// move cairo center to your zero pos of your graph
cairo_translate(cr, x_zero_pos, y_zero_pos);

// scale on max bounds <--- this is what you are looking for
cairo_scale(cr, graph_width / max_x_amplitude,
               -graph_height / max_y_amplitude);

// now you can draw your line with real values
cairo_line....s.o

//restore your cairo. otherwise the linewidth will be depending on the scale
cairo_restore(cr);

// finally paint
cairo_set_line_width(cr, linewidth);
cairo_stroke(cr);
于 2013-03-27T10:16:58.840 に答える
0

まずはありがとうございました!私はあなたの提案のおかげで私の問題を解決しました。

以下に、単純な_self_taining_デモアプリケーションを示します。

import gtk
from gtk import gdk

class Canvas(gtk.DrawingArea):

    # the list of points is passed as argument

    def __init__(self, points):
        super(Canvas, self).__init__()
        self.points = points

        # Canvas is 800*500 only!

        self.set_size_request(800, 500)
        self.scaleFactor = 0.0
        self.connect("expose_event", self.expose)

    # Method to paint polygons and lines on screen

    def expose(self, widget, event):
        rect = widget.get_allocation()
        w = rect.width
        h = rect.height

        # Calculation of the coordinates limits

        xMax = max([c[0] for c in self.points])
        yMax = max([c[1] for c in self.points])
        xMin = min([c[0] for c in self.points])
        yMin = min([c[1] for c in self.points])

        # Calculation of the size of the bounding box

        maxRectWidth = xMax - xMin
        maxRectHeigth = yMax - yMin

        # Scale factor calculation

        width_ratio = float(w) / maxRectWidth
        height_ratio = float(h) / maxRectHeigth
        self.scaleFactor = min(height_ratio, width_ratio)

        # Create Cairo Context object

        ctx = widget.window.cairo_create()

        # Set colour and line width

        ctx.set_line_width(7)
        ctx.set_source_rgb(255, 0, 0)
        ctx.save()

        # CRITICAL LINE: the Cairo Context is moved and scaled here

        ctx.scale(self.scaleFactor, self.scaleFactor)
        ctx.translate(-xMin, -yMin)

        # Drawing of the lines

        for i in range(0, len(self.points)):
            currPoint = self.points[i]
            currX = float(currPoint[0])
            currY = float(currPoint[1])
            nextIndex = i + 1
            if (nextIndex == len(self.points)):
                continue
            nextPoint = self.points[nextIndex]
            nextX = float(nextPoint[0])
            nextY = float(nextPoint[1])
            ctx.move_to(currX, currY)
            ctx.line_to(nextX, nextY)
        ctx.restore()
        ctx.close_path()
        ctx.stroke()

# a list of single points with large _LARGE _coordinates

li1 = [(200000,200000), (400000,200000), (400000,400000), (200000,400000)]

window = gtk.Window()
canvas = Canvas(li1)
window.add(canvas)
window.show_all()
gtk.main()
于 2013-04-17T14:19:25.553 に答える