29

ポリゴンgeofencesを格納するテーブルがあります。geometry

Aジオメトリの内側にポイントもあります。私がしなければならないことはA、ポリゴン ジオメトリの表面にあるポイントから最も近い 2 つのポイントを見つけることです。

PostGIS での機能:

CREATE OR REPLACE FUNCTION accuracyCheck(Polygon geometry
                                        ,decimal lat
                                        ,decimal lon)
  RETURNS VARCHAR AS
$BODY$

DECLARE height DECIMAL;
DECLARE accuracy VARCHAR(250);

BEGIN 

CREATE TEMPORARY TABLE closePointStorage AS
SELECT ST_AsText(ST_ClosestPoint(geometry
                                ,ST_GeomFromText('POINT(lat lon)',0)
                                )
                ) AS closestPoint
FROM  (
   SELECT ST_GeomFromText(geometry) as geometry
   FROM gfe_geofences
   WHERE is_active=true
   ) As tempName;

CREATE TEMPORARY TABLE areaStorage ON COMMIT DROP AS
SELECT ST_Area(ST_GeomFromText('Polygon((23.0808622876029 96.1304006624291
                                        ,28.0808622876029 99.1304006624291
                                        ,100              200
                                        ,23.0808622876029 96.1304006624291
                                        ))'
                              ,0)
              ) AS area;

CREATE TEMPORARY TABLE distanceStorage ON COMMIT DROP AS
SELECT ST_Distance(
          ST_GeomFromText('POINT(23.0808622876029 96.1304006624291)',-1)
         ,ST_GeomFromText('POINT(28.0808622876029 99.1304006624291)',-1)
         ) AS distance;

height = (SELECT area FROM areaStorage)
        /(0.5*(SELECT distance FROM distanceStorage));

IF height < (SELECT radius_meters
             FROM gfe_geofences Where is_active=true) THEN
   accuracy = "FullConfirm";
   RETURN accuracy;
ELSE
   accuracy = "PartiallyConfirm";
   RETURN accuracy;
END IF;

END;
$BODY$ LANGUAGE plpgsql;

ポリゴン ジオメトリの境界上の 2 つの点を見つけたいだけです。クエリから見つけたのと同じように:

CREATE TEMPORARY TABLE closePointStorage AS
SELECT ST_AsText(ST_ClosestPoint(geometry
                                ,ST_GeomFromText('POINT(lat lon)',0)
                                )
                ) AS closestPoint 
FROM  (
   SELECT ST_GeomFromText(geometry) as geometry
   FROM gfe_geofences
   WHERE is_active=true
   ) 
AS tempName;

この点以外に、上記の点よりも距離が大きく、残りの点よりも小さい距離でもう1つ見つける必要があります。

4

4 に答える 4

1

1)左翼のアイデアの一種ですが、目的地に2番目に近いポイントを見つけるには、すでに見つけたポイントに最も近いポイントを見つけてみませんか?

2)または、あなたの特定の質問にもっとゲルマイン、

  • ポイントの妥当な範囲内にあるポイントのセットを見つけ、
  • そのセットとポリゴンの境界にあるポイントのセットとの交点を見つけます(これは別のPostGIS関数である可能性があります。しばらくpostGを使用していないため、わかりません)

3)さらに左側のフィールドに、データセットの一部をMongoにダンプし、$near関数を使用します... http://docs.mongodb.org/manual/reference/operator/near/

于 2013-01-15T20:53:58.660 に答える
1

ST_DumpPoints()を使用してポリゴンのポイントをダンプし、ST_Distanceでその順序から制限2まで選択します。

だからそれは

SELECT * from ST_DumpPoints(poly) order by ST_Distance(A,geom) asc limit 2;

(これが内部選択であり、polyがポリゴン、Aが比較するポイント、geomが比較対象のpoly内のポイントの1つのgeom列であると想定します)

于 2013-01-04T13:21:34.203 に答える
1

ラインを含める場合、通常、境界ポリゴン上に 2 番目に近いポイントはありません。ゼロに 2 番目に近い実数が存在しないのと同じです。Markus が提案するように、コーナーのポイントのみを考慮したい場合。または、最も近い点が 1 つしかありません。

于 2013-01-13T01:53:04.823 に答える
1

問題のポイントに最も近いポリゴンのエッジを見つけたいと想定しています

回線距離の問題

直線 [A,B] から点 'C' までの距離 'd' を取得するにはまず、A が 0,0 になるようにすべての点を平行移動します。

B -= A  //vector subtraction
C -= A

次に、長さが 1.0 になるように B を正規化します。

len = sqrt( B . B) //dotproduct of two vectors is the length squared
B /= len  //scalar divide by length

C に直角な A からの長さを見つける

dotp = B . C  //dot product again
closestPointOnLine =  B * dotp  //scalar multiply

今すぐ距離を取る

diff = (C - ClosestPointOnLine)
d = sqrt(diff . diff)  

SQLでそれを行う方法がわかりません。ポリゴンの各エッジに対して上記を実行し、最小値「d」を見つける必要があります

ちなみに、B と C の外積の符号は、点が多角形の内側にあるかどうかを示します。

于 2013-01-30T03:40:16.100 に答える