2013-03-27 3 views
0

Я работаю над подобным GIS-приложением, и мне нужно нарисовать картографическую карту (2d) на окне Gtk. Получаем координаты - уже преобразованные в стандарт x, y формат - от PROJ.4.как масштабировать координаты карты, чтобы убедиться, что они полностью видны

Все точки имеют очень большое цифры как координаты. Например, как правило, точка может быть описана, как показано ниже:

х = +820787,12345 ...

у = +3937564,12345 ...

Эта область еще слишком большой, чтобы нарисовать в моем окне GTK (максимальное разрешение: *)!

Итак, у меня есть простой, глупого вопроса: есть ли стандартный метод когерентно масштаба размера картографической карты перед рисованием, чтобы убедиться, что моя карта полностью отображаются в разрисованном умолчанию области (без потери точности)?

Да, я знаю, что я просто мог бы сначала разделить каждую координату на константу, прежде чем присоединять точки; но этот «сырой» метод кажется (для меня, конечно) неаккуратным и неточным.

Если бы я мог решить свою проблему, я обещаю сделать демо, чтобы поделиться с другими пользователями.

Благодаря

IT

ответ

1

Не уверен, что, если я прав, но я использую Каир для рисования на gtk_windows. если вы используете Каир, это может быть полезно:

// 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); 
0

Прежде всего, большое спасибо! Я решил свои проблемы благодаря вашему предложению.

ниже вы можете увидеть простой _self_containing_ демонстрационное приложение:

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() 
Смежные вопросы