posts - 5, comments - 32, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2010年4月27日

中国的地图和卫星图都存在一个偏移量,我们在Google Map上看到的坐标与实际的GPS坐标其实是有着一定范围的偏移的,而在Google Earth上看到的坐标与GPS坐标是完全一致的,也就是说,同一张地图图片,切换到Google Map和Google Earth模式下的地图实际是上不匹配的,为什么会有这个偏移这里就不作叙述了,那么当我们拿到地图上的座标以后,要怎样转成GPS坐标呢?

我在google中找到一段C的代码,主要是借助一组码表,加上一个计算公式而得到GPS坐标,我用C#翻译了一下,下面贴上代码:

 

项目文件下载:Wars2Wgs.rar 

        double[] TableY = new double[660 * 450];
        
bool InitTable = false;

        
public Form1()
        {
            InitializeComponent();

            LoadText();
        }

        
private int GetID(int I, int J)
        {
            
return I + 660 * J;
        }

        
private void LoadText()
        {
            
using (StreamReader sr = new StreamReader("Mars2Wgs.txt"))
            {
                
string s = sr.ReadToEnd();

                Match MP 
= Regex.Match(s, "(\\d+)");

                
int i = 0;
                
while (MP.Success)
                {
                    
//MessageBox.Show(MP.Value);
                    if (i % 2 == 0)
                    {
                        TableX[i 
/ 2= Convert.ToDouble(MP.Value) / 100000.0;
                    }
                    
else
                    {
                        TableY[(i 
- 1/ 2= Convert.ToDouble(MP.Value) / 100000.0;
                    }
                    i
++;
                    MP 
= MP.NextMatch();
                }
                InitTable 
= true;
                
//MessageBox.Show((i / 2).ToString());
            }
        }

        
/// <summary>
        
/// x是117左右,y是31左右
        
/// </summary>
        
/// <param name="xMars"></param>
        
/// <param name="yMars"></param>
        
/// <param name="xWgs"></param>
        
/// <param name="yWgs"></param>
        private void Parse(double xMars, double yMars, ref double xWgs, ref double yWgs)
        {
            
int i, j, k;
            
double x1, y1, x2, y2, x3, y3, x4, y4, xtry, ytry, dx, dy;
            
double t, u;

            
if (!InitTable)
                
return;

            xtry 
= xMars;
            ytry 
= yMars;

            
for (k = 0; k < 10++k)
            {
                
// 只对中国国境内数据转换
                if (xtry < 72 || xtry > 137.9 || ytry < 10 || ytry > 54.9)
                {
                    
return;
                }

                i 
= (int)((xtry - 72.0* 10.0);
                j 
= (int)((ytry - 10.0* 10.0);

                x1 
= TableX[GetID(i, j)];
                y1 
= TableY[GetID(i, j)];
                x2 
= TableX[GetID(i + 1, j)];
                y2 
= TableY[GetID(i + 1, j)];
                x3 
= TableX[GetID(i + 1, j + 1)];
                y3 
= TableY[GetID(i + 1, j + 1)];
                x4 
= TableX[GetID(i, j + 1)];
                y4 
= TableY[GetID(i, j + 1)];

                t 
= (xtry - 72.0 - 0.1 * i) * 10.0;
                u 
= (ytry - 10.0 - 0.1 * j) * 10.0;

                dx 
= (1.0 - t) * (1.0 - u) * x1 + t * (1.0 - u) * x2 + t * u * x3 + (1.0 - t) * u * x4 - xtry;
                dy 
= (1.0 - t) * (1.0 - u) * y1 + t * (1.0 - u) * y2 + t * u * y3 + (1.0 - t) * u * y4 - ytry;

                xtry 
= (xtry + xMars - dx) / 2.0;
                ytry 
= (ytry + yMars - dy) / 2.0;
            }

            xWgs 
= xtry;
            yWgs 
= ytry;

        }

        
private void button1_Click(object sender, EventArgs e)
        {
            
double x = Convert.ToDouble(txbX.Text);
            
double y = Convert.ToDouble(txbY.Text);

            
double xWgs = x;
            
double yWgs = y;

            Parse(x, y, 
ref xWgs, ref yWgs);

            ltrResult.Text 
= "X:" + xWgs.ToString() + ",Y:" + yWgs.ToString();
        }

 

希望能够帮到遇到相同困扰的朋友。 

 

posted @ 2010-04-27 15:33 根号贰 阅读(2330) 评论(21) 编辑

2009年11月24日

http://www.basketball-reference.com/play-index/h2h_finder.cgi?request=1&p1=mingya01&p2=howardw01

posted @ 2009-11-24 19:02 根号贰 阅读(27) 评论(0) 编辑

2009年9月30日

      今天遇到一个很烦恼的问题,Javascript的encodeURIComponent()方法加密字符串get提交后,在asp.net页面解码时总是得到乱码。
      通过简单的分析,我的Javascript生成的UrlEnCode串是utf-8格式的,而接收方asp.net页面的RequestEncoding="gb2312",问题应该是出现在这里。
      最后使用了这个方法搞定问题:
      
System.Collections.Specialized.NameValueCollection gb2312 = HttpUtility.ParseQueryString(Request.Url.Query, System.Text.Encoding.GetEncoding("utf-8"));
_Keywords 
= gb2312["Keywords"];

      这个方法的好处是完全可以忽略发送页和获取页的编码问题,只需知道发送方的编码格式即可!

posted @ 2009-09-30 23:27 根号贰 阅读(633) 评论(0) 编辑

2008年11月26日

最简单使用方法(适用于任何数据表):
test.asp
<!--#include file="conn.asp"-->
<!--#include file="Page.asp"-->
<%
 
Set My = New Page
 
With My
 .SetConnstr
=Connstr '数据库链接字符串
 .SetStrTable="users" '表名
 .SetStrText="id,username,type,names" '查询的字段
 .SetStrIndex="id" '主键
 rsArray=.GetRs() '返回数据,类型为数组
 End With
%>
<table>
<%
if IsArray(rsArray) then
 
For i = 0 To UBound(rsArray, 2)
%>
 
<tr>
 
<td><%= rsArray(0, i) %></td>
 
<td><%= rsArray(1, i) %></td>
 
<td><%= rsArray(2, i) %></td>
 
</tr>
<%
 
next
end if
%>
 
<tr>
 
<td colspan="4"><%= My.GetTotalNum %>条 每页<%= My.GetiPageSize %>条 共<%= My.GetTotalPage %>页 页码:<%= My.GetFenYeJmp(false%></td>
 
</tr>

</table>

 

还有很多功能可以拓展,复杂的查询、排序等,不一一演示了 这个是使用到的asp类->Page.asp

 

'*******************************************************
'Page 分页类
'特点:采用 not in 分页输出方法,需配合 sp_Page 存储过程使用,速度比较快
'输入参数 connstr:数据库链接字符串 StrTable:要查询的表 StrText:要查询的字段 StrIndex:索引字段
'可选参数:(iPageSize:每页记录数量 StrWhere:条件语句 StrOrder:排序字段 StrSc:排序方法 ActionStr:From提交的查询参数)
'输出参数 rsArray:返回的记录集数组 GetTotalNum:返回的总记录数 GetiPage:当前页码 GetTotalPage:总页数 GetiPageSize:每页显示条数
'输出方法 GetFenYe():分页 GetFenYeJmp(inForm):带跳转的分页
'作者:六月雨 QQ:44569457 整理时间:2008年9月27日
'*******************************************************
Class Page
 Private connstr '数据库链接字符串
 
 Private iPage '当前页码
 Private iPageSize '每页记录数量
 Private StrTable '要查询的表
 Private StrText '要查询的字段
 Private StrWhere '条件语句
 Private StrIndex '索引字段
 Private StrOrder '排序字段
 Private StrSc '排序方法
 
 Private ActionStr '翻页链接字符
 Private Rs_dbs '记录集名称
 Private cmd 'cmd对象名称
 Private rsArray '返回的记录集数组
 Private TotalNum '返回的总记录数
 
 Private Sub Class_Initialize() '初始化类
 iPageSize=10
 iPage=trim(Request("iPage"))
 ActionStr=""
 StrWhere=""
 StrOrder=""
 StrSc=""
 If (not IsNumeric(iPage)) Then
 iPage=1
 Else
 If iPage
<then iPage=1
 
If iPage>5000000 then iPage=1
 End If
 End Sub
 
 Private Sub Class_Terminate() '释放类
 set Rs_dbs=nothing
 End Sub
 
 Public Property Let SetConnstr(svalue) '取得:数据库链接字符串
 connstr=Lcase(svalue)
 End Property
 
 Public Property Let SetiPageSize(svalue) '取得:每页记录数量
 iPageSize=clng(svalue)
 End Property
 
 Public Property Let SetStrTable(svalue) '取得:SQL表名
 StrTable=Lcase(svalue)
 End Property
 
 Public Property Let SetStrText(svalue) '取得:SQL查询的字段
 StrText=Lcase(svalue)
 End Property
 
 Public Property Let SetStrWhere(svalue) '取得:SQL条件字段
 StrWhere=Lcase(svalue)
 End Property
 
 Public Property Let SetStrIndex(svalue) '取得:索引字段
 StrIndex=Lcase(svalue)
 End Property
 
 Public Property Let SetStrOrder(svalue) '取得:排序字段
 StrOrder=Lcase(svalue)
 End Property
 
 Public Property Let SetStrSc(svalue) '取得:排序方法
 StrSc=Lcase(svalue)
 End Property
 
 Public Property Let SetActionStr(svalue) '取得:翻页链接字符
 ActionStr=Lcase(svalue)
 End Property
 
 Private Function MadeOrderBy() '方法:组合Order By 语句
 dim TempStrOrder,TempStrSc,t
 if StrOrder
<>"" and StrSc<>"" then
 TempStrOrder=split(StrOrder,",")
 TempStrSc=split(StrSc,",")
 if ubound(TempStrOrder)=ubound(TempStrSc) then
 for t=0 to ubound(TempStrOrder)
 if t=0 then
 MadeOrderBy=TempStrOrder(t)&" "
&TempStrSc(t)
 else
 MadeOrderBy=MadeOrderBy&","
&TempStrOrder(t)&" "&TempStrSc(t)
 end if
 next
 end if
 end if
 End Function
 
 Private Sub OpenRs() '方法:获得记录集
 Set Rs_dbs=Server.CreateObject("ADODB.RECORDSET")
 Set cmd = Server.CreateObject("ADODB.Command")
 with cmd
 .ActiveConnection = connstr '数据库连接字串
 .CommandText = "sp_Page" '指定存储过程名
 .CommandType = 4 '表明这是一个存储过程
 .Prepared = true '要求将SQL命令先行编译
 .Parameters.append .CreateParameter("@iPage",3,1,4,iPage) '指定页数
 .Parameters.append .CreateParameter("@iPageSize",3,1,4,iPageSize) '每页记录数
 .Parameters.append .CreateParameter("@StrTable",200,1,200,StrTable) '分页时要查询的表名
 .Parameters.append .CreateParameter("@StrText",200,1,1000,StrText) '字段
 .Parameters.append .CreateParameter("@StrWhere",200,1,1000,StrWhere) '查询条件where 中的条件语句
 .Parameters.append .CreateParameter("@StrIndex",200,1,30,StrIndex) '索引值
 .Parameters.append .CreateParameter("@StrOrder",200,1,100,MadeOrderBy()) '排序的字段
 .Parameters.Append .CreateParameter("@StrTotals",3,2,10) '总页数output
 Set Rs_dbs = .Execute
 end with
 End Sub
 
 Public Property Get GetRs() '输出:记录集(数组方式)
 call OpenRs()
 If not (Rs_dbs.eof and Rs_dbs.bof ) then
 GetRs = Rs_dbs.GetRows()
 End If
 Rs_dbs.close
 TotalNum = cmd(7)
 set cmd = nothing
 End Property
 
 Public Property Get GetTotalNum '输出:总记录数
 GetTotalNum=TotalNum
 End Property
 
 Public Property Get GetTotalPage '输出:总页数
 If (TotalNum mod iPageSize)
<>0 Then
 GetTotalPage=(TotalNum\iPageSize)+1
 Else
 GetTotalPage=(TotalNum\iPageSize)
 End If
 End Property
 
 Public Property Get GetiPageSize '输出:每页显示条数
 GetiPageSize=iPageSize
 End Property
 
 Public Property Get GetiPage '输出:当前页码
 GetiPage=iPage
 End Property
 
 Private Function GetQueryUrl() '方法:获得当前URL
 dim UrlFile,Query,Querys,i
 UrlFile= Request.Servervariables("URL")
 Query= Request.Servervariables("QUERY_STRING")
 Querys=split(Query,"&")
 For i=0 to ubound(Querys)
 if trim(Querys(i))
<>"" then
 If trim(Querys(i))=replace(trim(Querys(i)),"iPage=","") then
 GetQueryUrl=GetQueryUrl
&Querys(i)&"&"
 End If
 End If
 Next
 if ActionStr="" then
 GetQueryUrl=UrlFile&"?"
&GetQueryUrl
 else
 GetQueryUrl=UrlFile&"?"
&ActionStr&"&"&GetQueryUrl
 end if
 End Function
 
 Public Property Get GetFenYe() '输出:分页
 If (iPage>=1) and (clng(iPage)
<=clng(GetTotalPage)) then
 dim x,y,m,n,i,ActionUrL
 ActionUrL
=GetQueryUrl()
 
If iPage="" then iPage=1
 
iPage=Clng(iPage)
 
If TotalNum<>0 then
 x=TotalNum\iPageSize
 y=TotalNum mod iPageSize
 
 If y
<>0 then x=x+1 '总页数
 if iPage>5 then
 If (iPage+5)
<=x then
 n
=iPage-4
 
m=iPage+5
 
Else
 n
=iPage-4
 
m=x
 
End If
 Else
 n
=1
 
m=10
 
End If
 
 If x<
=10 then
 If x<
>1 then
 if iPage
<>1 then
 Response.Write" 
<href="&ActionUrL&"iPage="&(iPage-1)&">上一页</a> "
 end if
 for i=1 to x
 if iPage=i then
 Response.Write(i)
 Else
 Response.Write" 
<href="&ActionUrL&"iPage="&i&">["&i&"]</a> "
 End If
 next
 if iPage
<>x then
 Response.Write" 
<href="&ActionUrL&"iPage="&(iPage+1)&">下一页</a> "
 end if
 End If
 Else
 If iPage>5 then
 Response.Write" 
<href="&ActionUrL&"iPage=1>[首页]</a> "
 End If
 If iPage
<>1 then
 Response.Write" 
<href="&ActionUrL&"iPage="&(iPage-1)&">上一页</a> "
 end if
 for i=n to m
 if iPage>x then Exit For
 if iPage=i then
 Response.Write(i)
 Else
 Response.Write" 
<href="&ActionUrL&"iPage="&i&">["&i&"]</a> "
 End If
 next
 if iPage
<>x then
 Response.Write" 
<href="&ActionUrL&"iPage="&(iPage+1)&">下一页</a> "
 End If
 if (iPage+5)
<then
 Response.Write" <a href
="&ActionUrL&"iPage="&x&">[尾页]</a> "
 End If
 End If
 End If
 End If
 End Property
 
 Public Property Get GetFenYeJmp(inForm) '输出:带跳转的分页
 if inForm then
 response.Write(GetFenYe()&" 
<input name='iPage' type='text' value="&iPage&" id='iPage' size='3'> ")
 response.Write("
<input type='submit' name='Submit' value='转'>")
 else
 response.Write("
<form name='Jmp' method='post' action="&GetQueryUrl()&">")
 response.Write(GetFenYe()&" 
<input name='iPage' type='text' value="&iPage&" id='iPage' size='3'>")
 response.Write("
<input type='submit' name='Submit' value='转'>")
 response.Write("
</form>")
 end if
 End Property
End Class

 

 存储过程

 

CREATE PROCEDURE [dbo].[sp_Page]
@iPage int=1--当前页码
@iPageSize int=10,--每页条数
@StrTable varchar(200),--查询的表
@StrText varchar(1000),--查询的字段
@StrWhere varchar(1000),--条件
@StrIndex varchar(30),--索引
@StrOrder varchar(100)='',--排序字段
@StrTotals int output --返回总条数
 AS

--定义变量
declare @SqlCount nvarchar(2000)
declare @Sql nvarchar(2000)
declare @TempOrder nvarchar(1000)

if @StrOrder<>""
 
begin
 
set @TempOrder=' order by '+@StrOrder
 
end
else
 
begin
 
set @TempOrder=''
 
end

--组合sql语句
if @iPage=1
 
begin
 
set @Sql='select top '+str(@iPageSize)+' '+@StrText+' from '+@StrTable+' where 1=1 '+@StrWhere+@TempOrder
 
end
else
 
begin
 
set @Sql='select top '+str(@iPageSize)+' '+@StrText+' from '+@StrTable+' where '+@StrIndex+' not in (select top '+str(@iPageSize*(@iPage-1))+' '+@StrIndex+' from '+@StrTable+' where 1=1 '+@StrWhere+@TempOrder+''+@StrWhere+@TempOrder
 
end

set @SqlCount='select @StrTotals=isnull(count(*),10000) from '+@StrTable+' where 1=1 '+@StrWhere

--查询总记录数量
exec sp_executesql @SqlCount,N'@StrTotals int output',@StrTotals output

--执行sql语句返回
exec (@Sql)
GO

 

 

posted @ 2008-11-26 11:33 根号贰 阅读(736) 评论(1) 编辑

2008年7月9日

最近在研究微软Office系列的SharePoint2007,在感受到强大定制化功能的同时,也感受到MOSS对开发者带来的一些困扰。
特别是当一个List中存有大量数据的时候,MOSS并没有提供现有的方法可以支持分页取集,Google了一下老外们的文章,居然也没有找到有用的资料。没有办法,只有自己动手!
思路还是T-SQL的思路,Select top N * From Table where ID not in (Select top M ID From Table)
下面是代码:
/// <summary>
        
/// 根据栏目分页取新闻
        
/// </summary>
        
/// <param name="MenuId">栏目序号</param>
        
/// <param name="PageSize">页长</param>
        
/// <param name="PageNo">页数</param>
        /// <param name="ListName">表名</param>
        /// <returns></returns>
        public SPListItemCollection GetNewsByMenuId(int MenuId, uint PageSize, int PageNo,string ListName)
        
{
            
using (SPWeb myweb = SPContext.Current.Web)
            
{
                
int MinId = 9999999;    //设定最大ID初始值
                string queryStr;

                
if (PageNo > 1)
                
{
                    queryStr 
= "select ID From " + ListName + " where MenuID = " + MenuId + " Order By ID DESC";
                    FriendlyQuery tempQuery 
= new FriendlyQuery(myweb, queryStr);
                    tempQuery.Scope 
= FriendlyQuery.QueryScope.AllItems;
                    tempQuery.RowLimit 
= PageSize * uint.Parse(Convert.ToString(PageNo - 1));
                    SPListItemCollection tempResult 
= tempQuery.GetItems();
                    
                    
if (tempResult.Count > 0)
                    
{
                        
for (int i = 0; i < tempResult.Count; i++)
                        
{
                            
if (Int32.Parse(tempResult[i]["ID"].ToString()) < MinId)
                            
{
                                MinId 
= Int32.Parse(tempResult[i]["ID"].ToString());
                            }

                        }

                    }

                }


                queryStr 
= "Select * From "+ListName+" where MenuID = "+MenuId+" and  ID <" + MinId + " Order By ID DESC";
                FriendlyQuery query 
= new FriendlyQuery(myweb, queryStr);
                query.Scope 
= FriendlyQuery.QueryScope.AllItems;
                query.RowLimit 
= PageSize;
                SPListItemCollection result 
= query.GetItems();

                
return result;
            }

        }

经测试功能是实现了,但是性能还没有进行测试。性能测试的数据稍后放出。

posted @ 2008-07-09 08:38 根号贰 阅读(1790) 评论(10) 编辑