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