2011-09-14 4 views
1

おそらく明らかなものを投稿して申し訳ありませんが、データベースの経験はあまりありません。
Table.fruit
IDタイプX座標Y座標の味覚フルーティ
1アップル3 3良い1: - 任意の助けをいただければ幸いですが、覚えて、私は私はこのようなテーブルを持っている大規模なデータベーステーブルでの最寄りの検索 - SQLおよび/またはArcGis

:-)初心者です培地悪い、5
2オレンジ5 4 2.9
3アップル7 77 1,4-
4バナナ0,1
6アップル3 38良い9 15中4 69バート9,5
5ナシ - 5,8
7アップル1 4良い3
8バナナ15 99悪い6,8
9梨298 18789ミディアム10,01
... ... ... ... ... ...
1000 Appleの1344 1388悪いバナナ759 1239 5
... ... ... ... ... ...
1958元のテーブルで 私

にNを与えるテーブル(例えば:N = 5)の各点に最も近い点を含む:私は必要1
1959バナナ3 4中5,2

良いです距離 Table.5nearest(距離は偽物であることに注意してください)。結果として得られるテーブルは、ID1、ID2、ID1とID2の間の距離を持ちます(残念ながら、画像はまだ投稿できません)。 1

ID.Fruit1 ID.Fruit2距離 ... ... ... 1000年1958 400 1000 Xxx Xxx ... ...

これは(理想的にはSQL /データベース管理で)、またはArcGisなどでどうすればできますか?何か案は? 残念ながら、私のテーブルには15000のデータセットが含まれているため、n = 5を選択した場合、結果のテーブルには75000のデータセットがあります。 大変感謝しています。

編集:

これまでのご意見やご提案はありがとうございます。 最初に提案された方法は、巨大なファイルサイズをレンダリングするテーブル全体、またはおそらくはクラッシュを修正するためのブルートフォーススキャンのようなものですか? フルーツはちょうどダミーです。実際のテーブルには、修正ID、公称属性(フルーツタイプなど)、XおよびY空間列(Gauss-Krueger内)、およびいくつかの数値属性が含まれています。 これで「バウンディングボックス」をコーディングする方法があると思いますので、距離計算は問題のポイント(1としましょう)と、特定のエッジの長さを持つ正方形内の他のすべてのポイントに対して行われます。私は(遠隔的に)それをコーディングしたり質問したりすることはできますが、私のID列のどこかでスクリプトを実行するにはどうしたらいいですか?私が理解している方法では、これは、レコード/ポイントの周りの四角形内のすべての点を距離フィールドと共に追加した "Table.Fruit"内の各レコード/ポイントの "サブテーブル"を作成するか、 "Table.5nearest")。私はこれが何らかの意味を持つことを願っています。何か案は?THanks again

+0

[SQL Sever Express 2008](http://msdn.microsoft.com/en-us/evalcenter/ff978728.aspx?wt.mc_id=MEC_36_1_5)はオプションですか?もしそうなら、http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/sql-server-2008-proximity-search-withththまたはhttp://blogs.lessthandot.com/を読むことができます。 index.php/DataMgmt/DBProgramming/sql-server-distance-calculation-option-3 – Fionnuala

答えて

1

すべての果物の間の距離をすべて取得するのはかなり簡単です。アクセスSQLで(あなたはそれが仕事を得るためにどこでも、かっこを追加する必要があるかもしれないが:P):

select fruit1.id, 
     fruit2.id, 
     sqr(((fruit2.xcoordinate - fruit1.xcoordinate)^2) + ((fruit2.ycoordinate - fruit1.ycoordinate)^2)) as distance 
from  fruit as fruit1 
join  fruit as fruit2 
on  fruit2.id <> fruit1.id 
order by distance; 

アクセスのための「上位n」の記録にこれを制限するために必要な洗練さを持っている場合、私は知りません各果物;したがって、このクエリはレコードセット上で2億2500万レコード(または、試行中にクラッシュする可能性があります)を返します。

+0

もっと良い解決策は、特定の範囲内のすべての近隣の果物を返すことでしょう。アクセスは、 'sqr(((fruit2.xcoordinate - fruit1.xcoordinate)^ 2)+((fruit2ycoordinate - fruit1.ycoordinate)^ 2)) Xophmeister

+0

データを正常化することができます。フィールドfruit.typeは、fruit_typeテーブルへの参照に変換する必要があります。 fruit.tasteフィールドの場合も同様です。 – Xophmeister

+0

私はすべて正規化していますが、このクエリが必要とする最後のものは別の結合です。果物のリストを管理することはそれほど難しくはなく、名前はほとんど変わりません。 – JeffO

1

これまでのご意見ありがとうございます。その間、私はHawth's Toolsと呼ばれるArcGis用のアドインを用意しました。これは実際にxとyの値を持つポイントフィーチャにn個の最も近いネイバーを見つけるための微風のように機能します。だから私はそれが似たような問題や疑問を持つ人を助けることを願っています しかし、それは今データベースに関する多くの問題を残しています。どのように私はすべての私の組み合わせのリストを与えるために任意のDBMS(好ましくはアクセス)を得ることができるアイデアを持っていますか?つまり、私がスペースに配置された15000のフルーツを持つポイント機能を持っている場合、どのようにすべての "純粋なバナナの近所"(リンゴ、レモンなど)と他のすべての組み合わせを得るのですか? 乾杯と最高の願い。

関連する問題