0

我使用了一个非常有用的程序来获取空间数据并将其放入 SQL Server 数据库中。我很好奇是否有可能使用geometry数据类型来找到彼此接壤的美国州?

编辑:我假设如果两个州彼此接壤,那么这些州的几何数据的相当一部分将是相同的(因为它们沿边界共享一个轮廓)

4

1 回答 1

1

我前段时间使用 SQL2005 做过这个,但我相信这个逻辑可能仍然适用。获得空间数据后,与您类似,我将其加载到 SQL 中。到达那里后,我决定分解并写出每个坐标(在我的情况下,纬度/经度存储在边界几何字段中)及其对应的状态到一个新表中。虽然不是完全必要的,但它帮助我查看了数据,并使处理逻辑不那么复杂。谈到这一点,我怀疑(但不确定)为不同州共享的边界列出的点将是为两个州列出的相同点(谢天谢地)。一旦我有了新的一对多(状态到坐标)表,下面的伪代码就解释了我做了什么。我的工作代码(在 .Net 中完成)具有此处未提及的复杂性,例如建立序列号、边界距离等。

大纲:

Loop through each State (StatePoints table)
    Get all coords/points of current State (coords in my case are lat/long combos)
    Loop through each coord of current State
        _lat = row["Latitude"]
        _long = row["Longitude"];

        //Using the above, locate other States in the same table with shared Coords. Something like the following.
        //the where condition state_id <> currState_id is simply to omit the current state's borders since you're only bordering Contiguous states. 

        strSQL = "SELECT state_id, Latitude, Longitude from ..." +
                 " WHERE (ROUND(Latitude, 6, 1) = " + _lat + ") AND (ROUND(Longitude, 6, 1) = " + _long + ") AND (state_id <> " + currState_id + ")" +

        dtStateSharedPoints = db.ExecuteDataSet(CommandType.Text, strSQL).Tables[0];

        //--------------------------------------------------
        //Loop through the shared lat/long matches. Note: typically there will only be one, 
        //however several States can meet at a single point
        //--------------------------------------------------
             Loop through the shared lat/long matches (dtStateSharedPoints).
                 borderState_id = Convert.ToInt32(row["state_id"]);
                 strSQL = "INSERT INTO ContigStates(state_id, borderState_id, Latitude, Longitude) ..."
                 db.ExecuteNonQuery(CommandType.Text, strSQL);

一些县和州的边界位于水道边缘(不是中心)。根据您使用的数据,这些数据可能不会显示为连续的。您可能需要考虑这些。

当时我可能在这上面花了两天多的时间。除非您有其他原因,否则即使只需要一天的时间,当您将工时与美元进行比较时,从数据公司购买它可能更可行。你可以在这里找到相邻的县,如果你问的话,我相信他们会做州。除此之外,还没有买,我不知道该推荐谁……它可能值得一试。

我希望这有帮助

于 2012-10-15T15:32:32.570 回答