問題タブ [geohashing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
elasticsearch - Kibana 3 GeoJSON vs Kibana4 Geohash
Kibana 4 beta2 をテストしていたときに、kibana3 のインデックスでタイルマップを使用できないことに気付きました。
Kibana3 では、Long,Lat (GeoJson) を含む配列を使用して、「Bettermap」にポイントを配置できます。
現在、Kibana4 は Elasticsearch の geohash を使用しています。
kibana4 で geojson を使用する方法を知っている人はいますか? geojson から geohash を取得することは可能ですか?
mysql - SQL とノードを使用した空間インデックス作成
SQL データベースに保存される多くの POI (Point of Interest) を使用して Node.js を開始しようとしています。
SQL と Node.js を使用して簡単に近接検索 (特定の範囲内の特定のポイントの近くにあるすべての POI を見つける) を行う方法はありますか? ORM に geohash アルゴリズム + 本棚を使用したいのですが、開始方法を説明するドキュメントがインターネット上に見つかりません。
Mongodb には地理空間インデックスがあります。同じことをしたいのですが、SQLを使用します。
どんな助けでも大歓迎です
php - 大規模なレコード セットでの場所/近接検索
何百万ものレコードを持つ可能性のあるユーザーを表すデータベース テーブルがあるとします (希望的観測)。このテーブルには、ユーザーの場所に関する情報を含む、各ユーザーに関するさまざまな情報が含まれています。
- 街
- 郡/州など
- 国
- 緯度
- 経度
- 緯度/経度の値に基づくジオハッシュ。
ログインしたユーザーが近くにいる他のユーザーを検索できる機能を実装したいと思います。
理想的には、ユーザーに地理的に最も近い 20 人のユーザーを取得し、次の 20 人、次の 20 人などを取得したいと考えています。したがって、基本的に、特定のポイントからの距離でユーザー テーブルを注文できるようにしたいと考えています。 .
アプローチ1
私は、ある点と他の数百点の間の距離を計算するために使用した hasersine 式の以前の経験があります。このアプローチは、比較的小さなレコード セットでは理想的ですが、そのような大規模なレコード セットでは信じられないほど遅くなることが懸念されます。
アプローチ 2
さらに、ジオハッシュについていくつかの調査を行い、ハッシュがどのように計算されるかを理解し、それが場所を表す方法と、解像度が短いと精度が失われる方法の背後にある理論を理解しました。もちろん、geohash の開始点が似ているユーザーを取得することで、ユーザーの地理的エリアの近くにいるユーザーを取得できます (指定した精度に基づいて、近隣の地域を調べる可能性があります)。しかし、それでは問題は解決しません。場所ごとに並べ替える必要があります。このアプローチは、2 人のユーザーが互いに非常に近くにいる可能性があるが、geohash で表される 2 つの領域の端に近いエッジ ケースにも適していません。
アプローチに対するアイデア/提案は大歓迎です。特にコードを探しているわけではありませんが、良い例やリソースへのリンクは役に立ちます。
ありがとう、ジョナサン
編集
アプローチ 3
しばらく考えた後、考慮すべき別の潜在的な解決策を思いつきました。各ユーザーの位置情報を受け取ると、その位置に関する情報 (町/都市、地域、国、緯度、経度、ジオハッシュなど) を別のテーブル (たとえばlocations
) に格納します。次に、外部キーによってユーザーをその場所に接続します。これにより、作業するデータセットがはるかに小さくなります。近くのユーザーを見つけるには、ユーザーの場所に近い他の場所を見つけて、その ID を使用して他のユーザーを見つけることができます。おそらく、各場所の近くの場所 ID のリストを保存することで、何らかのキャッシングを実装できます。
cassandra - カサンドラで複数のクラスタリング列を持つことの主な欠点はありますか?
geohash で行を取得できるようにする必要がある cassandra テーブルを設計しています。機能するものがありますが、現在できる以上に範囲クエリを避けたいと思います。
現在のテーブル スキーマはこれで、geo_key には geohash 文字列の最初の 5 文字が含まれています。geo_key を使用してクエリを実行し、完全な geohash で範囲フィルターを使用して、5 つ以上の長さの geohash に基づいてプレフィックス検索を実行できるようにします。
私の考えは、代わりにジオハッシュの文字を個別の列として保存し、必要な数の文字を指定して、ジオハッシュでプレフィックスマッチを実行できるようにすることです。私の懸念は、複数のクラスタリング列を使用した場合の影響です。
(パーティションキーのカーディナリティについてはあまり心配していません-g1には最小30の値があり、他の回避策もあります)
パーティション キーのカーディナリティと追加のストレージ要件以外に、多数のクラスター列のアプローチを使用した場合、何に注意する必要がありますか?
elasticsearch - Javaクラスを使用してElasticsearchでgeohashでgeo_pointを使用する方法は?
次のような Java クラスがあります (GeoPoint は Elasticsearch タイプです)。
私が使用する Elasticsearch マッピングは次のとおりです。
インデックスを作成しようとすると、次の例外が発生します。
org.elasticsearch.ElasticsearchParseException: フィールドは緯度/経度またはジオハッシュのいずれかでなければなりません
GeoUtils クラスの 381 行目から例外がスローされます。GeoPoint プロパティと同様に、マッピング クラスの Double lat フィールドと lon フィールドのチェックの直後に発生します。
ElasticSearch のドキュメントで提案されているように、geoPoint のフィールド タイプを geo_point に設定したのに、なぜ機能しないのかわかりません。
更新 1
Java クラス。
索引付けするメソッド。
ここで、R は別のクラス (この場合は UserLocation クラス) 用に実装されたジェネリック型の 1 つであり、次のようにシリアル化されます。
更新 2
現在、Java クラス構造は正常に機能しています。
}
しかし今、私は別の質問があります。
文書を取得する場合。
GET /ユーザー/場所/40
geohash には 12 文字ありますが、マッピングでは geohash の精度は 7 に設定されています...
GET /ユーザー/場所/_mapping
これは動作がおかしいということでしょうか?
更新 3
現在のクラス。
そのマッピング。
検索します。
距離別(正常に動作します)。
GET /ユーザー/場所/_search
geohash による (「geohash_precision: 7」でマッピングされているため、7 を超える精度は無視されます)。
GET /ユーザー/場所/_search
結論
org.elasticsearch.common.geo.GeoHashUtils.GeoPoint クラスが実際の Elastic バージョンと互換性がない理由がわかりません。
しかし、@jkbkot によって提供されたトラックに従って、完全な互換性を得るために、独自の GeoPoint および Location クラスを実装することを決定しました。
swift - パブリック クラスをテストするときの未解決の識別子の使用
Xcode がテスト対象のメイン クラスを認識しないため、クラスをユニット化できません。
私の迅速なモジュールはパブリックとして定義されています
しかし、私のテストターゲットの下では、シンボルが見えません。
私のテストターゲットには Geohash.swift が含まれていません
プロジェクトは https://github.com/maximveksler/GeohashKit/blob/master/GeohashKitTests/GeohashTests.swift#L13にあります。
elasticsearch - エラスティック検索でジオハッシュが生成されない
次のようにインデックスを作成しました。
正常に動作し、インデックスが作成されます。
1 つのサンプル ドキュメントを次のように入力しました。
これもうまくいきます。ここでは、ElasticSearch が使用できる geohash フィールド/エントリを生成することを期待しています。
しかし、クエリを実行すると、次のようになります。
u10hbp
クエリ結果のどこかにあるようなジオハッシュ文字列を期待しています。これを使用して、将来の位置点をクエリできます。または、geohash + ES の私の概念が台無しですか?? ヘルプ!!
elasticsearch - ジオポイントで Kibana4 タイル マップを使用する
Logstash を使用して、ElasticSearch に送られるlocation
ログに属性を挿入しています。
次に、マッピングを設定して、ElasticSearch にGeo-Pointであることを伝えます。この呼び出しがどのように見えるべきか正確にはわかりません。これは私がこれまで使ってきたものです:
Kibana 4 で一致するレコードを照会すると、location
フィールドに小さな地球の注釈が付けられます。ここまでは順調ですね。
タイル マップ ビジュアライゼーションに移動し、一致するレコードを表示し、地理座標でバケット化し、[Geohash
集計] ドロップダウンから選択location
し、Field
ドロップダウンから選択して [適用] を押しても、結果が返されません。
リクエストの集計部分は次のようになります。
そして応答:
Geo-Point マッピングが認識されているように見えますが、何らかの理由で ElasticSearch が結果を返していません。ここからトラブルシューティングする方法のヒントはありますか?