我目前正在为一个学校项目使用 XNA/Silverlight 为 Windows 手机开发 ac# 应用程序。我已经能够从设备获取坐标。但我不想要坐标,我想显示他们在哪个国家。我发现一些能够将坐标转换为国家的网站: http ://maps.google.com/maps/geo?q= 47.645,122.141&output=csv&sensor=false 但我不希望用户上网向他展示,我想在我的应用程序中构建它。那么如何在 TextBlock 上的应用程序中显示国家/地区?
谢谢
我目前正在为一个学校项目使用 XNA/Silverlight 为 Windows 手机开发 ac# 应用程序。我已经能够从设备获取坐标。但我不想要坐标,我想显示他们在哪个国家。我发现一些能够将坐标转换为国家的网站: http ://maps.google.com/maps/geo?q= 47.645,122.141&output=csv&sensor=false 但我不希望用户上网向他展示,我想在我的应用程序中构建它。那么如何在 TextBlock 上的应用程序中显示国家/地区?
谢谢
下载高分辨率地图,将每个国家/地区绘制成不同的颜色,然后在查找表中将这些颜色分配给各自的国家/地区。确保将地图保存为位图 - 压缩格式会扭曲国家边缘的颜色。
要获取国家/地区名称,请执行以下步骤:
1. Translate geocoordinates into map coordinates
2. Get the pixel at selected map coordinates
3. Get country name from the lookup by getting color data from the pixel
这个解决方案需要大量的手工工作,除非您已经准备好高分辨率彩色地图。
自然,分辨率越高越好。您还可以考虑绘制不同国家的领海以及国际水域(即返回大西洋)。
或者,正如 LB 所建议的,您可以获得国家的多边形,并使用多边形中的点命中测试算法来确定用户所在的国家。
我编写了一个简单的类来执行此操作:pastebin link。
基本上,它解析一个 kml 文件(我使用过这个 geocommons map),并使用在 stackoverflow 上的多边形答案中找到的代码来检测哪个国家在给定坐标上。
示例用法:
FileInfo kmlFile = new FileInfo("5603.kml");
String kmlString = "";
using (StreamReader sr = new StreamReader(kmlFile.OpenRead()))
{
kmlString = sr.ReadToEnd();
}
Kml kml = new Kml(kmlString);
String country = kml.GetCountryByCoordinates(18.26, 42.56);
这为我打印了克罗地亚,这是我实际所在的国家。代码是仓促拼凑的(尤其是 KML 解析部分),所以它可能有一些错误。你应该更多地测试它。
如果您需要美国的各个州,您可以尝试使用不同的 KML 文件。另外,这张地图的分辨率不是很高,如果你看海岸线,你会发现很多半岛和岛屿都没有被多边形包围,所以在这些区域可能会出现一些错误。领海也没有标记。我只能建议您寻找更好的地图或制作自己的地图,如果这会造成重大问题。