Kong 介绍

Kong,是一款基于lua的API管理软件。能够注册、管理API,能够提供API的验证访问。Kong本质上始一个反向代理软件,类似于ngnix,但比nginx提供了更简单的配置方式(REST接口)。
Kong的主页为:https://getkong.org/

Kong的安装

kong支持在大多数linux平台、mac osx上安装。还提供了docker镜像,用户可以直接下载使用。
kong的安装比较简单,直接选择对应的平台安装包下载安装即可,当然也可以通过source code编译安装。code的地址为:https://github.com/Mashape/kong

kong的配置

kong使用前要首先配置数据库,目前kong支持”cassandra”, “postgres”,配置文件中默认使用cassandra。本文中使用postgres。

安装数据库

首先安装postgres,然后创建名字为kong的user

createuser  kong -P

然后创建名字为kong的数据库

createdb kong -O kong -E UTF8 -e

配置数据库

打开 /etc/kong/kong.yml 文件,找到数据库配置的相关位置,配置如下

postgres:
host: "127.0.0.1"
port: 5432
user: kong
password: kong
database: kong

保存配置文件即可

启动kong

 $ kong start

####验证kong是否启动成功 在start后,命令行会提示([OK] Started)
默认情况下,kong的代理端口为8000,管理员REST接口的端口为8001

关闭kong

 $ kong stop

重新加载kong

 $ kong reload

kong的使用

kong可以通过REST接口来进行管理,下面的代码就是添加一个API:

  $ curl -i -X POST \
  --url http://localhost:8001/apis/ \
  --data 'name=mockbin' \
  --data 'upstream_url=http://mockbin.com/' \
  --data 'request_host=mockbin.com'

使用REST的方式对于初学者来说很费劲,幸好很多热心群众提供了kong的UI界面来帮助我们使用Kong。这里我推荐 kong-dashboard https://github.com/PGBI/kong-dashboard

kong-dashboard 安装

  # Install Kong Dashboard
npm install -g kong-dashboard

# Start Kong Dashboard
kong-dashboard start

# To start Kong Dashboard on a custom port
kong-dashboard start -p [port]
cloud Leave a comment

ERROR: SQLite database is malformed 的解决方法

原文地址:http://froebe.net/blog/2015/05/27/error-sqlite-database-is-malformed-solved/

//检查数据
sqlite> pragma integrity_check;
Error: database disk image is malformed
//把数据dump出来
sqlite> .mode insert
sqlite> .output mydb_export.sql
sqlite> .dump
sqlite> .exit

//备份数据库
mv mydb.db mydb.db.original

//导入数据
sqlite3 mydb.db < mydb_export.sql
//重建索引
sqlite> analyze;
sqlite> .exit
linux, Mac OS X Leave a comment

proj.4 字符串转成Esri wkt字符串的方法

proj.4 字符串转成Esri wkt字符串的方法
使用gdal/ogr库进行转换
import os
import sys
import string
import osgeo.osr

if (len(sys.argv) <> 2):
print ‘Usage: proj2wkt.py [Proj4 Projection Text]’
else:
srs = osgeo.osr.SpatialReference()
srs.ImportFromProj4(sys.argv[1])
srs.MorphToESRI() //重点,转成Esri的wkt格式
print srs.ExportToWkt()

ArcGIS Leave a comment

ITMS-90096错误解决

如果你的App的启动页面采用Launch Screen.storyboard的话,上传到AppStroe会导致ITMS-90096错误,提示

your binary is not optimized for iphone 5

解决这个问题有两种方案,如果需要支持iOS7及以下系统,使用老的Launch Image方案,制作各个尺寸的启动图片,并加载到App中。
第二种方案,如果不必要支持iOS7 及以下版本,直接将Depolyment target 设置为iOS8,并将Launch Screen.storyboard文件重命名为LaunchScreen.storyboard。注意只是去掉空格。
参考资料: http://stackoverflow.com/questions/27136053/cant-submit-the-app-with-storyboard-launch-images-to-the-app-store-your-binary

 

App Leave a comment

Numeric Character Reference转NSString

在处理数据的时候,有时候会遇到 &# 开头的数据,例如Σ那么这个是 Numeric Character Reference编码。
NCR编码是由一个与号(&)跟着一个井号(#), 然后跟着这个字符的Unicode编码值, 最后跟着一个分号组成的, 如:

&#nnnn;
或者
&#xhhhh

其中, nnnn是字符编码的十进制表示, 而hhhh是字符的16进制表示.
在ios中处理这种编码有两种方法,一种使用NSAttributedString的方式,这种比较简单,但是处理极慢。另外一种就是自己写编码转换。
两种实现的代码如下:

-(NSString *)toUnicodeString
{

    NSMutableString *srcString =    [[NSMutableString alloc]initWithString:self];
    if ([srcString containsString:@"&#"]) {
        [srcString replaceOccurrencesOfString:@"&#" withString:@"" options:NSLiteralSearch range:NSMakeRange(0,     [srcString length])];

    NSMutableString *desString = [[NSMutableString alloc]init];

    NSArray *arr = [srcString componentsSeparatedByString:@";"];

    for(int i=0;i&lt;[arr count]-1;i++){

        NSString *v = [arr objectAtIndex:i];
        char *c = malloc(3);
        int value = [v intValue];
        c[1] = value  &0x00FF;
        c[0] = value &gt;&gt;8 &0x00FF;
        c[2] = '\0';
        [desString appendString:[NSString stringWithCString:c encoding:NSUnicodeStringEncoding]];
        free(c);
    }

    return desString;
}
else
{
    return self;
}

}
-(NSString *)toUnicodeString2
{

NSError * error=nil;
NSData *encodedData = [self dataUsingEncoding:  NSUTF8StringEncoding];
NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};

NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData:encodedData options:options documentAttributes:nil error:&error];

return [attributedString string];
}
App, Mac OS X Leave a comment

自定义ArcGIS矢量底图

目前Esri已经在ArcGIS Online上发布了矢量底图,用户可以通过修改Style的方式来自定义矢量底图。
用户编辑后的矢量底图还可以发布成新的图层,供用户使用。
用户自定义的内容包括:
1 控制图层的显示
2.修改图层的符号和显示
3.在选定区域修改语言选项
4.在选定地区修改争议地区的显示

自定义Style示例

下图就是由一个自定义矢量底图的例子,由现有由矢量底图修改而来。


修改的内容主要包括:
1.背景颜色和水系颜色由 ‘#cfcfd4′改成 ‘#a6deff’
2.土地和植被的填充颜色由‘#ededed’ 改成 ‘#dfffd9′
3.城区颜色由‘#e8e8e8′ 改成 ‘#d5e3ca’
由于上面的图层在不同的显示级别都有可能显示,所以修改的不止一处。

创建使用自定义矢量底图的地图

创建新的Tile Layer

1.登录到ArcGIS Online,点击Map,打开Map窗口
2.添加矢量瓦片图层,点击Add按钮,选择Search for Layers in ArcGIS Online,输入“esri vector basemap”,点击GO按钮

3.选择owner为‘esri_vector’的任意一个图层,然后点击Add按钮
4.在TOC面板中,点击刚才添加的图层的More Option按钮,选择Copy

5.点击刚才Copy的图层的More Option选项,选择Save Layer按钮,将图层保存Online中

修改新建图层的Style

1.点击上一步新生成的图层的More Option选项,选择Show Item Details选项
2.在Item详情页面的Open选项中选择Download Style选项,将Style文件下载到本地
3.编辑Style文件。打开root.json文件,并编辑该Style文件,保存或另存文件。

Esri的矢量底图使用Mapbox vector tile specification (v8),用户可以参考 Mapbox GL Style Reference来修改底图样式。
4.更新图层的Style。在Item详情页面中点击Update按钮,选择刚才修改的style文件,上传即可。
5.查看修改后的变化。在Item详情页点击Open,选择Add layer to map即可查看

ArcGIS Leave a comment

2张图教你认识世界人口分布

下面图中,蓝色区域生活着世界上大概5%的人口,红色区域同样生活着5%的人。
蓝色区域主要是高山、极地和沙漠等不适合人类居住的区域,这包括整个大洋洲、北美的加拿大以及北欧部分地区。
红色区域为世界上人口最稠密的地图,包括孟加拉国和印度的三个地区:比哈尔邦,恰尔肯德邦和西孟加拉邦。这里的人口越3.9亿。

下面这张图,同样是将世界5%的人口进行极化分布制图,其中蓝色部分约占地球面积的72%。而地图上的17个红点则同样生活着约5%的人口。

 

gis Leave a comment

ArcGIS for Server 10.3.X 新型紧凑型缓存的解读和应用 zz

原文地址:http://mp.weixin.qq.com/s?__biz=MzA4NjI0ODMyNA==&mid=400860148&idx=1&sn=ea65c230cc2fdcca1fb983dea0d1d453&scene=5&srcid=1127QN8qFNaaGaQ77sAGJkMp#rd
早在2010年年底,牛魔王在其博客空间(http://blog.csdn.net/warrenwyf/article/details/6069711 ) 中对ArcGIS 10中推出的紧凑型缓存格式进行了详细的解读。紧随着的4年时间里,ArcGIS for Server本身经历了10、10.1.X和10.2.X各版本的逐级更替,特别是软件架构发生了显著的变化。然而,就紧凑型缓存本身而言,牛魔王中王的解读一直都是适用的。衷心地向我们的大牛致敬!

直到2014年年底ArcGIS 10.3正式发布,Esri才推出了新的紧凑型缓存格式以增强用户的访问体验。新的缓存格式下,关键的差别在于Esri将缓存的索引信息.bundlx包含在了缓存的切片文件.bundle中。

接下来,我们就简单解读一下这一新型的紧凑型缓存格式。俗语说,万变不离其宗。既然缓存文件夹下仅包含了bundle文件,可以想见,切片的索引,切片的偏移和切片的图片流都必然包含在这一文件中。根据经验,缓存本身遵循的是16进制的形式。依照这一思路,利用UltraEdit打开bundle文件并以16进制格式进行查看。

为了便于分析,我们先创建一个在L00级只包含一个切片的缓存服务,并在UltraEdit中以16进制格式查看L00级下的R0000C0000.bundle文件。

通过对这一文件中信息存储规律的分析,可初步得出如下结论: 1) 文件中包含大量04 00 00 00 00 00 00 00的16进制字节组,共计16893组;
2) 文件中仅包含一个PNG24的文件头字节组89504E47,即第一行第一列的切片,bundle文件中唯一的一张图片。图片流紧随(1)中所提到的字节组之后,但偏移4个字节;
3) (2)中所述的4字节偏移量的数值恰等于图片流的长度;
4) 文件第5行的起始4个字节44 00 02 00按照低位到高位换算出的数值等于131140,这一值与(2)中所述的PNG文件头位置恰恰吻合。

综上分析: 1)起始4行是bundle的文件头信息,可忽略;
2)bundle的文件头之后记录了16384张切片的切片位置,仅4字节,从低位到高位,后4字节可忽略;
3)位置信息之后,对于切片的记录,先以4字节记录切片的长度,而后紧跟图片流信息。到此,bundle结束。

下一步呢,我们将选择一个狭长的矩形面要素发布服务并切图,以分析行列切片在bundle文件中的具体存储规律。

通过对bundle文件和对应的松散缓存在L02级别上的对比,可推断: 1)bundle中索引的存储是按行依次存储,即第1行的1至128,第2行的1至128,以此类推,直至最后一张切片即第128行128列;
2)bundle中图片流的存储仅包含非空切片。此外,通过对这一更复杂的地图缓存的分析,再次论证了前面的推论。

既然上述的分析完毕,接下来就要对上述的分析进行一番验证啦。这里呢,我会利用ArcGIS Runtime SDK for Android实现抽象理论的实践工作。本次验证的核心在于,通过对TiledServiceLayer进行扩展,按照上面的存储推论覆写getTile(intmLevel, int mColumn, int mRow)方法。

第一步,根据参数中的比例级别、列号和行号定位到Bundle文件。 1 String level = Integer.toString(mLevel);
2 int levelLength = level.length();
3 if(levelLength == 1){
4 level = “0” + level; 5 } 6 level = “L” + level; 7
8 int rowGroup = 128(mRow/128); 9 String row =Integer.toHexString(rowGroup);
10 int rowLength = row.length();
11 if(rowLength < 4){
12 for(int i=0; i<4-rowLength; i++){
13 row = “0” + row;
14 }
15 }
16 row = “R” + row;
17
18 int columnGroup = 128
(mColumn/128);
19 String column = Integer.toHexString(columnGroup);
20 int columnLength = column.length();
21 if(columnLength < 4) {
22 for(int i=0; i<4-columnLength; i++){
23 column = “0” + column;
24 }
25 }
26 column = “C” + column;
27
28 String bundleName = String.format(“%s/%s/%s%s”,compactTileLoc, level, row, column) + “.bundle”;

第二步,读取bundle文件,根据前面分析中所推断出的切片的起始位置和切片的长度获取对应的切片并返回。 1 int index = 128(mRow – rowGroup) +(mColumn-columnGroup); 2
3 RandomAccessFile isBundle = newRandomAccessFile(bundleFileName, “r”); 4 isBundle.skipBytes(64 + 8
index); 5
6 //获取位置索引并计算切片位置偏移量 7 byte[] indexBytes = new byte[4]; 8 isBundle. Read(indexBytes, 0, 4);
9 long offset = (long)(indexBytes[0]&0xff)+(long)(indexBytes[1]&0xff)256 + (long)(indexBytes[2]&0xff)65536 10 + (long)(indexBytes[3]&0xff)16777216;
11
12 //获取切片长度索引并计算切片长度
13 long startOffset = offset – 4;
14 isBundle.seek(startOffset);
15 byte[] lengthBytes = new byte[4];
16 isBundle.read(lengthBytes, 0, 4);
17 int length = (int)(lengthBytes[0] & 0xff) + (int)(lengthBytes[1]& 0xff)
256 + (int)(lengthBytes[2] & 0xff) * 65536
18 + (int)(lengthBytes[3] &0xff) * 16777216;
19
20 //根据切片位置和切片长度获取切片
21 ByteArrayOutputStream bos = new ByteArrayOutputStream();
22
23 byte[] tileBytes = new byte[length];
24 int bytesRead = 0;
25 if(length > 0){
26 bytesRead = isBundle.read(tileBytes, 0, tileBytes.length);
27 if(bytesRead > 0){
28 bos.write(tileBytes, 0,bytesRead);
29 }
30 }
31
32 tile = bos.toByteArray();

呵呵,成功实现。直接奉上Android端的显示效果吧。

Tips

关于紧凑型切片,唠唠叨叨的我还是忍不住要嘱咐几句: 1)新型的紧凑型切片无法被直接用于先前版本的ArcGIS for Server;
2)新型的紧凑型切片可通过导出切片即export tiles获取先前格式的缓存;
3)老版本的紧凑型切片可直接在新版本的ArcGIS for Server中复用,但可通过升级存储格式即UpgradeStorage Format更新为新型紧凑型切片格式。

ArcGIS Leave a comment

Esri 矢量底图介绍(Beta)

今年早些时候,Esri公布了在ArcGIS平台中引入矢量底图的计划并展示了预览版。随着ArcGIS Online在11月的更新,web map先已经支持矢量瓦片图层。作为更新的一部分,Esri已经提供了几种矢量地图,用户可以在webmap中使用。
几年以来,Esri一直提供图片格式的底图供用户使用,非常多用户在使用这些底图,但基于图片的底图有一些限制,例如用户无法自定义样式,对高分辨率设备支持不好等。因此Esri引入矢量切片的底图来解决这些问题。
矢量底图以矢量切片的方式提供,格式为pbf(MapBox定义),用户在客户端渲染数据。用户可以通过ArcGIS Pro 1.2来生成矢量切片。
随着ArcGIS Pro 1.2在2016年的发布,用户可以使用自己的数据生成矢量切片并托管到ArcGIS Server 10.4 或ArcGIS Online上。矢量底图目前只支持浏览器的渲染,将来会支持桌面的移动端设备,用户可以自定义样式来渲染矢量切片。

已经上线的矢量底图

目前已经上线的矢量底图使用同一个瓦片服务,但提供了8种样式,可以通过ArcGIS Online的Esri Vector Basemaps (Beta) 组来访问。 链接为:http://www.arcgis.com/home/group.html?id=30de8da907d240a0bccd5ad3ff25ef4a
矢量底图在Webmap中,既可以作为底图,也可以作为普通图层加载。
image

自定义矢量底图

用户可以自定义矢量底图的样式,通过编辑已经存在的矢量切片图层的样式文件,并重新发布的方式可以创建一个新的矢量切片图层。

重要提示

目前矢量底图处于Beta阶段,数据和样式文件的格式都有可能发生变化,因此用户创建的样式文件可能需要随之更新,请在项目中慎用。另外,和已经存在的底图一样,矢量底图对所有ArcGIS用户是免费使用的。

ArcGIS Leave a comment

高德位置纠偏服务

众所周知,国内地图都是经过偏移的数据,那么想要把用户自己的数据添加上去,必须通过偏移才可以。
目前高德提供了位置纠偏服务,但隐藏的比较深,在主页面上没有提供,在论坛中提供了相关API。
相关网址:http://lbsbbs.amap.com/forum.php?mod=viewthread&tid=724&highlight=%E5%9D%90%E6%A0%87%E8%BD%AC%E6%8D%A2

一.适用对象: 苦苦纠结于如何将GPS、mapbar、baidu坐标转换为高德坐标系的开发者们。

二.转换方法:

  1. 首先当然还是需要人手一个的百宝key。注意:权限君升级权限系统后,调用坐标转换接口的童鞋们需要重新申请。注意:绑定服务需选择web服务API:
2.      调用坐标转换接口,接口请求攻略如下:
1)  服务协议为GET请求
3)  请求参数:
名称
含义
规则说明
是否必须
key
用户唯一标识
官网申请,用户唯一标识
必填
locations
坐标点
经度和纬度用”,”分割,经度在前,纬度在后,经纬度小数点后不得超过6位。多个坐标点间用”;”进行分隔
必填
coordsys
原坐标系
可选值:gps;mapbar;baidu
请求坐标加密,返回加密结果。
必填
output
返回数据类型
可选值:json(默认),xml
可选
URL示例:
3.      通过简单的http请求,即可以愉快地完成坐标转换的任务。
gis Leave a comment