2

私は現在、学校のプロジェクト用にXNA / Silverlightを使用してWindowsPhone用のac#アプリケーションを開発しています。デバイスから座標を取得することができました。しかし、座標は必要ありません。どの国にあるかを示したいのです。座標を国に変換できるサイトをいくつか見つけました:http: //maps.google.com/maps/geo?q= 47.645,122.141&output = csv&sensor = false しかし、ユーザーにインターネットにアクセスして見せたくないので、アプリケーションにビルドしてもらいたいと思います。では、TextBlockのアプリケーションで国を表示するにはどうすればよいですか?

ありがとう

4

1 に答える 1

1

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

このソリューションでは、高解像度のカラーマップをすでに用意していない限り、多くの手作業が必要です。

当然、解像度が高いほど良いです。また、さまざまな国の領海や公海(つまり、大西洋に戻る)をペイントすることも検討してください。


2.国のポリゴン

または、LBが提案したように、国のポリゴンを取得し、ポリゴンヒットテストアルゴリズムのポイントを使用して、ユーザーがどの国にいるかを判断することもできます。

私はこれを行う簡単なクラスをプログラムしました:pastebinlink

基本的に、kmlファイルを解析し(私はこのジオコモンズマップを使用しました)、 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ファイルを使用してみてください。また、この特定の地図はあまり高解像度ではありません。海岸線を見ると、多くの半島や島がポリゴンで囲まれていないことがわかります。そのため、これらの領域ではエラーが発生する可能性があります。領海もマークされていません。これが重大な問題を引き起こす場合にのみ、より良いマップを探すか、独自のマップを作成することをお勧めします。

于 2012-11-01T11:50:57.070 に答える