2017-12-08 17 views
0

各郵便番号ごとに、各LocationIDに対してランダムな点を生成するようにSQL Serverを取得しようとしています。だから私は、各郵便番号の中心点を追加し、中心点の周りにこれらの点を配布したいと思います。各locationIDについて、私はポイントが欲しいです。ここで私のテーブルは現在のように見えます。SQL Serverは、中心点から離れた郵便番号の中にランダムな点を展開します

表名=場所

LocationName; varchar 
locationID; int 
ZIP: int 
CentroidLat;float 
CentroidLng;float 

サンプルデータ:

LocationName   LocationID  Zip  CentriodLat CentroidLNG 
------------------------------------------------------------------------- 
    JV     1   99999  38.999999  - 93.999999 
    JV     2   99999  38.999999  - 93.999999 
    AA     1   11111  37.999999  - 94.999999 
    AA     2   11111  37.999999  - 94.999999 
    AA     3   11111  37.999999  - 94.999999 
    BB     1   22222  36.999999  - 95.999999 
    BB     2   22222  36.999999  - 95.999999 

ので、各ファスナーのLocationIdのために私は、郵便番号内のランダム緯度長いをしたいと思います。私は正方形か円でこれを得ることができ、それはうまくいくでしょう。あまりにも正確である必要はありません。また、各郵便番号は異なるサイズになるので、コードで手作業で変更できる変数があれば、それは素晴らしいでしょう!

これは、私はそれが

`LocationName LocationID Zip CentroidLat  Centroid  RandLat RandLNG` 

    JV    1  99999  38.999999 - 93.999999 -93.7436 -94.0124 
    JV    2  99999  38.999999 - 93.999999 -93.9653 -94.0052 
    AA    1  11111  37.999999 - 94.999999 110.9636 -95.7219 
    AA    2  11111  37.999999 - 94.999999 102.6538 -95.7489 
    AA    3  11111  37.999999 - 94.999999 101.9887 -96.0089 
    BB    1  22222  36.999999 - 95.999999 137.5311 -97.9698 
    BB    2  22222  36.999999 - 95.999999 46.7497 -96.9266 

のように見えるように、これは可能です希望は何ですか?

私はこれを見つけました... SQL Server generating random spatial geography around point? しかし、それを動作させることはできません。

私はこのエラーを取得しておいてください。私がしようとすると、コードの上に私のテーブル名や列を挿入する際

Msg 116, Level 16, State 1, Line 18
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

エラーが発生します。

ありがとうございます!

答えて

0

エラーは、空間的/地理的オブジェクトとは関係のない一般的なSQLエラーです。あなたのリンクで参照されるコードでは、いくつかのサンプル値を保持するテーブル変数を作成し、それを設定して、郵便番号98765に対して複数の値が返されるようにしました。コードを実行すると、記述するエラーが発生します:

DECLARE @geo  AS GEOGRAPHY 
     , @newgeo AS GEOGRAPHY 
DECLARE @ZipCodes AS TABLE 
    (
     [ZipGeo] GEOGRAPHY 
     , [ZipCode] SYSNAME 
); 

INSERT INTO @ZipCodes 
      ([ZipGeo] 
      , [ZipCode]) 
VALUES  (geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326),N'98765'), 
      (geography::STGeomFromText('POLYGON((-122.358 47.653 , -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326),N'98765'); 

SET @geo = (SELECT [ZipGeo] 
      FROM @ZipCodes 
      WHERE [ZipCode] = '98765') 

これに対処する方法は、「SELECT TOP(1).... ORDER BY ...」ですが、ここではORDER BYは実際には使用されず、 GEOGRAPHYタイプ。

DECLARE @geo  AS GEOGRAPHY 
     , @newgeo AS GEOGRAPHY 
DECLARE @ZipCodes AS TABLE 
    (
     [ZipGeo] GEOGRAPHY 
     , [ZipCode] SYSNAME 
); 

INSERT INTO @ZipCodes 
      ([ZipGeo] 
      , [ZipCode]) 
VALUES  (geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326),N'98765'), 
      (geography::STGeomFromText('POLYGON((-122.358 47.653 , -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326),N'98765'); 

SET @geo = (SELECT TOP(1) [ZipGeo] 
      FROM @ZipCodes 
      WHERE [ZipCode] = '98765' 
      ORDER BY [ZipCode]) 

これに代わる方法として、これは本当に悪いことです。

DECLARE @geo  AS GEOGRAPHY 
     , @newgeo AS GEOGRAPHY 
DECLARE @ZipCodes AS TABLE 
    (
     [ZipGeo] GEOGRAPHY 
     , [ZipCode] SYSNAME 
); 

INSERT INTO @ZipCodes 
      ([ZipGeo] 
      , [ZipCode]) 
VALUES  (geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326),N'98765'), 
      (geography::STGeomFromText('POLYGON((-122.358 47.653 , -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326),N'98765'); 

SELECT @geo = [ZipGeo] 
FROM @ZipCodes 
WHERE [ZipCode] = '98765'; 

ご注文いただける列があり、セットのトップ(1)だけを返すことが望ましいです。そうすれば、あなたのSQLステートメントは決定的です。 SQLは注文を保証しないので、返品を保証するために結果を注文する必要があります。

表示されているエラーの原因はこれには関係ありません。それに対処するにはいくつかの方法があります。これは、プロダクションコードでよく見られる一般的なエラーです。ここでは、データは常に「良い」とみなされ、1つの値しか返されません。そして、データが複数の値を返すとき(あなたの場合や私の例のように)、コードは失敗し、なぜ人々は不思議に思うのですか?

あなたが望むものを正確に記述できるように、防御的かつ飾り的にコードを書くことをお勧めします。