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 的地理图表 的相关文章

  • 何时/为何使用/定义接口[重复]

    这个问题在这里已经有答案了 可能的重复 何时最好使用 java 中的接口 https stackoverflow com questions 2586389 when best to use an interface in java Hi
  • 多线程环境下如何更好的使用ExecutorService?

    我需要创建一个库 其中包含同步和异步方法 executeSynchronous 等待直到有结果 返回结果 executeAsynchronous 立即返回一个 Future 如果需要 可以在其他事情完成后进行处理 我的图书馆的核心逻辑 客户
  • 如何从 WifiP2pDeviceList 获取 wifi direct 设备名称

    我想在执行请求对等点时获取 wi fi direct 名称 这是我的代码 if WifiP2pManager WIFI P2P PEERS CHANGED ACTION equals action Log d tag success dis
  • 设置 SWT Shell 的默认字体

    有没有办法为整个 Shell 设置默认字体 以便任何新控件都将使用相同的字体 看来现在我必须为我创建的每个控件设置字体 这导致了太多的冗余 默认使用的字体由平台选择 请参阅中的其他信息 类字体 SWT 标准小部件工具包 http book
  • 如何测试调用父类的受保护(不需要的)方法的方法?

    我陷入了一个非常奇怪的情况 我有一些需要测试的特定代码 这里是 public class A The real method of real class is so big that I just don t want to test it
  • 使用除 SINGLE_TABLE 之外的任何其他 Hibernate 继承策略时 JVM 崩溃

    好吧 这可能不太可能 但还是这样吧 在Java JRE 1 6 0 26 b03 中我有两个类 SuperControl及其子类SubControl 它们都需要是持久对象 我正在使用 Hibernate Annotations 来实现这一点
  • 如何识别 Java 中的不可变对象

    在我的代码中 我正在创建一个对象集合 这些对象将由各种线程以只有在对象不可变的情况下才安全的方式访问 当尝试将新对象插入到我的集合中时 我想测试它是否是不可变的 如果不是 我将抛出异常 我能做的一件事是检查一些众所周知的不可变类型 priv
  • 如果基于 Spring 注解的控制器位于 jar 文件内,则该控制器无法工作

    我的子模块中有一些基于注释的控制器 这些模块作为 jar 文件部署 jar 文件中基于注释的控制器未加载到 spring 配置中 我使用 Eclipse 中的导出实用程序手动导出 jar 文件 有人遇到过这个问题吗 当您使用 Eclipse
  • 用 java 编写解释器时的 switch 或 if 语句

    当前的作业需要我编写一个程序 以一种非常微小且基本的编程语言 行为有点像 FORTRAN 来读取包含指令的文件并执行这些指令 基本上它是我猜的语言的简单解释器 它是完全线性的 所有语句都是按顺序定义的 并且只有字符串和整数变量 我需要查找和
  • 如何将自定义日志处理程序添加到 Google App Engine?

    我正在尝试向我的 java 应用程序添加自定义日志处理程序 我已经实现了一个扩展 java util Logging Handler 类的 InnerLogger 类 在我的logging properties中声明为处理程序 handle
  • Java 唤醒休眠线程

    我阅读了其他帖子 但没有找到我正在寻找的确切答案 所以我希望有人能给出一些澄清 我有一个将运行一段时间的程序 我有一些在后台运行的线程来执行各种任务 为了简单起见 让我们考虑 3 个线程 ThreadA每 10 秒执行一次任务 其中Thre
  • 以编程方式设置 Logback Appender 路径

    我正在尝试以编程方式设置 Logback 附加程序路径 滚动文件附加器 http logback qos ch apidocs ch qos logback core rolling RollingFileAppender html准确地说
  • Java 泛型:如何为泛型类型指定类类型?

    我有一个 POJO 指定为 MyClass u where U是泛型类型参数 我正在尝试编写一个接受类引用的实用方法Class u
  • 如何制作无限的jscrollpane?

    我之前已经实现过拖动滚动 但是创建无限滚动窗格的最佳方法是什么 当然不会有任何滚动条 我将实现拖动滚动 我想做的是在无限表面上实现动态加载 EDIT 当然 它实际上不会是无限的 我想问如何伪造它 您可以执行以下操作 AdjustmentCl
  • 在 eclipse 之外将 Spring MVC 应用程序部署到 tomcat 的幕后会发生什么?

    我猜想使用像 eclipse 这样很棒的 IDE 的一个缺点是你会忽略应用程序幕后发生的事情 我是一名 Ruby 开发人员 所以不是一名 Java 老手 所以我一直在用 java 编写一个项目 并使用 spring 框架进行 IOC 和 M
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • Java ConcurrentModificationException [重复]

    这个问题在这里已经有答案了 当删除倒数第二个元素时 没有 ConcurrentModificationException List
  • 从命令行运行 Maven 插件的语法是什么。

    我看到这里已经有人问过这个问题 如何从命令行执行maven插件 https stackoverflow com questions 12930656 how to execute maven plugin from command line
  • Integer.parseInt 引发的 NumberFormatException

    嘿 我在学校上编码课 但老师没有很好地解释 所以我们必须在网上查找我所做的信息 但我无法找到代码中的错误 你能帮我吗 char end s do System out println Tipo de boleto char boleto c

随机推荐

  • 从 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