座標境界クエリツール: AreaCity-Query-Geometry
このツールの中心的な機能: jts库
( 省市区县乡镇边界数据
AreaCity -JsSpider-StatsGov オープン ソース ライブラリ) またはgeojson边界数据
ファイルを使用して、メモリ使用量が少なく、優れたパフォーマンスで、任意の点、線、または面と交差するベクトル境界を見つけます。
GitHub アドレス: https://github.com/xiangyuecn/AreaCity-Query-Geometry
Gitee ミラー ライブラリ: https://gitee.com/xiangyuecn/AreaCity-Query-Geometry
主な特徴:
- 座標点に対応する都市情報を問い合わせます。
- ルートが通過するすべての都市をクエリします。
- ベクトル範囲がカバーするすべての都市をクエリします。
- 都市またはそれ以下のレベルのすべての境界データをクエリします (WKT 形式)。
- HTTP API サービスを介したクエリ呼び出しをサポートします。
- Java コードを介したクエリ呼び出しをサポートします。
- ソースコードはシンプルで、テストバットスクリプトを含む5つのファイルが含まれており、IDEなしで変更して実行でき、コピー後すぐに使用できます。
ファイルをプロジェクトにコピーして使用することもできます
AreaCityQuery.java
が、プロジェクトにインポートすると、プロジェクト内のすべての検索機能がjts库
使用できるようになります。AreaCityQuery
プロジェクト コード全体のクローンを作成し、ダブルクリックして编译和运行Test.java直接测试.bat
テストを直接実行することもできます。API とグラフィカル インターフェイス: このツールには HTTP API サービスが付属しており、テストを実行してメニューからこのサービスを開始すると、ブラウザ上でこれらのインターフェイスに直接アクセスできます。この API インターフェイスは、第 4 レベルで直接テストできます。 ECharts Mapとプレビューページを
自定义数据源
使用して呼び出しテストを実行すると、ページにはクエリされた境界グラフィックスがすぐに描画されます。
レンダリング:
HTTP API グラフィカル インターフェイス:
コンソールの実行:
パフォーマンステストデータ
テスト データ ソース: AreaCity-JsSpider-StatsGov オープン ソース ライブラリバージョン 2021.220321.220428からダウンロードされた ok_geo.csv ファイルは、州や都市に応じて異なる geojson ファイルにエクスポートされます。
テストでは、マルチスレッドを使用してランダムな座標点をクエリします (Test.java コンソールのメニュー 5 番) テスト マシンの構成: 8 コア 2.20 GHz CPU、SSD ハードディスク。
テスト 1: Init_StoreInWkbsFile のメモリ使用量が非常に低い (パフォーマンスは IO によって制限される)
情報元 | ファイルサイズ | データ量 | メモリ使用量 | 7コアQPS | シングルコアQPS | 単一のクエリに時間がかかる |
---|---|---|---|---|---|---|
州および市レベル 3 | 176MB | 3632 件のエントリー | 41MB | 6212 | 887 | 1.13ミリ秒 |
地区レベルのみ | 107MB | 3208 | 24MB | 13818 | 1974年 | 0.51ミリ秒 |
地方限定 | 20MB | 34 | 4MB | 19832年 | 2833 | 0.35ミリ秒 |
Init_StoreInWkbsFile
: 初期化には構造化データ ファイルにデータをロードするモードを使用します。初期化にはこの方法を使用することをお勧めします。境界グラフ データは構造化データ ファイルに保存され、メモリ使用量は非常に低くなります。クエリの際、対応するコンテンツは、ファイルは繰り返し読み取られ、クエリのパフォーマンスは主に IO に消費されますが、非常に高い IO パフォーマンスは大きな問題ではありません。
テスト 2: Init_StoreInMemory のメモリ使用量は json ファイルのメモリ使用量とほぼ同じです (パフォーマンスは無制限です)
情報元 | ファイルサイズ | データ量 | メモリ使用量 | 7コアQPS | シングルコアQPS | 単一のクエリに時間がかかる |
---|---|---|---|---|---|---|
州および市レベル 3 | 176MB | 3632 件のエントリー | 161MB | 77242 | 11034 | 0.091ミリ秒 |
地区レベルのみ | 107MB | 3208 | 96MB | 121228 | 17318 | 0.058ミリ秒 |
地方限定 | 20MB | 34 | 18MB | 465940 | 66562 | 0.015ミリ秒 |
Init_StoreInMemory
: データをメモリにロードするモードで初期化し、境界グラフ データはメモリに保存され、メモリ使用量は JSON データ ファイルとほぼ同じサイズで、クエリ パフォーマンスが非常に高く、さらにパフォーマンスが向上します。設定によりさらに改善されますが、メモリ使用量はAreaCityQuery.SetInitStoreInMemoryUseObject=true
1 倍に増加します。州および市区町村の 3 レベルのシングルコアは 15,000 QPS に達する可能性があります。
参考: データベースクエリテストの比較
情報元 | データ量 | クエリ座標 | 時間のかかる MySQL 単一クエリ | 時間のかかる SQL Server の単一クエリ |
---|---|---|---|---|
州および市レベル 3 | 3632 件のエントリー | 深セン龍華区 | 163ミリ秒 | 25ミリ秒 |
州および市レベル 3 | 3632 件のエントリー | 北京 - 房山区 | 173ミリ秒 | 47ミリ秒 |
データベース クエリの座標点:
POINT(114.044346 22.691963)
深セン市龍華区、POINT(116.055588 39.709385)
北京市方山区 (内モンゴルにおけるエンベロープ干渉によるクエリ パフォーマンスの影響)
座標に対応する州、市、郡、郡区の名前をクエリします。
このツールを使用して州、市、郡、および町の座標をクエリするには、まず、州、市、郡、および町の境界の geojson データ ファイルを準備する必要があります。
データ内にどのレベルの境界があるかによって、どのレベルの名前を照会できます。たとえば、地区レベルのデータしかない場合は、次のコマンドを入力することで、この座標が位置する地区および郡の名前を照会できます。座標 (上位レベルの名前の州と市を調べる必要がある); 州と市区町村の 3 レベルの境界がある場合は、3 レベルの州、市、地区の名前を一度にクエリできます。町と町の境界である場合、町と町の名前を照会できます。
ステップ 1: 省、市、郡、町の境界の geojson ファイルを準備する
境界 json ファイルがない場合は、以下の手順に従って、全国の州、市、郡、町の境界データの最新の json ファイルを取得できます。
- オープンソース ライブラリに移動して、省および都市の境界データ
ok_geo.csv
ファイルをダウンロードします: https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov (github は gitee に置き換えることができます)。 - オープンソース ライブラリをダウンロードします
AreaCity-Geo格式转换工具软件
。 - 変換ツール ソフトウェアを開いて選択し
ok_geo.csv
、geojson ファイルにエクスポートします (デフォルトでは国全体の地方データがエクスポートされ、異なる都市名のプレフィックスを入力することで異なる都市をエクスポートできます)。
複数の geojson ファイルがある場合は、それらを 1 つにマージする必要があります。上記のダウンロード
AreaCity-Geo格式转换工具软件
で高级功能
-を使用してGeoJSON多个文件合并成一个文件
それらをマージできます。
ステップ 2: 初期化のためのテスト プログラムを実行する
ダブルクリックして编译和运行Test.java直接测试.bat
テスト コンソール プログラムを実行します。コンソール メニュー コマンドに従って初期化します。初期化方法は 2 つあり、いずれでも実行できます。
Init_StoreInWkbsFile
: メモリ使用量は非常に低いですが、クエリ速度は StoreInMemory よりもはるかに遅いですが、非常に高速でもあるため、初期化にはこの方法をお勧めします。Init_StoreInMemory
: メモリ使用量は多くなりますが、クエリ速度は非常に高速です。
最初の方法を選択した後、geojson ファイルのパスを入力するように求められます。前の手順で準備した json ファイルの完全なパスを入力するか、json ファイルをプログラムのルート ディレクトリに直接配置します。そして自動的に初期化されます。
ステップ 3: 座標をクエリして、州と都市の名前を取得します。
初期化が完了すると、すべてのメニューが使用できるようになり、コンソールの対応するメニューを直接使用してメニュークエリ機能に入り、座標クエリを入力できます。
クエリには HTTP API を使用することをお勧めします。メニューで HTTP サービスを開始した後、URL を通じてクエリ インターフェイスにアクセスするか、オンラインビジュアル インターフェイスを直接使用してクエリ操作を実行できます。
添付ファイル: Java コードによるクエリ
//先初始化,全局只会初始化一次,每次查询前都调用即可(查询会在初始化完成后进行),两种初始化方式根据自己业务情况二选一
//首次初始化会从.json或.geojson文件中读取边界图形数据,速度比较慢,会自动生成.wkbs结尾的结构化文件,下次初始化就很快了
AreaCityQuery.Init_StoreInWkbsFile("geojson文件路径", "geojson文件路径.wkbs", true);
//AreaCityQuery.Init_StoreInMemory("geojson文件路径", "geojson文件路径.wkbs", true);
//AreaCityQuery.OnInitProgress=(initInfo)->{ ... } //初始化过程中的回调,可以绑定一个函数,接收初始化进度信息
//查询包含一个坐标点的所有边界图形的属性数据,可通过res参数让查询额外返回wkt格式边界数据
QueryResult res1=AreaCityQuery.QueryPoint(114.044346, 22.691963, null, null);
//查询和一个图形(点、线、面)有交点的所有边界图形的属性数据,可通过res参数让查询额外返回wkt格式边界数据
Geometry geom=new WKTReader(AreaCityQuery.Factory).read("LINESTRING(114.233963 30.546038, 114.468109 30.544264)");
QueryResult res2=AreaCityQuery.QueryGeometry(geom, null, null);
//读取省市区的边界数据wkt格式,这个例子会筛选出武汉市所有区县
QueryResult res3=AreaCityQuery.ReadWKT_FromWkbsFile("wkt_polygon", null, (prop)->{
return prop.contains("武汉市 ");}, null);
System.out.println(res1+"\n"+res2+"\n"+res3);
【終わり】