首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Mapnik上绘制点

在Mapnik上绘制点
EN

Stack Overflow用户
提问于 2013-07-31 22:38:57
回答 2查看 1.6K关注 0票数 1

我按照mapnik github wiki中的教程制作了一张世界地图:https://github.com/mapnik/mapnik/wiki/GettingStartedInPython

我修改了这个示例,现在已经将代码嵌入到Pyside Qt Widget中。我现在的问题是,如何使用x和y坐标,或纬度和经度点来绘制地图上的点?

下面是我用来生成地图并将其嵌入到小部件中的代码:

代码语言:javascript
复制
    import mapnik
    m = mapnik.Map(1200,600)
    m.background = mapnik.Color('steelblue')
    s = mapnik.Style()
    r = mapnik.Rule()
    polygon_symbolizer = mapnik.PolygonSymbolizer(mapnik.Color('#f2eff9'))
    r.symbols.append(polygon_symbolizer)
    line_symbolizer = mapnik.LineSymbolizer(mapnik.Color('rgb(50%,50%,50%)'),0.1)
    r.symbols.append(line_symbolizer)
    s.rules.append(r)
    m.append_style('My Style',s)
    ds = mapnik.Shapefile(file='/home/lee/shapefiles/ne_110m_admin_0_countries.shp')
    layer = mapnik.Layer('world')
    layer.datasource = ds
    layer.styles.append('My Style')
    m.layers.append(layer)
    m.zoom_all()


    im = mapnik.Image(1200,600)
    mapnik.render(m, im)

    qim = QImage()
    qim.loadFromData(QByteArray(im.tostring('png')))

    label = QLabel(self)

    label.setPixmap(QPixmap.fromImage(qim))

    self.layout.addWidget(label)
EN

回答 2

Stack Overflow用户

发布于 2015-05-29 02:25:07

通常,您会将地图连接到诸如PostGIS或SQLite数据库之类的数据源,并让mapnik填充来自所述数据库的点,类似于this。在python脚本中或从xml生成。

但是,在回答您的问题时,可以通过从WKT字符串创建新要素并将该要素添加到mapnik.MemoryDatasource()来绘制经度/经度点。

下面是使用找到的here地图文件的脚本的简单代码片段

首先,我们创建样式并将其添加到地图中:

代码语言:javascript
复制
s = mapnik.Style() # style object to hold rules
r = mapnik.Rule() # rule object to hold symbolizers
point_sym = mapnik.PointSymbolizer()
point_sym.filename = './symbols/airport.p.16.png' 
r.symbols.append(point_sym) # add the symbolizer to the rule object
s.rules.append(r) 
m.append_style('airport point', s)

现在,我们创建数据源并添加WKT格式的点几何图形:

代码语言:javascript
复制
ds = mapnik.MemoryDatasource()
f = mapnik.Feature(mapnik.Context(), 1)
f.add_geometries_from_wkt("POINT(-92.289595 34.746481)")
ds.add_feature(f)

现在我们必须创建一个新层,添加我们创建的样式,并将该层添加到我们的地图中:

代码语言:javascript
复制
player = mapnik.Layer('airport_layer')
#since our map is mercator but you wanted to add lat lon points 
#we must make sure our layer projection is set to lat lon
player.srs = longlat.params() 
player.datasource = ds
player.styles.append('airport point')
m.layers.append(player)
m.zoom_all()

您可以查看整个script here

票数 1
EN

Stack Overflow用户

发布于 2013-08-22 22:22:46

如果您需要从像素坐标获取地理坐标(例如:经度/经度),则可能需要添加您的转换函数。

Google Maps JS代码如下所示可能会有所帮助:https://developers.google.com/maps/documentation/javascript/examples/map-coordinates

代码语言:javascript
复制
var TILE_SIZE = 256;

function bound(value, opt_min, opt_max) {
  if (opt_min != null) value = Math.max(value, opt_min);
  if (opt_max != null) value = Math.min(value, opt_max);
  return value;
}

function degreesToRadians(deg) {
  return deg * (Math.PI / 180);
}

function radiansToDegrees(rad) {
  return rad / (Math.PI / 180);
}

/** @constructor */
function MercatorProjection() {
  this.pixelOrigin_ = new google.maps.Point(TILE_SIZE / 2,
      TILE_SIZE / 2);
  this.pixelsPerLonDegree_ = TILE_SIZE / 360;
  this.pixelsPerLonRadian_ = TILE_SIZE / (2 * Math.PI);
}

MercatorProjection.prototype.fromLatLngToPoint = function(latLng,
    opt_point) {
  var me = this;
  var point = opt_point || new google.maps.Point(0, 0);
  var origin = me.pixelOrigin_;

  point.x = origin.x + latLng.lng() * me.pixelsPerLonDegree_;

  // Truncating to 0.9999 effectively limits latitude to 89.189. This is
  // about a third of a tile past the edge of the world tile.
  var siny = bound(Math.sin(degreesToRadians(latLng.lat())), -0.9999,
      0.9999);
  point.y = origin.y + 0.5 * Math.log((1 + siny) / (1 - siny)) *
      -me.pixelsPerLonRadian_;
  return point;
};

MercatorProjection.prototype.fromPointToLatLng = function(point) {
  var me = this;
  var origin = me.pixelOrigin_;
  var lng = (point.x - origin.x) / me.pixelsPerLonDegree_;
  var latRadians = (point.y - origin.y) / -me.pixelsPerLonRadian_;
  var lat = radiansToDegrees(2 * Math.atan(Math.exp(latRadians)) -
      Math.PI / 2);
  return new google.maps.LatLng(lat, lng);
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17973421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档