オープンソースの Java ツールである geojson から経度と緯度の座標に対応する州、市、郡、町の名前を低メモリ使用量と高パフォーマンスでクエリします。

座標境界クエリツール: 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 グラフィカル インターフェイス:
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=true1 倍に増加します。州および市区町村の 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 ファイルを取得できます。

  1. オープンソース ライブラリに移動して、省および都市の境界データok_geo.csvファイルをダウンロードします: https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov (github は gitee に置き換えることができます)。
  2. オープンソース ライブラリをダウンロードしますAreaCity-Geo格式转换工具软件
  3. 変換ツール ソフトウェアを開いて選択しok_geo.csv、geojson ファイルにエクスポートします (デフォルトでは国全体の地方データがエクスポートされ、異なる都市名のプレフィックスを入力することで異なる都市をエクスポートできます)。

複数の geojson ファイルがある場合は、それらを 1 つにマージする必要があります。上記のダウンロードAreaCity-Geo格式转换工具软件高级功能-を使用してGeoJSON多个文件合并成一个文件それらをマージできます。

ステップ 2: 初期化のためのテスト プログラムを実行する

ダブルクリックして编译和运行Test.java直接测试.batテスト コンソール プログラムを実行します。コンソール メニュー コマンドに従って初期化します。初期化方法は 2 つあり、いずれでも実行できます。

  1. Init_StoreInWkbsFile: メモリ使用量は非常に低いですが、クエリ速度は StoreInMemory よりもはるかに遅いですが、非常に高速でもあるため、初期化にはこの方法をお勧めします。
  2. 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);

【終わり】

おすすめ

転載: blog.csdn.net/xiangyuecn/article/details/125540223