これはどう。データベースに 3 つの列、つまり (緯度、経度、TextLocation) を格納しますが、テーブルのキーと見なされるのは (緯度、経度) のペアです。TextLocation は、指定された (緯度、経度) に対応するテキストをジオコーダーが要求されたときのリバース ジオコーダーからの最後の既知の結果です。
新しい位置 (New_Latitude、New_Longitude) が到着したら、データベースを検索して、データベース内の最も近い行をすべて見つけます。(New_Latitude, New_Longitude) から (Latitude, Longitude) までの距離を計算するには、次のコードを使用します
float LatDiff = New_Latitude - Latitude;
float LongDiff = New_Longitude - Longitude;
float CosNewLat = Math.cos(New_Latitude);
float ConversionFac = 6371000 * Math.PI / 180; // 6371000 is earth radius in metres
float Dist_metres = ConversionFac * Math.sqrt(LatDiff*LatDiff + LongDiff*LongDiff*CosNewLat*CosNewLat);
次に、(New_Latitude、New_Longitude) に最も近いポイントごとに、リバース ジオコーディングを使用してデータベースの TextLocation を更新します。新しい位置が現在のリバース ジオコーディングと一致しない既存の場所があれば、それをデータベースに追加します。
ここでの私の考えの一部は、テキストの列を含む 3 つの列を保存したとしても、データベースは最新のストレージ容量に比べてまだ小さいということです。