我目前正在为一个学校项目开发一个带有XNA / Silverlight的Windows手机的c#应用程序。 我已经能够从设备获取坐标。 但我不想要坐标,我想知道他们所在的国家。 我找到了一些能够将坐标转换为国家的网站: http://maps.google.com/maps/geo?q=47.645,122.141&output=csv&sensor=false 但我不希望用户上网向他展示,我想在我的应用程序中构建它。 那么如何在TextBlock上的应用程序中显示国家/地区?
由于
答案 0 :(得分:1)
下载高分辨率地图,将每个国家/地区绘制成不同的颜色,并在查找表中将这些颜色分配给各自的国家/地区。确保将地图另存为位图 - 压缩格式会扭曲国家/地区边缘的颜色。
要获取国家/地区名称,请执行以下步骤:
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。
基本上,它会解析an kml file(我使用this geocommons map),并使用point in polygon answer on 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文件。此外,此特定地图的分辨率不是很高,如果你看海岸线就可以看到很多半岛和岛屿都没有被多边形所包围,所以在这些地方可能会有一些错误区域。领海也没有标记。我只能建议您寻找更好的地图或制作自己的如果这会造成重大问题。