java地图显示如何解决_java – 读取,表示和渲染地图数据的最好方法是什么?

首先,我建议您使用

2008 TIGER files.

第二,正如其他人指出,现在有很多项目已经被读入,解读,转换和使用这些数据.为此数据构建自己的解析器几乎是微不足道的,所以没有理由经历另一个项目的代码,并尝试提取你需要的,除非你计划使用他们的项目作为一个整体.

如果要从较低层次开始

解析

构建您自己的TIGER解析器(相当简单 – 只是一个数组的线段),并在其上构建一个简单的渲染(线,多边形,字母/名称)也将是相当容易的.您将需要查看各种map projection types的渲染阶段.最常用的(因此最熟悉的用户)是Mercator projection – 它相当简单和快速.你可能想要支持其他预测.

这将在查看如何投影地图方面提供一些“乐趣”,以及如何扭转投影(例如用户点击地图,您想要看到他们点击的纬度/纬度)需要反转当前投影方程).

渲染

当我开发我的渲染器时,我决定将我的窗口固定在一个固定的大小(嵌入式设备)和一个固定的放大倍数.这意味着我可以把地图放在一个纬度/左边,中心像素=中心纬度/ lon在给定的放大倍数,给定的Mercator投影我可以计算出哪个像素表示每个纬度/ lon,反之亦然.

一些程序代替允许窗口变化,而不是使用放大和固定点,它们使用两个固定点(通常是定义窗口的矩形的左上角和右下角).在这种情况下,确定像素到lat / lon传输变得微不足道 – 这只是几个插值计算.旋转和缩放使得此传输功能更复杂一点,但不应该相当大 – 它仍然是一个带插值的矩形窗口,但是窗口角不需要相对于北方的任何特定方向.这增加了一些角落(例如,你可以把地图翻出来,看起来就像从地球里面看),但是这些都不是繁重的,可以在你处理的时候处理.

一旦完成了像素传输的渲染,渲染线和多边形就相当简单,除了正常的图形问题(如线条或多边形的边缘不正确地重叠,反锯齿等).但是渲染一个基本的丑陋的地图,比如许多开放源代码渲染器所做的很简单.

你也可以玩距离和大圆计算 – 例如一个很好的经验法则是赤道每一度的纬度或大约为111.1KM – 但随着你接近两极,一个变化另一方继续保持在111.1kM.

存储和结构

然而,如何存储和参考数据,在很大程度上取决于您打算做什么.如果您希望使用相同的数据库结构进行人口统计学和路由选择,则会出现很多困难的问题 – 给定的数据库结构和索引将快速为一个,而另一个缓慢.

使用邮政编码并仅加载附近的邮政编码适用于小型地图绘制项目,但如果您需要在全国各地的路线,则需要不同的结构.一些实现具有“覆盖”数据库,其仅包含主要道路并且捕捉到覆盖的路由(或者通过多个覆盖 – 本地,地铁,县,州,州).这导致快速但有时低效的路由.

平铺

平铺你的地图其实并不容易.在较低的放大倍率下,您可以渲染整个地图并将其切割.在更高的放大倍率下,您无法一次渲染整个事物(由于内存/空间限制),因此您必须将其分片.

在瓦片的边界处切割线,以便您可以渲染单独的瓦片导致不太完美的结果 – 通常完成的是将线条渲染超过平铺边界(或者,至少线段的数据被保留,尽管渲染停止一次发现它脱离了边缘) – 这减少了错误发生在线条看起来像他们不太匹配,因为他们穿过瓦片.

当您处理此问题时,您会看到我在说什么.

找到进入给定瓦片的数据也不是微不足道的 – 一条线可能在给定瓦片外面的两端,但穿过瓦片.您需要咨询有关这方面的图书(Michael Abrash’s book is the seminal reference,现在可以在上述链接中免费获得).虽然它主要涉及游戏,但窗口,剪辑,多边形边缘,碰撞等都适用于此.

但是,您可能想要在较高级别玩.

一旦你完成了上述工作(通过调整一个现有的项目,或者自己做这些),你可能想玩其他的场景和算法.

反向地理编码相当容易.输入纬度(或点击地图)并获取最近的地址.这将教您如何解读TIGER数据中线段的地址.

基本的地理编码是一个难题.写一个地址解析器是一个有用和有趣的项目,然后使用TIGER数据将其转换成lat / lon是不平凡的,但很有趣.通过要求准确的名称和格式匹配,开始简单小巧,然后开始研究“喜欢”匹配和语音匹配.在这方面有很多研究 – 在这里查看搜索引擎项目的一些帮助.

找到两点之间的最短路径是一个不平凡的问题.有很多很多算法,大部分都是专利的.我建议,如果您尝试使用自己设计的简单算法,然后进行一些研究,并将您的设计与现有技术进行比较.如果你使用图论,这很有趣

遵循道路和先发制人的指示并不像初次脸红那样简单.给定一组具有相关联的拉普/朗布对数组的指令,使用外部输入(GPS或模拟GPS)跟踪路由,并开发出一种在接近每个实际交叉点时给用户指令的算法.请注意,由于道路弯曲等原因,有更多的拉/双配对,因此您需要检测出旅行方向等等.在您尝试实施之前,您将看不到许多角落案例.

兴趣点搜索.这是一个有趣的事情 – 你需要找到当前的位置,所有兴趣点(不是TIGER的一部分,使自己或获得另一个来源)在一定距离内(如乌鸦飞行,或更难驾驶的距离)起源.这一点很有趣,因为您必须将POI数据库转换为在这种情况下易于搜索的格式.你不能花时间去完成数百万条目,做距离计算(sqrt(x ^ 2 y ^ 2)),并返回结果.您需要使用一些方法或算法来先减少数据量.

旅行推销员.路由与多个目的地.只是一个更难的版本的常规路由.

您可以找到许多项目的链接和关于此主题的信息来源here.

祝你好运,不管你做什么,无论多么基本,丑陋,所以别人都可以受益!

-亚当


版权声明:本文为weixin_33664191原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。