java 的地理图表

2024-04-11

谁能推荐一个 Java 组件,它可以让您创建一个漂亮的世界地图图像,突出显示某些国家(基于一些统计数据)。与此图像类似的东西:

类似于 Google 地理图表(但适用于 Java):https://developers.google.com/chart/interactive/docs/gallery/geochart https://developers.google.com/chart/interactive/docs/gallery/geochart但在服务器端运行,无需互联网连接。理想情况下,我想重点关注一些国家,以便按比例突出显示它们。

无论是开源的还是商业的(只要不是价格高得离谱的东西)。


我找不到一个 java 库来完成你正在寻找的事情,所以我考虑采用 SVG 并修改其样式,然后将其转换为图像。对于这项任务,我首先想到的是:Apache Batik。

我选择使用开源 svg 地图维基媒体 http://upload.wikimedia.org/wikipedia/commons/0/03/BlankMap-World6.svg(类似于 Gregor Ophey 的回答)因为它没有做到,所以你不必担心许可,它也已经准备好按国家/地区进行简单的 CSS 修改。 (有关说明,请参阅 SVG 注释)。有一个问题,维基媒体上的一些图像是由一个Python脚本 http://law.nagoya-u.ac.jp/en/appendix/software/worldmap/,这也将 CSS 样式放入了元素中。如果您想使用这些 SVG 文件之一,则必须进行处理。

令我惊喜的是,有蜡染维基上几乎是一个完美的例子 http://wiki.apache.org/xmlgraphics-batik/ChangeCss,只需要进行一些调整。我能够通过一个小的语法更改(其输出文件名为 .jpg 但使用 png 转码器)和一个小的更改来生成修改后的图像 (png),以从项目资源而不是磁盘加载 svg。下面是示例代码,我进行了一些细微的更改:

public class MapMaker {

    private final static String MAP_FLAT = "BlankMap-World6-Equirectangular.svg";
    private final static String MAP_ROUND = "WorldMap.svg";

    public static void main(String... args) {

        try {
            // make a Document with the base map 
            String parser = XMLResourceDescriptor.getXMLParserClassName();
            SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
            Document doc = f.createDocument("http://example.com/stuff",
                    MapMaker.class.getClassLoader().getResourceAsStream(MAP_ROUND));

            // prepare to modify and transcode the document
            SVGDocument sdoc = (SVGDocument) doc;
            Element svgRoot = sdoc.getDocumentElement();
            PNGTranscoder t = new PNGTranscoder();
            TranscoderInput input = new TranscoderInput(doc);

            // find the existing stylesheet in the document
            NodeList stylesList = doc.getElementsByTagName("style");
            Node styleNode = stylesList.item(0);

            // append another stylesheet after the existing one
            SVGStyleElement style = (SVGStyleElement) doc.createElementNS(SVG_NAMESPACE_URI, "style");
            style.setAttributeNS(null, "type", "text/css");
            style.appendChild(doc.createCDATASection(".us {fill: blue;}"));
            styleNode.getParentNode().appendChild(style);

            // transcode the map
            OutputStream ostream = new FileOutputStream("outblue.jpg");
            TranscoderOutput output = new TranscoderOutput(ostream);
            t.transcode(input, output);
            ostream.close();

            // replace the appended stylesheet with another
            SVGStyleElement oldStyle = style;
            style = (SVGStyleElement) doc.createElementNS(SVG_NAMESPACE_URI, "style");
            style.setAttributeNS(null, "type", "text/css");
            style.appendChild(doc.createCDATASection(".us {fill: green;}"));
            styleNode.getParentNode().replaceChild(style, oldStyle);

            // transcode the revised map
            File outFile = new File(System.getProperty("java.io.tmpdir"), "outgreen.png");
            ostream = new FileOutputStream(outFile);
            output = new TranscoderOutput(ostream);
            t.transcode(input, output);
            ostream.close();
            System.out.println("Out File: " + outFile);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

正如我提到的,其工作方式是先将 CSS 添加到 SVG,然后再将其转换为所需的光栅图像。秘密酱汁是SVGStyleElement,这里可以看到美国变绿了。对于任何其他国家/地区,您只需使用其 2 个字母的二合字母并选择您想要填充的颜色即可。当然,由于它是 CSS,您还可以执行诸如更改边框颜色或使用背景图像而不是颜色之类的操作,因此您有很大的灵活性。

我确实需要稍微处理一下依赖项,所以为了让您克服这个障碍,我将包含我的 Maven 依赖项:

<dependencies>
    <dependency>
        <groupId>org.apache.xmlgraphics</groupId>
        <artifactId>batik-parser</artifactId>
        <version>1.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.xmlgraphics</groupId>
        <artifactId>batik-css</artifactId>
        <version>1.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.xmlgraphics</groupId>
        <artifactId>batik-svg-dom</artifactId>
        <version>1.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.xmlgraphics</groupId>
        <artifactId>batik-transcoder</artifactId>
        <version>1.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.xmlgraphics</groupId>
        <artifactId>batik-rasterizer</artifactId>
        <version>1.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.xmlgraphics</groupId>
        <artifactId>batik-codec</artifactId>
        <version>1.7</version>
    </dependency>
</dependencies>

如果您使用不同的构建管理器,请告诉我,我可以转储传递依赖树。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 的地理图表 的相关文章

随机推荐

  • 从 JSON 字符串中删除空数组成员

    我有一个 JSON 字符串 如下所示 我想以编程方式从中删除空数组对象 以便我可以将其转换为DataTable 这是我的 JSON 的示例 result id 1 name Temp property id 2 name Temp2 pro
  • iOS 7 完成处理程序永远不会被调用

    在以下代码中 没有任何完成处理程序被执行 我能找到的唯一解释是这样的使用 UIManagedDocument 的 Xcode 4 5 中的 iPhone Simulator 5 1 中的错误 https stackoverflow com
  • 将WPF窗口背景设置为资源字典画笔用户设置

    我在 ResourceDictionary 中声明了两个画笔 我希望用户选择他们想要在主窗口上看到的背景 资源词典画笔 x Key LightBlueMainWindow x Key DarkBlueMainWindow Window Ba
  • 使用curl下载时如何跳过已经存在的文件?

    我想要curl下载链接 但我希望它跳过已经存在的文件 现在 无论如何我的代码行都会继续覆盖它 curl url o home outputfile gt dev null 如何实现这一目标 您可以使用curl选项 C 此选项用于恢复中断的下
  • PDFsharp 与 MigraDoc 支持 HTML 语法吗?

    PDFsharp 与 MigraDoc 支持 HTML 语法吗 a strong etc 如果是的话 我该如何在文档中实现它 不 它不直接支持 HTML 您必须编写一段代码来读取 HTML 并使用 MigraDoc 或 PdfSharp 创
  • 以最少的磁盘空间开销进行版本控制

    我一直在考虑使用像 SVN 这样的版本控制系统作为我使用的几台 PC 之间的通用备份和同步工具 这适用于各种数据 包括 MP3 和翻录 DVD 大量数据 120GB 我的主要问题是 SVN 创建每个版本化文件的副本 svn目录 虽然我可以看
  • 如何使用List.fold_left?

    我仍在尝试了解如何fold left完全有效 它是否像这样迭代列表List iter 或者我的代码还有其他问题吗 我认为 e 是列表中的元素 所以它是一个元组 并且fst e获取元组的第一个元素并且snd e获取元组中的第二个元素 let
  • 如何将 JToken 转换为 string[]?

    我正在尝试将 JObject 中的数组读取到 string 中 但我不知道如何操作 代码非常简单 如下所示 但不起作用 失败并出现错误无法将 JToken 转换为 string JObject Items jsonSerializer De
  • NiFi:ExtractText 中的正则表达式获取 CSV 标头而不是数据

    我正在开发一个获取 CSV 文件的流程 我想根据 CSV 记录中的第一个字段将记录放入不同的目录中 例如 CSV 文件看起来像这样 country firstname lastname ssn mob num US xxxx xxxxx x
  • 如何使用其内容识别图像文件格式?

    如果图像文件的格式为 png那么它将包含 PNG 位于文件的开头 当读入Text mode 如果图像文件的格式为 bmp那么它将包含BM 位于文件的开头 当读入Text mode 我知道图像格式在文件开头包含一定大小 字节 的文本 数据 这
  • 无法安装kivy。为 kivy 构建轮子失败 (pyproject.toml)

    我不知何故搞砸了我的 pip 或我的 kivy 文件 我的也安装不了我试过了pip install kivy并且git clone https github com kivymd KivyMD git depth 1 我使用的是 macos
  • 实时工作流程的自定义工作流程活动中缺少跟踪日志

    我已经针对 CRM 2013 编写了一个自定义工作流活动 您不需要了解它的作用 我遇到的问题是 尽管实例化了ITracingService 我使用生成的任何跟踪内容Trace 方法在运行时被混淆仅适用于实时工作流程 换句话说 如果我异步运行
  • 如何从线性渐变中获取当前颜色?

    我有一个搜索栏 其值范围为 1 到 10 THUMB 停止在 1 2 3 4 5 10 如果 SeekBar 是线性渐变 则背景颜色 颜色从红色开始 然后是黄色 最后是绿色 如何获取拇指所在位置的当前颜色 pskink的建议 https s
  • OAuth 2 承载授权标头

    随着客户端 API 的更新 HTTPBasicAuthication 方法已替换为 OAuth2Bearer授权标头 使用旧的 API 我会执行以下操作 NSURLCredential credential NSURLCredential
  • 让 R 停止正在运行的 EC2 机器

    我有一些工作流程 我希望 R 在完成脚本后停止正在运行的 Linux 机器 我可以想到两种类似的方法来做到这一点 以 root 身份运行 R 然后调用system halt 从 root shell 脚本运行 R 可以以任何用户身份运行 R
  • 指数时间复杂度的真实示例

    我正在寻找一个直观的 现实世界的问题示例 该问题需要 最坏情况 指数时间复杂度来解决我正在做的演讲 以下是我提出的其他时间复杂度的示例 其中许多取自这个问题 https stackoverflow com questions 1592649
  • 检查表单是否已提交 - PHP

    检查表单是否已提交以确定是否应该将表单的变量传递给我的验证类的最佳方法是什么 首先我想也许 isset POST 但这总是会返回 true 因为超全局变量在任何地方都被定义 我不想使用以下方式迭代表单的每个元素 if isset POST
  • 如何重现错误“由于暂停纯视频背景媒体以节省电量,播放()请求被中断”?

    介绍 作为我项目的一部分 我有一个接收视频流的播放器 我希望它在流开始和结束时自动播放和自动停止 因此我引入了一个检查来查看流是否处于活动状态并在每种情况下启动和 或停止播放器 这是一个企业网站 有时有多达 3000 名用户同时观看视频流
  • PyTorch 教程错误训练分类器

    我刚刚开始 PyTorch 教程使用 PyTorch 进行深度学习 60 分钟闪电战我应该补充一点 我之前没有编写过任何 python 但其他语言 如 Java 现在 我的代码看起来像 import torch import torchvi
  • java 的地理图表

    谁能推荐一个 Java 组件 它可以让您创建一个漂亮的世界地图图像 突出显示某些国家 基于一些统计数据 与此图像类似的东西 类似于 Google 地理图表 但适用于 Java https developers google com char