【问题标题】:Checking if vector object will be visible on print with given dpi and print size检查矢量对象在给定 dpi 和打印尺寸的打印上是否可见
【发布时间】:2010-01-12 22:50:18
【问题描述】:

我有一个文件(GIS 中使用的 *.shp),其中包含多边形的集合,也许还有其他矢量对象(但多边形对我来说最重要)。我需要删除不可打印的对象吧。

我不知道选择了什么标准。我认为删除边界长度小的对象会比删除面积小的对象更好(所以长的对象会减少到线)。但也许有专门的算法呢?

换句话说,我只想找到在给定缩放级别可见的对象。

【问题讨论】:

    标签: printing vector gis dpi raster-graphics


    【解决方案1】:

    这很简单。由于您没有提及任何语言,请考虑以下伪代码

    drawRect = myDevice.GetDrawRect();
    for(oneShape in allShapes)
    {
        shapeRect = oneShape.GetRect()
        if(! drawRect.Contains(shapeRect))
             oneShape.MarkAsInvisible(); 
        else
             oneShape.Draw();
    }
    

    Contains() 函数看起来像这样,假设 y 值从底部到顶部增加:

    bool Rect::Contains(OtherRect)
    
    {
        if(left   <=  OtherRect.right  &&
           right  >=  OtherRect.left   &&
           top    >=  OtherRect.bottom &&
           bottom <=  OtherRect.top)
           return true
    
        return false;
    }
    

    【讨论】:

    • 谢谢。但如果我理解正确,这段代码只会检查 oneShape 是否属于特定区域。我认为“换句话说”令人困惑。当然,您的代码对于实现我也想删除到小物体的蝙蝠很重要。例如,在低缩放级别我只想显示大陆,在更高级别我想显示引用。但是,我不想随意决定在给定缩放级别下可见的内容。因为如果有人以高分辨率打印它,他应该被允许以低缩放级别打印国家/地区(并且可能使用放大镜)。
    【解决方案2】:

    要消除的多边形取决于您要创建的图像的 dpi。如果一条线仅填充一个像素,则应将其消除或替换为点表示。当然,这将受到线宽的影响。使用mapnik.org等专用映射库可以解决很多此类问题

    【讨论】:

    • 这正是我所需要的。但我更喜欢使用 Geotools ( www.geotools.org ),因为我更喜欢 Java 而不是 C++。不幸的是,我不知道如何在 Geotools 中做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 2014-10-31
    • 2019-05-06
    • 2016-10-23
    • 2021-03-04
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多